可視化D3.js庫(kù)(8)-做一個(gè)完整的柱狀圖

制作一個(gè)完整的柱狀圖

一個(gè)完整的柱狀圖應(yīng)該是包含坐標(biāo)軸、文字、矩形和標(biāo)題等。在本篇文章中將從數(shù)據(jù)定義、定義畫(huà)布和邊框、坐標(biāo)軸和比例尺的定義、矩形元素的屬性設(shè)置、字體的大小等各個(gè)方面進(jìn)行講解。

image

定義數(shù)據(jù)集

首先,定義我們將要用于描繪的數(shù)據(jù)集合。每個(gè)數(shù)據(jù)由name和value組成

image

定義畫(huà)布SVG

畫(huà)布的定義需要從svg元素中提取出來(lái)d3.select("#mainsvg")

然后再定義其寬和高,注意兩種定義的方法:一種是利用+號(hào)將字符串轉(zhuǎn)成數(shù)值型,一種是直接賦值

image

定義margin

定義margin的時(shí)候需要指定4個(gè)屬性:top、bottom、left、right。

image

定義兩種比例尺

橫軸是線性比例尺;縱軸是離散型的比例尺。注意兩種比例尺的映射范圍

image

定義分組元素g

image

定義兩個(gè)坐標(biāo)軸

坐標(biāo)軸定義的時(shí)候需要將比例尺傳進(jìn)來(lái)。一個(gè)是向左,一個(gè)向下

image

設(shè)置矩形元素的屬性

image

改變字體和設(shè)置標(biāo)題

image

源碼

<!DOCTYPE html>
<html>
  <head>
    <title>BarChart</title>
    <script type="text/javascript" src="http://d3js.org/d3.v5.min.js">
    </script>
    

  </head>
  
  <body>
    <svg width="1600" height="800" id="mainsvg" class="svgs"></svg>
    <script>
      // 1. 定義數(shù)據(jù)
      const data = [{name:"zhangsan",value:6}
                    ,{name:"lisi",value:17}
                    ,{name:"haozheng",value:27}
                    ,{name:"pidada",value:34}
                    ,{name:"zhouzheng",value:10}
                    ,{name:"peter",value:22}
                  ]

      // 2. 定義svg及其寬高
      const svg = d3.select("#mainsvg");  // 取出svg的id號(hào)
      const width = +svg.attr("width");  // + 表示將字符串轉(zhuǎn)成數(shù)值
      const height = 800;  // 比較兩種定義方法

      // 3. 定義margin:4個(gè)屬性
      // SVG指的是整個(gè)作畫(huà)的空間,定義了margin之后,將作畫(huà)空間控制在svg-margin之內(nèi)
      const margin = {top:60, right:30, left:100, bottom:60};
      const innerWidth = width - margin.left - margin.right;  // 整個(gè)畫(huà)布減去margin的左右兩邊
      const innerHeight = height - margin.top - margin.bottom;  // 整個(gè)畫(huà)布的高減去mrgin的上下

      // 4. 定義兩種比例尺:線性和離散型
      const xScale = d3.scaleLinear()
                        .domain([0,d3.max(data, d => d.value)])  // x軸上的取值是value
                        .range([0,innerWidth]);

      const yScale = d3.scaleBand()
                        .domain(data.map(d => d.name))   // y軸上的取值是名字name
                        .range([0,innerHeight])
                        .padding(0.1);  // 指定每個(gè)矩形的間隔

      // 5. 定義分組元素g
      const g = svg.append("g")
                    .attr("id","maingroup")
                    .attr("transform",`translate(${margin.left},${margin.top})`);
     
      // 6. 定義兩個(gè)坐標(biāo)軸,并且利用元素g進(jìn)行回調(diào)
      const yAxis = d3.axisLeft(yScale)
                        .tickSize(-innerWidth);
      g.append("g").call(yAxis);   // 通過(guò)分組元素g進(jìn)行回調(diào)
      
      const xAxis = d3.axisBottom(xScale);
      g.append("g").call(xAxis).attr("transform",`translate(0,${innerHeight})`);

      // 7. 每個(gè)矩形元素進(jìn)行屬性設(shè)置
      data.forEach(d => {
            g.append("rect")
              .attr("width",xScale(d.value))
              .attr("height",yScale.bandwidth())
              .attr("fill","green")
              .attr("opacity",0.8)  // 透明度
              .attr("y",yScale(d.name));
      })

      // 8. 改變y軸上的字體大小
      d3.selectAll(".tick text").attr("font-size","1.5em");

      // 9. 標(biāo)題設(shè)置
      g.append("text").text("bar-Chart")
              .attr("font-size","1.5em")
              .attr("transform",`translate(${innerWidth / 2}, 0)`)  // 字體最左邊居中
              .attr("text-anchor","middle");  // 字體居中     
    </script>
  </body>
</html>
image

效果圖

image-20200522005415359

</pre>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容