gpt4 book ai didi

javascript - 来自 JSON 的 D3.JS 分组圆环图

转载 作者:行者123 更新时间:2023-11-28 00:07:50 24 4
gpt4 key购买 nike

所以,我有 the following JSON data在我手上,我需要找到在 D3 中绘制圆环图的最佳方法。暂时忽略“信息”和“政治家”数组,严格关注“行业”数组,我想实现以下图表:

Pardon the 2-minute Photoshop...

请原谅 2 分钟的 Photoshop 工作...

基本上每条小黑线代表一个行业。每个行业都受到民主党、共和党和独立人士的影响(以美元计)。我想创建一个圆环图(或两个圆环图)以上面的方式除以是和否。

我已经尝试编写一些代码,但我仍在了解 D3,所以请多多包涵。该代码看起来像这样:

d3.json('mock2.json', function(errors, data) {
//Formatting of data
var yeas = [];
var nays = [];

for(var i = 0; i < data.industries.length; i++) {
var yea_temp = {};
var nay_temp = {};
var yea_c = data.industries[i].yea_contribution;
var nay_c = data.industries[i].nay_contribution;

yea_temp.name = data.industries[i].name;
yea_temp.influence = {"D": yea_c.d_influence, "R": yea_c.r_influence, "I": yea_c.i_influence};

nay_temp.name = data.industries[i].name;
nay_temp.influence = {"D": nay_c.d_influence, "R": nay_c.r_influence, "I": nay_c.i_influence};

yeas.push(yea_temp);
nays.push(nay_temp);
}

//Log the variables for console inspection
console.log(yeas);
console.log(nays);

//Declare variables
var width = 800,
height = 600,
radius = Math.min(width, height)/2;

var svg = d3.select('#graph').append('svg')
.attr('width', width)
.attr('height', height);

var group = svg.append('g')
.attr('transform', 'translate(300, 300)');

var arc = d3.svg.arc()
.innerRadius(200)
.outerRadius(radius);

var yea_pie = d3.layout.pie()
.value(function(d, i) {
if(i == 0)
return d.influence.D;
else if(i == 1)
return d.influence.I;
else
return d.influence.R;
})
.startAngle(-Math.PI/2)
.endAngle(Math.PI/2);

var color = d3.scale.ordinal()
.range(['rgba(92,188,239,0.5)', 'rgba(255,76,76,0.5)', 'rgba(150,163,170,0.5)']);

var yea_arcs = group.selectAll('.arc')
.data(yea_pie(yeas))
.enter()
.append('g')
.attr('class', 'arc')
.attr('class', function(d) { console.log(d); });

yea_arcs.append('path')
.attr('d', arc)
.attr('fill', function(d) { return color(d.data); });

到目前为止,我只在屏幕上呈现了一个蓝色的半圆,但它被分成了三个路径,所以至少我知道我在正确地循环。我如何根据影响分割(找不到更好的词)这些部分?

您会在我的代码的第一部分中注意到,我基本上采用了我收到的 JSON 并尝试将其格式化得更好一些,以便在 D3 中更容易。这是最佳做法吗?我觉得 D3 中可能有一些神奇的功能可以消除我所有的担忧,但我不知道有一个。大多数情况下,我只是在寻求一点指导(但代码肯定会更好!),所以我会尽力而为。

此外,here's a fiddle to play with如果您愿意这样做。

最佳答案

我想出了一种在 D3 中制作堆叠饼图的方法。我不完全确定这是否是“正确的”惯例,但它确实运作良好。 Here's a fiddle跟随。

我重组了我的 yeasnays 数组,在对象中指定第一层的数据值(这样,D3 可以正确循环),然后也包括派对和名字。以下是 yeas 数组的示例:

Yeas Array

本质上有两个数组,yeasnays,每个都有 9 个具有值的对象:valueparty名称。这样我就可以将任一数组的数据传递给 d3.layout.pie,并在该饼图布局 d.value 中给出 value。更简单地说,这里是解释的代码片段:

var yea_pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; }) //This computes a pie value for each yeas.value (d.value)
.startAngle(-Math.PI/2)
.endAngle(Math.PI/2);

var yeas_industry = yea_group.selectAll('.arc')
.data(yea_pie(yeas)) //Pass the yeas variable to yea_pie
.enter().append('g')
.attr('class', 'arc');

这确实是我见过的唯一制作堆叠饼图的解决方案。话虽如此,我会将此标记为正确的,但如果有人想到更好的方法,我会很想知道。

关于javascript - 来自 JSON 的 D3.JS 分组圆环图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17519168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com