UPD не по глазам было. У вас ошибка была - вы берёте width не от канваса, а от контекста. Обновил пример, старое удалил ))
Здесь исправленное https://jsfiddle.net/shpaker/hpLmuk23/
Valery Semenencko: совсем нет. Когда делаем getElementById то получаем обычный элемент страницы, каким например может быть что угодно, хоть просто кнопка и у них есть высота и ширина.
А когда мы делаем getContext - мы создаем контекст для рисования и через него рисуем. И риовать можем хоть за пределами видимого элемента. По умолчанию ширина и высота канваса, как я уже писал 300*150. Вот пример без явно указанных свойств https://jsfiddle.net/shpaker/hpLmuk23/3/