iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
Modern Web

資料視覺化!D3入門到實戰系列 第 8

Day8 比例與座標軸_利用比例實作座標軸(Axis)

  • 分享至 

  • xImage
  •  

在前一章我們順利的做出了第一個長條圖,但好像還缺點什麼呢?就是座標軸!沒有座標軸,光有一條一條的長方形哪裏知道代表的是多少?

於是這邊要應用到上一章所講的Scale來製作座標軸,D3同樣提供好用的function來讓我們能快速畫出來喔~

D3提供了四種不同的function給我們使用:

  • axisTop()
  • axisBottom()
  • axisLeft()
  • axisRight()

顧名思義就是分別在上下左右的座標軸,可以依據不同情況選擇使用。而在我們剛做出來的圖中,我們要加上的是左邊和上面的座標軸。

<svg width="600" height="400" style="border: 1px solid black"></svg>
<script src="http://d3js.org/d3.v5.min.js"></script>
<script>
  const data = [
    { value: 874, name: '1' },
    { value: 291, name: '2' },
    { value: 30, name: '3' },
    { value: 500, name: '4' },
    { value: 1000, name: '5' }
  ];

  const svg = d3
    .select('svg')
    .append('g')
    .attr('transform', 'scale(0.9)') //讓整個圖表向中間縮小,座標軸才不會被擋住
    .attr('transform-origin', 'center');

  const x = d3
    .scaleBand()
    .domain(data.map((e) => e.name))
    .range([0, 600])
    .paddingInner(0.3)
    .paddingOuter(0.3);

  const y = d3
    .scaleLinear()
    .domain([
      0,
      d3.max(data.map((e) => e.value))
    ])
    .range([0, 400]);

  //首先先定義好拿來產生座標軸的兩個function
  const xAxisCall = d3.axisTop(x);
  const yAxisCall = d3.axisLeft(y);
  
  //呼叫剛剛定義的function
  const xAxis = svg
    .append('g')
    .attr('class', 'x axis')
    .call(xAxisCall);
  const yAxis = svg
    .append('g')
    .attr('class', 'y axis')
    .call(yAxisCall);

  const rects = svg
    .selectAll('rect')
    .data(data)
    .enter()
    .append('rect')
    .attr('x', (d, i) => {
      return x(d.name);
    })
    .attr('width', x.bandwidth)
    .attr('height', (d, i) => {
      return y(d.value);
    })
    .attr('fill', 'black');
</script>


上一篇
Day7 比例與座標軸_理解D3中的比例(Scale)
下一篇
Day9 實戰!台灣各城市天氣概況_專案說明與準備
系列文
資料視覺化!D3入門到實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言