gpt4 book ai didi

javascript - 在 d3v4 堆叠条形图中使用 JSON

转载 作者:行者123 更新时间:2023-11-29 20:51:37 25 4
gpt4 key购买 nike

我找到了一个 d3v3 stacked bar chart example我想使用它,因为它使用 json 数据。

还有一个d3v4 canonical bar chart example加载并使用 csv。

我想制作一个 d3v4 堆叠条形图,但我想使用 json 数据来创建它而不是从 csv 加载。我不确定如何升级 v3 版本或修改 v4 版本来完成此操作。

这是我的数据结构:

[{
"hospitalName": "hospital1",
"category": "Injury & Poisoning",
"Females": "0",
"Males": "4",
"Unknown": "0",
"count": "4"
},
{
"hospitalName": "hospital1",
"category": "Symptoms, Signs, & Ill-Defined Conditions",
"Females": "1",
"Males": "1",
"Unknown": "0",
"count": "2"
},
{
"hospitalName": "hospital2",
"category": "Mental Disorders",
"Females": "0",
"Males": "1",
"Unknown": "0",
"count": "1"
}]

根据这两个示例,我如何在 d3v4 堆叠条形图中使用此数据?

最佳答案

如果要在升级适合您的数据源类型的 v3 示例和修改 v4 示例以采用 json 而不是 csv 数据之间进行选择,那么应该选择转换现有的规范 v4 示例。

d3.csv 将 csv 文件转换为 json。 d3.csv 创建的 json 看起来就像来自源 csv 的 json,其标题等于数据项的属性。所以这两个示例本质上使用相同的数据格式和结构。这就是使用 d3v4 示例更直接的原因。

要在 v4 示例中使用 json 数据而不是 csv 数据,您需要进行两处更改:

  1. 获取正确的列数据:

规范中的列使用 var keys = data.columns.slice(1); 来获取 csv 数据中的哪些列应该用矩形绘制。 columns 是由 d3.csv 添加到数据数组的属性,用于指定列标题。删除的值不是用矩形绘制的,而是标识堆栈,它可以是堆栈标签并用于 x 轴放置。由于列属性是由 d3.csv 添加的,我们需要一种稍微不同的方法。

在您的情况下,我们似乎想要从数据中获取男性、女性和未知数,并且每个组的结构如下所示:

{
"hospitalName": "hospital1",
"category": "Injury & Poisoning",
"Females": "0",
"Males": "4",
"Unknown": "0",
"count": "4"
}

所以我们可以通过稍微修改来获得键/属性(将用矩形绘制):

var columns = d3.keys(data[0]);  // get the properties of the first item in the data array
var keys = columns.slice(2,5); // extract keys with index 2,3,4. These will be the properties that are represented by rectangles in the chart.
  1. 计算同名的多个组/堆栈

由于大多数示例的比例将使用组名称,因此这些将不起作用。相反,我们需要为每个组提供独特的东西,索引可以很好地工作:

x.domain(data.map(function(d,i) { return i; }));

你需要稍微格式化刻度,这样你就不会得到索引作为标签,比方说:

d3.axisBottom(x).tickFormat(function(d,i) { return data[i].hospitalName })

将类别添加到打勾应该很容易。

  1. 修改总属性

是的,我说了两步,这太短了,不能保证完整的项目符号,但是包含三个项目的列表更好。原始规范使用 d.total,您的数据使用 d.count,用于确定 y 尺度的域。

总计:

<!DOCTYPE html>
<style>

.axis .domain {
display: none;
}

</style>
<svg width="600" height="200"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>

var svg = d3.select("svg"),
margin = {top: 20, right: 20, bottom: 30, left: 40},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom,
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var x = d3.scaleBand()
.rangeRound([0, width])
.paddingInner(0.05)
.align(0.1);

var y = d3.scaleLinear()
.rangeRound([height, 0]);

var z = d3.scaleOrdinal()
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var data = [{
"hospitalName": "hospital1",
"category": "Injury & Poisoning",
"Females": "0",
"Males": "4",
"Unknown": "0",
"count": "4"
},
{
"hospitalName": "hospital1",
"category": "Symptoms, Signs, & Ill-Defined Conditions",
"Females": "1",
"Males": "1",
"Unknown": "0",
"count": "2"
},
{
"hospitalName": "hospital2",
"category": "Mental Disorders",
"Females": "0",
"Males": "1",
"Unknown": "0",
"count": "1"
}]

var columns = d3.keys(data[0]);

var keys = columns.slice(2,5);

data.sort(function(a, b) { return b.total - a.total; });
x.domain(data.map(function(d,i) { return i; }));
y.domain([0, d3.max(data, function(d) { return d.count; })]).nice();
z.domain(keys);

g.append("g")
.selectAll("g")
.data(d3.stack().keys(keys)(data))
.enter().append("g")
.attr("fill", function(d) { return z(d.key); })
.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("x", function(d,i) { return x(i); })
.attr("y", function(d) { return y(d[1]); })
.attr("height", function(d) { return y(d[0]) - y(d[1]); })
.attr("width", x.bandwidth());

g.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).tickFormat(function(d,i) { return data[i].hospitalName}));

g.append("g")
.attr("class", "axis")
.call(d3.axisLeft(y).ticks(null, "s"))
.append("text")
.attr("x", 2)
.attr("y", y(y.ticks().pop()) + 0.5)
.attr("dy", "0.32em")
.attr("fill", "#000")
.attr("font-weight", "bold")
.attr("text-anchor", "start")
.text("Population");

var legend = g.append("g")
.attr("font-family", "sans-serif")
.attr("font-size", 10)
.attr("text-anchor", "end")
.selectAll("g")
.data(keys.slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

legend.append("rect")
.attr("x", width - 19)
.attr("width", 19)
.attr("height", 19)
.attr("fill", z);

legend.append("text")
.attr("x", width - 24)
.attr("y", 9.5)
.attr("dy", "0.32em")
.text(function(d) { return d; });


</script>

如果你想使用 d3.json,那么你可以使用:

d3.json("json.json", function(error,data) {
if(error) throw error;

// Parts that use the data here.

})

关于javascript - 在 d3v4 堆叠条形图中使用 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51565900/

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