d3.js - 关于如何从我在 d3 中的数据生成饼图的困惑
问题描述
嗨,我一直在查看 d3 中的饼图生成,我发现大部分数据集都类似于
数据=[{等级:“A”,编号:20},{等级:“B”,编号:12},{等级:“C”,编号:15}];
但我有这样的数据:
数据=[域1:0,域2:1,域3:0,域4:1,域5:0,域6:1];
我想将其表示为饼图,其中 50% 被 domain2 占用,另外 50% 被 domain4 占用,即。对于域中的每个人 1 个条目,我希望它成为饼图的一部分。
但我不确定如何在这种情况下使用 d3 的 Pie 函数,所以有什么建议吗?非常感谢你的帮助。
解决方案
您只需要将数据转换为适当的格式以d3.pie
供使用。您的数据已经是某种对象类型格式:
var input = { domain1: 10, domain2: 3, domain3: 6, domain4: 8, domain5: 12, domain6: 13 };
要将它与 d3.pie 一起使用,您需要一个数组或对象数组。在这种情况下,对象数组可能是最简单的:
var data = Object.keys(input).map( function(d) { return {name: d, value: input[d]}; } );
这会将您的原始输入转换为表单的数组
[{ name: 'domain1', value: 10 }, { name: 'domain2', value: 3 }, ...
d3.pie的文档包含有关配置选项的完整详细信息,但对于基本图表,只需设置访问器,以便 d3.pie 知道从哪里获取每个饼图的值:
var pie = d3.pie()
.value(function(d) { return d.value; });
然后你需要打电话
pie(data)
生成适当的饼图布局。
这是一个示例,其中插入了一些标准饼图代码的数据版本稍微有趣一些:
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
radius = Math.min(width, height) / 2,
g = svg.append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var color = d3.scaleOrdinal(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c"]);
var pie = d3.pie()
.sort(null)
.value(function(d) { return d.value; });
var path = d3.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var label = d3.arc()
.outerRadius(radius - 40)
.innerRadius(radius - 40);
var input = { domain1: 10, domain2: 3, domain3: 6, domain4: 8, domain5: 12, domain6: 13 };
var data = Object.keys(input).map( function(d) { return {name: d, value: input[d]}; } );
var arc = g.selectAll(".arc")
.data( pie(data))
.enter().append("g")
.attr("class", "arc");
arc.append("path")
.attr("d", path)
.attr("fill", function(d) { return color(d.data.name); });
arc.append("text")
.attr("transform", function(d) { return "translate(" + label.centroid(d) + ")"; })
.attr("dy", "0.35em")
.text(function(d) { return d.data.name; });
.arc text {
font: 10px sans-serif;
text-anchor: middle;
}
.arc path {
stroke: #fff;
}
<svg width="960" height="500"></svg>
<script src="https://d3js.org/d3.v5.min.js"></script>
推荐阅读
- java - 我不熟悉使用 IntelliJ IDEA for Java。我注意到我的一些字在输入时不会变灰
- google-meet - 向 Google Meets 群组中的某人发送私信
- julia - Julia 和 Matlab 之间的模数语句结果不同——在 Julia 中使用浮点数时避免舍入错误的最佳实践?
- r - 来自 read_excel 函数的警告
- python - 如何获取有关当前悬停状态的数据?Plotly Choropleth - 美国地图
- javascript - 如何一次向 URL 添加多个参数
- go - 有没有一种方法可以以一种不易出错的方式声明我的预加载
- flutter - 如何去除 Flutter 中资产视频底部的绿线?
- java - " 使用带有 null 的 switchCase"
- r - 当列相互依赖时如何计算R数据框中的值