一步一步去實(shí)現(xiàn)一個(gè)折線圖

有這么個(gè)折線圖,如下所示


image.png

應(yīng)該怎么去實(shí)現(xiàn)它呢丧没,我在這個(gè)demo中分了兩步们拙,分別為畫(huà)坐標(biāo)軸和畫(huà)折線圖

1.畫(huà)坐標(biāo)圖

坐標(biāo)分為縱坐標(biāo)和橫坐標(biāo),我們先來(lái)定義一下坐標(biāo)原點(diǎn)劫瞳,默認(rèn)情況下倘潜,坐標(biāo)原點(diǎn)位于canvas的左上角,即(0志于,0)的位置涮因,如果我們以這個(gè)點(diǎn)來(lái)畫(huà)坐標(biāo),其實(shí)也可以伺绽,但是不太符合我們一般的邏輯思維蕊退,一般我們都是從左下角開(kāi)始畫(huà),所以我們需要通過(guò)使用translate變換坐標(biāo)的原點(diǎn)憔恳,如下

  ctx.translate(40, 500)

把坐標(biāo)原點(diǎn)移到了距左40px的地方瓤荔,距頂500px的地方,然后我們?cè)購(gòu)倪@個(gè)點(diǎn)開(kāi)始畫(huà)钥组,首先输硝,畫(huà)出縱坐標(biāo),此時(shí)只需要把畫(huà)筆移到當(dāng)前坐標(biāo)的(0程梦,0)位置点把,然后向上畫(huà)一條豎線,再畫(huà)一下左邊的箭頭屿附,再畫(huà)一下右邊的箭頭郎逃,即可,代碼如下

  // 畫(huà)y軸
  ctx.moveTo(0, 0)
  ctx.lineTo(0, -yaxisLength)
  // y軸左邊箭頭
  ctx.moveTo(0, -yaxisLength)
  ctx.lineTo(-arrowLength, -(yaxisLength - arrowLength))
  // y軸右邊箭頭
  ctx.moveTo(0, -yaxisLength)
  ctx.lineTo(arrowLength, -(yaxisLength - arrowLength))

接下來(lái)畫(huà)橫坐標(biāo)挺份,原理和畫(huà)縱坐標(biāo)一樣褒翰,直接上代碼吧

  // 畫(huà)x軸
  ctx.moveTo(0, 0)
  ctx.lineTo(xaxisLength, 0)
  // x軸上邊箭頭
  ctx.moveTo(xaxisLength, 0)
  ctx.lineTo(xaxisLength - arrowLength, -arrowLength)
  // x軸下邊箭頭
  ctx.moveTo(xaxisLength, 0)
  ctx.lineTo(xaxisLength - arrowLength, arrowLength)
  ctx.stroke()

這樣就把坐標(biāo)畫(huà)好了,接下來(lái)我們畫(huà)折線

2.畫(huà)折線

首先匀泊,我們需要數(shù)據(jù)优训,定義了一個(gè)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)

var data = [{
      value: 120,
      title: '第一季度'
    },
    {
      value: 50,
      title: '第二季度'
    },
    {
      value: 100,
      title: '第三季度'
    },
    {
      value: 60,
      title: '第四季度'
    }
  ]
  data.unshift({
    value: 0,
    title: ''
  })

如果組件化了,用戶(hù)肯定是傳的有效數(shù)據(jù)各聘,我在第一項(xiàng)加了個(gè)0的值揣非,也僅僅是為了邏輯處理,此處不用在乎躲因,接下來(lái)早敬,肯定是要遍歷這個(gè)數(shù)組忌傻,然后畫(huà)出折線,這里簡(jiǎn)單的處理就是搞监,每次畫(huà)筆移到上一次點(diǎn)的位置芯勘,然后再畫(huà)一條線到當(dāng)前位置即可,還是上源碼

  ctx.font = '20px Arial'
  for (var i = 1, len = data.length; i < len; i++) {
    ctx.moveTo(interval * (i - 1), -data[i - 1].value)
    ctx.lineTo(interval * i, -data[i].value)
    var y = -data[i].value - 20
    if (i != len - 1 && data[i].value < data[i + 1].value) {
      y = -data[i].value + 20
    }
    ctx.fillText(`${data[i].title}(${data[i].value})`, interval * i - 20, y)
  }
  ctx.stroke()

這樣就簡(jiǎn)單地實(shí)現(xiàn)了一個(gè)折線圖腺逛,但是實(shí)際中肯定不止這么簡(jiǎn)單荷愕,肯定要炫,這里暫時(shí)就不展開(kāi)了棍矛,可以關(guān)注我的github安疗,代碼會(huì)不定期更新

qa:假如要給線條加上顏色,應(yīng)該怎么實(shí)現(xiàn)呢够委,就像下面這樣


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荐类,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茁帽,更是在濱河造成了極大的恐慌玉罐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潘拨,死亡現(xiàn)場(chǎng)離奇詭異吊输,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铁追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)季蚂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琅束,你說(shuō)我怎么就攤上這事扭屁。” “怎么了涩禀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵料滥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我艾船,道長(zhǎng)葵腹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任丽声,我火速辦了婚禮礁蔗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雁社。我一直安慰自己,他們只是感情好晒骇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布霉撵。 她就那樣靜靜地躺著磺浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徒坡。 梳的紋絲不亂的頭發(fā)上撕氧,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音喇完,去河邊找鬼伦泥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锦溪,可吹牛的內(nèi)容都是我干的不脯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刻诊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼防楷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起则涯,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤复局,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粟判,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體亿昏,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年档礁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龙优。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事秀,死狀恐怖彤断,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情易迹,我是刑警寧澤宰衙,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站睹欲,受9級(jí)特大地震影響供炼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窘疮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一袋哼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闸衫,春花似錦涛贯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虫腋。三九已至,卻和暖如春稀余,著一層夾襖步出監(jiān)牢的瞬間悦冀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工睛琳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒蟆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓师骗,卻偏偏與公主長(zhǎng)得像历等,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丧凤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容