gpt4 book ai didi

javascript - 使用 2 级嵌套 JSON 创建带点的 D3 线图

转载 作者:行者123 更新时间:2023-11-29 15:22:39 25 4
gpt4 key购买 nike

对于我的生活,我似乎找不到如何处理这个问题的明确答案。当然,我对 javascript 和 D3 还是很陌生,但我找不到任何好的例子。

我目前正在尝试创建一个带点的 D3 多线图。我在平面 JSON 文件方面取得了相当不错的成功,但是当我的 JSON 数据被修改以添加额外的嵌套层时,我真的开始挣扎了。

我的 JSON 数据文件现在看起来像这样:

{
"Model": "Model A",
"Data": [
{
"Metric": "Metric 1",
"Data": [
{"Date":"2017-2-25", "Value": "34"},
{"Date":"2017-2-26", "Value": "52"},
{"Date":"2017-2-27", "Value": "47"},
{"Date":"2017-2-28", "Value": "50"}
]
},
{
"Metric": "Metric 2",
"Data": [
{"Date":"2017-2-25", "Value": "22"},
{"Date":"2017-2-26", "Value": "27"},
{"Date":"2017-2-27", "Value": "25"},
{"Date":"2017-2-28", "Value": "21"}
]
},
{
"Metric": "Metric 3",
"Data": [
{"Date":"2017-2-25", "Value": "27"},
{"Date":"2017-2-26", "Value": "28"},
{"Date":"2017-2-27", "Value": "25"},
{"Date":"2017-2-28", "Value": "22"}
]
}
]
}

添加了这个额外的嵌套层,以便我可以按模型和指标进行过滤。

假设我的 JSON 文件中没有多个“模型”(因此完全按照上面代码片段中的 JSON 格式)。如何有效地绘制每个指标的 ValueDate(多线图)?如果有人也能指出一些工作示例,那将是一个不可思议的帮助!

最佳答案

鉴于您的数据结构,一个可能的解决方案是将数据(特别是外部 Data 数组)绑定(bind)到组:

var groups = svg.selectAll("foo")
.data(data.Data)
.enter()
.append("g");

并使用每个内部 Data 数组作为每一行的数据:

var lines = groups.append("path")
.attr("d", d => lineGen(d.Data))
.attr("fill", "none")
.attr("stroke", (d, i) => colors(i));

这是一个使用您的数据对象的演示:

var data = {
"Model": "Model A",
"Data": [{
"Metric": "Metric 1",
"Data": [{
"Date": "2017-2-25",
"Value": "34"
}, {
"Date": "2017-2-26",
"Value": "52"
}, {
"Date": "2017-2-27",
"Value": "47"
}, {
"Date": "2017-2-28",
"Value": "50"
}]
}, {
"Metric": "Metric 2",
"Data": [{
"Date": "2017-2-25",
"Value": "22"
}, {
"Date": "2017-2-26",
"Value": "27"
}, {
"Date": "2017-2-27",
"Value": "25"
}, {
"Date": "2017-2-28",
"Value": "21"
}]
}, {
"Metric": "Metric 3",
"Data": [{
"Date": "2017-2-25",
"Value": "27"
}, {
"Date": "2017-2-26",
"Value": "28"
}, {
"Date": "2017-2-27",
"Value": "25"
}, {
"Date": "2017-2-28",
"Value": "22"
}]
}]
};

var width = 500,
height = 300;

var colors = d3.scaleOrdinal(d3.schemeCategory10);

var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);

var parse = d3.timeParse("%Y-%m-%d");

var xScale = d3.scaleTime()
.range([30, width - 20])
.domain(d3.extent(data.Data[0].Data, d => parse(d.Date)));

var yScale = d3.scaleLinear()
.range([height - 20, 20])
.domain([0, 60]);

var lineGen = d3.line()
.x(d => xScale(parse(d.Date)))
.y(d => yScale(d.Value));

var groups = svg.selectAll("foo")
.data(data.Data)
.enter()
.append("g");

var lines = groups.append("path")
.attr("d", d => lineGen(d.Data))
.attr("fill", "none")
.attr("stroke", (d, i) => colors(i));

var gX = svg.append("g").attr("transform", "translate(0," + (height - 20) + ")").call(d3.axisBottom(xScale));

var gY = svg.append("g").attr("transform", "translate(30,0)").call(d3.axisLeft(yScale));
<script src="https://d3js.org/d3.v4.min.js"></script>

关于javascript - 使用 2 级嵌套 JSON 创建带点的 D3 线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42476813/

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