D3.js實現(xiàn)餅圖,環(huán)圖,玫瑰圖的繪制
餅圖和之前介紹的柱狀圖和折線圖不同,不存在坐標系,也就不會有比例尺的映射。在折線圖的介紹中,我們提到了d3提供了一些圖形構(gòu)造器
并了解了一下d3.line
以及d3.area
,而餅圖會用到另外倆個構(gòu)造方法d3.pie
和d3.arc
。
d3.pie
d3.pie
為給定的數(shù)據(jù)生成一個餅圖,返回一個包含每個數(shù)據(jù)對應(yīng)的弧角的對象數(shù)組。
const data = [ { name: "外包", value: 3000 }, { name: "金融", value: 4754 }, { name: "制造", value: 1120 }, { name: "咨詢", value: 4032 } ]; const pieData = d3.pie().value((d) => d.value)(data) console.log(pieData)
data
- 當前數(shù)據(jù)value
- 數(shù)據(jù)對應(yīng)的值index
- 弧從零開始的排序索引startAngle
- 開始弧度endAngle
- 結(jié)束弧度padAngle
- 每個弧形間的間距(弧度)
對于對象數(shù)組需要通過value
屬性,指定取值對象。也可以通過sort
對數(shù)據(jù)進行排序.
d3.area
const arc = d3.arc() .innerRadius(0) .outerRadius(100) .startAngle(0) .endAngle(Math.PI / 2); arc(); // "M0,-100A100,100,0,0,1,100,0L0,0Z"
innerRadius
- 內(nèi)邊距outerRadius
- 外邊距startAngle
- 開始弧度startAngle
- 結(jié)束弧度padAngle
- 每個弧形間的間距(弧度)
對比d3.pie返回的數(shù)據(jù)和d3.area的屬性,就可以發(fā)現(xiàn)它們是天生的一對,就該成對出現(xiàn)。
餅圖
了解了de.pie
和d3.arc
,我們就可以輕松的繪制出餅圖了。 點擊查看Demo!
const pieData = d3.pie() .value((d) => d.value) .sort((a, b) => a.value - b.value)(data); const arc = d3.arc().innerRadius(0).outerRadius(100); const color = d3.scaleOrdinal(d3.schemeCategory10); const arcGroup = svg.append("g") .attr("transform", "translate(300, 300)") .selectAll("path") .data(pieData); arcGroup.join("path") .attr("fill", (d, i) => color(i)) .attr("d", arc);
這里加了文字說明,本章不做介紹,大家可以查看Demo了解,需要注意一點的是弧度與角度的轉(zhuǎn)換:角度 = 弧度 * 180 / Math.PI
。
環(huán)圖
環(huán)圖很簡單,加上內(nèi)邊距就變成了環(huán)圖:
const arc = d3.arc().innerRadius(30).outerRadius(100);
玫瑰圖
玫瑰圖就是餅圖的一種變形,每個數(shù)據(jù)根據(jù)數(shù)值的大小,環(huán)形的半徑不一樣,也就是outerRadius
是動態(tài)設(shè)置的。
const allCount = data.reduce((pre, cur) => pre + cur.value, 0); const roseArc = d3.arc() .innerRadius(0) .outerRadius((d) => { return (d.value / allCount) * 100 + 100; });
還可以加一個圓角效果:
const roseArc = d3.arc() .innerRadius(0) .outerRadius((d) => { return (d.value / allCount) * 100 + 100; }) .cornerRadius(16); // 圓角
總結(jié)
總的來說餅圖的實現(xiàn)比較簡單,通過d3.pie
處理數(shù)據(jù),構(gòu)造出包含開始、結(jié)束弧度的數(shù)據(jù),再通過d3.arc
構(gòu)建一個圓弧的path
,就可以繪制出整個餅圖,環(huán)圖和玫瑰圖也只是基于餅圖的一個變形。
到此這篇關(guān)于D3.js實現(xiàn)餅圖,環(huán)圖,玫瑰圖的繪制的文章就介紹到這了,更多相關(guān)D3.js繪制餅圖 環(huán)圖 玫瑰圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BootStrap 智能表單實戰(zhàn)系列(二)BootStrap支持的類型簡介
這篇文章主要介紹了BootStrap 智能表單實戰(zhàn)系列(二)BootStrap支持的類型簡介 的相關(guān)資料,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習吧2016-06-06javascript實現(xiàn)頁面內(nèi)關(guān)鍵詞高亮顯示代碼
關(guān)鍵詞高亮想必大家對它都不陌生吧,應(yīng)用也比較廣泛的,下面為大家介紹下通過javascript是如何實現(xiàn)頁面內(nèi)關(guān)鍵詞高亮顯示2014-04-04JavaScript編碼風格精選指南(編寫可維護的代碼規(guī)范)
javascript編碼規(guī)范能夠增強代碼的簡潔性、可讀性、可擴展性,項目做到后期,每修改一次,所耗費的成本就越高,編碼規(guī)范能節(jié)省這樣的成本,并且能很好拓展升級原有系統(tǒng)功能,javascript編碼規(guī)范也是開源社區(qū)大家約定俗成的規(guī)則!2024-06-06使用JavaScript解決網(wǎng)頁圖片拉伸問題(推薦)
本文給大家介紹使用javascript解決網(wǎng)頁圖片拉伸問題,本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧2016-11-11javascript getElementsByClassName函數(shù)
今天在腳本中應(yīng)用到了根據(jù)類名取元素的方法,卻對其效率不甚滿意。于是,小幅修改了其探測元素類名的方法,提升了約3成的效率.2010-04-04