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)資料,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧2016-06-06
javascript實現(xiàn)頁面內(nèi)關(guān)鍵詞高亮顯示代碼
關(guān)鍵詞高亮想必大家對它都不陌生吧,應(yīng)用也比較廣泛的,下面為大家介紹下通過javascript是如何實現(xiàn)頁面內(nèi)關(guān)鍵詞高亮顯示2014-04-04
JavaScript編碼風格精選指南(編寫可維護的代碼規(guī)范)
javascript編碼規(guī)范能夠增強代碼的簡潔性、可讀性、可擴展性,項目做到后期,每修改一次,所耗費的成本就越高,編碼規(guī)范能節(jié)省這樣的成本,并且能很好拓展升級原有系統(tǒng)功能,javascript編碼規(guī)范也是開源社區(qū)大家約定俗成的規(guī)則!2024-06-06
使用JavaScript解決網(wǎng)頁圖片拉伸問題(推薦)
本文給大家介紹使用javascript解決網(wǎng)頁圖片拉伸問題,本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧2016-11-11
javascript getElementsByClassName函數(shù)
今天在腳本中應(yīng)用到了根據(jù)類名取元素的方法,卻對其效率不甚滿意。于是,小幅修改了其探測元素類名的方法,提升了約3成的效率.2010-04-04

