iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0

這次相比長條圖使用多一點的資料,陣列如下並且一樣先宣告svg變數繪製一個寬800高450的畫布

const ary = [130,45,239,20,30,246,72];
const svg = d3.select("body")
    .append("svg")
    .attr("width",800)
    .attr("height",450);

我們先繪製折線圖上面的點與上一個長條圖的概念類似只不過這次X取的位置是起始點設為30然後間距設為40,一樣使用for迴圈繪製程式碼如下

for (let i = 0; i <ary.length;i++){
    svg.append("circle")
    .attr("cx",30+40*i)
    .attr("cy",450-ary[i])
    .attr("r",3)
    .attr("fill","green");
 }

此時你會看到的圖應該是長這樣
https://ithelp.ithome.com.tw/upload/images/20210921/20125095Pi8cjLfrzj.png

從畫布的最下方開始往上到點的垂直距離會表現出陣列當中的數值

接下來我們要加入線

我們可以嘗試著先加入一條線試試看,起始位置從最左下方開始
加入在for迴圈外面

 svg.append("line")
    .attr("x1",0)
    .attr("y1",450)
    .attr("x2",30)
    .attr("y2",450-130)
    .style("stroke","black")
    .style("stroke-width","1px");

起始點x1是0而最下方的點就是畫布的高,因此y1是450
然後對應到第一個點的位置x是30、y是450-130也就是減去陣列的第一個數值所以x2是30、y2是320。
會看到圖長這樣
https://ithelp.ithome.com.tw/upload/images/20210921/20125095SlVslnJIqa.png

我們嘗試著畫第二條線來觀察這中間有什麼規則

 svg.append("line")
  .attr("x1",30)
  .attr("y1",450-130)
  .attr("x2",30+40)
  .attr("y2",450-45)
  .style("stroke","black")
  .style("stroke-width","1px");

這時候圖片會長類似這樣
https://ithelp.ithome.com.tw/upload/images/20210921/20125095Ejar3hrDz5.png
然後我們會發現線段x1和y1的起始位置是來自於上一個點,第一條線段的起始位置是0跟450,x2和y2是當前的點位置
所以我們可以先宣告一個lastX和lastY並且給定初始值並且在for迴圈繪製線段完之後將lastX和lastY表示當前的點的位置加入進去,最後在for迴圈判斷是不是跑最後一圈,做為線斷結束到0的位置

程式碼如下

let ary = [130,45,239,20,30,246,72];
let svg = d3.select("body")
            .append("svg")
            .attr("width",800)
            .attr("height",450);
let lastX=0;
let lastY=450;

for (let i = 0; i <ary.length;i++){
  svg.append("circle")
  .attr("cx",30+40*i)
  .attr("cy",450-ary[i])
  .attr("r",3)
  .attr("fill","green");

  svg.append("line")
      .attr("x1",lastX)
      .attr("y1",lastY)
      .attr("x2",30+40*i)
      .attr("y2",450-ary[i])
      .style("stroke","black")
      .style("stroke-width","1px");
  lastX =30+40*i;
  lastY = 450-ary[i];
  
  if(i==ary.length-1){
      svg.append("line")
      .attr("x1",lastX)
      .attr("y1",lastY)
      .attr("x2",30+40*(i+1))
      .attr("y2",450)
      .style("stroke","black")
      .style("stroke-width","1px");
  lastX =30+40*i;
  lastY = 450-ary[i];
  }
}

繪製完成圖片大概會長這樣
https://ithelp.ithome.com.tw/upload/images/20210921/201250956uIEbCwYff.png

以上就是折線圖的簡單撰寫方式,如果要加入文字的話可以參考上一篇長條圖。


上一篇
D3JsDay05Bar拉BarBarBar,作伙來畫吧—畫個bar chart長條圖
下一篇
D3JsDay07不懂資料格式,那就會我們曾相識,只是不合適—檔案格式介紹
系列文
從原料到燃料,從資料到預料—資料駕馭網頁之理科的美學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言