d3js 绘制未定义的折线图是不可迭代的
d3js plotting linecharts undefined is not iterable
我正在学习 d3js
,我在创建折线图方面需要帮助。我在绘制简单对象和条形图方面相当成功。折线图似乎是一座陡峭的山坡。
const data = [{
"LINE1": [
10,
11,
12,
15
]
},
{
"LINE2": [
21,
22,
23,
32
]
},
{
"LINE3": [
11,
12,
13,
15
]
}
]
// set the dimensions and margins of the graph
var margin = {
top: 50,
right: 100,
bottom: 130,
left: 120
},
width = 900 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select("#ca")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
// Add X axis
var x = d3.scaleLinear()
.domain(d3.extent(data, (d) => d.length))
.range([0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).ticks(5));
// Add Y axis
// I need help in this area, how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
.domain([0, d3.max(data, (d) => d.values)])
.range([height, 0]);
svg.append("g")
.call(d3.axisLeft(y));
// Draw the line
// I need help in this area, how can I get the lines plotted, js gives error in this!
svg.selectAll(".line")
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("d", (d) => {
console.log(d)
var k = d3.line()
.x((d) => x(d))
.y((d) => y(d))
(d.values);
console.log(k);
return k;
});
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>
如何使用我拥有的数据格式绘制折线图?
我已经使您的示例生效,但您需要了解以下几点:
你的数据结构非常混乱。如果要将对象数组作为数据,请确保所有对象都具有相同的键。如果使用 [{y: [...]}, {y: [...]}]
没问题,但是 [{LINE1: [...]}, {LINE2: [...]}]
很难使用。我将您的数据更改为更像 [[...], [...], [...]]
的结构。
不要为每一行创建一个单独的d3.line
,只需创建一次并调用它。它是一个线工厂,这意味着它是一个函数,当被调用时,returns 一条线。如果不共享,它可能会使用不同的域和范围,使图表变得困难甚至无用。
如果函数中的第一个参数是d
,第二个参数是i
,即数组中节点的索引。在本例中,您使用它从 x=0
开始,然后转到 x=3
。您使用 d
尝试获取该值。
记住数据的结构。您一直想访问 d.values
,但那根本不存在!
const data = Object.values({
"LINE1": [
10,
11,
12,
15
],
"LINE2": [
21,
22,
23,
32
],
"LINE3": [
11,
12,
13,
15
]
});
var line = d3.line()
.x((d, i) => x(i))
.y((d) => y(d));
// set the dimensions and margins of the graph
var margin = {
top: 50,
right: 100,
bottom: 130,
left: 120
},
width = 900 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select("#ca")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
// Add X axis
var x = d3.scaleLinear()
.domain([0, d3.max(data, (d) => d.length)])
.range([0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).ticks(5));
// Add Y axis
// I need help in this area, how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
.domain([0, d3.max(data, (d) => Math.max(...d))])
.range([height, 0]);
svg.append("g")
.call(d3.axisLeft(y));
// Draw the line
// I need help in this area, how can I get the lines plotted, js gives error in this!
svg.selectAll(".line")
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("d", (d) => line(d));
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>
我正在学习 d3js
,我在创建折线图方面需要帮助。我在绘制简单对象和条形图方面相当成功。折线图似乎是一座陡峭的山坡。
const data = [{
"LINE1": [
10,
11,
12,
15
]
},
{
"LINE2": [
21,
22,
23,
32
]
},
{
"LINE3": [
11,
12,
13,
15
]
}
]
// set the dimensions and margins of the graph
var margin = {
top: 50,
right: 100,
bottom: 130,
left: 120
},
width = 900 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select("#ca")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
// Add X axis
var x = d3.scaleLinear()
.domain(d3.extent(data, (d) => d.length))
.range([0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).ticks(5));
// Add Y axis
// I need help in this area, how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
.domain([0, d3.max(data, (d) => d.values)])
.range([height, 0]);
svg.append("g")
.call(d3.axisLeft(y));
// Draw the line
// I need help in this area, how can I get the lines plotted, js gives error in this!
svg.selectAll(".line")
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("d", (d) => {
console.log(d)
var k = d3.line()
.x((d) => x(d))
.y((d) => y(d))
(d.values);
console.log(k);
return k;
});
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>
如何使用我拥有的数据格式绘制折线图?
我已经使您的示例生效,但您需要了解以下几点:
你的数据结构非常混乱。如果要将对象数组作为数据,请确保所有对象都具有相同的键。如果使用
[{y: [...]}, {y: [...]}]
没问题,但是[{LINE1: [...]}, {LINE2: [...]}]
很难使用。我将您的数据更改为更像[[...], [...], [...]]
的结构。不要为每一行创建一个单独的
d3.line
,只需创建一次并调用它。它是一个线工厂,这意味着它是一个函数,当被调用时,returns 一条线。如果不共享,它可能会使用不同的域和范围,使图表变得困难甚至无用。如果函数中的第一个参数是
d
,第二个参数是i
,即数组中节点的索引。在本例中,您使用它从x=0
开始,然后转到x=3
。您使用d
尝试获取该值。记住数据的结构。您一直想访问
d.values
,但那根本不存在!
const data = Object.values({
"LINE1": [
10,
11,
12,
15
],
"LINE2": [
21,
22,
23,
32
],
"LINE3": [
11,
12,
13,
15
]
});
var line = d3.line()
.x((d, i) => x(i))
.y((d) => y(d));
// set the dimensions and margins of the graph
var margin = {
top: 50,
right: 100,
bottom: 130,
left: 120
},
width = 900 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select("#ca")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
// Add X axis
var x = d3.scaleLinear()
.domain([0, d3.max(data, (d) => d.length)])
.range([0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).ticks(5));
// Add Y axis
// I need help in this area, how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
.domain([0, d3.max(data, (d) => Math.max(...d))])
.range([height, 0]);
svg.append("g")
.call(d3.axisLeft(y));
// Draw the line
// I need help in this area, how can I get the lines plotted, js gives error in this!
svg.selectAll(".line")
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("d", (d) => line(d));
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>