我有一个看起来像这样的JSON文件:
编辑:我使用日期作为键,而不是以前键入的整数。
"2005-12-01": 120,
"2005-10-01": 32,
现在,我需要将第一列用作X轴,将另一列用作Y轴。 在示例中,它们通过元素名称引用值,例如:
const line = d3.line()
.x(d => x(d.date))
.y(d => y(d.value));
在这里我不能做。
答案 0 :(得分:2)
您必须将键映射到具有键/值对的对象数组,然后使用它来设置域并画线。
// The number of datapoints
var json = {
"2005-12-01": 120,
"2005-10-01": 32,
"2005-08-01": 20,
"2005-06-01": 123
};
var data = Object.keys(json).map(function (k) {
return {date: new Date(k), value: +json[k]};
});
其余代码与绘制简单折线图相同。
我使用问题中的JSON作为输入数据,创建了d3折线图示例的分支。 (除数据映射外几乎无需更改任何行)
<!DOCTYPE html>
<meta charset="utf-8">
<style type="text/css">
.line {
fill: none;
stroke: #ffab00;
stroke-width: 3;
}
</style>
<body>
</body>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
// 2. Use the margin convention practice
var margin = {top: 50, right: 50, bottom: 50, left: 50}
, width = window.innerWidth - margin.left - margin.right // Use the window's width
, height = window.innerHeight - margin.top - margin.bottom; // Use the window's height
// The number of datapoints
var json = {
"2005-12-01": 120,
"2005-10-01": 32,
"2005-08-01": 20,
"2005-06-01": 123
};
var data = Object.keys(json).map(function (k) { return {date: new Date(k), value: +json[k]};});
// 5. X scale will use the index of our data
var xScale = d3.scaleTime()
.domain(d3.extent(data, d => d.date)) // input
.range([0, width]); // output
// 6. Y scale will use the randomly generate number
var yScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.value)) // input
.range([height, 0]); // output
// 7. d3's line generator
var line = d3.line()
.x(function(d, i) { return xScale(d.date); }) // set the x values for the line generator
.y(function(d) { return yScale(d.value); }) // set the y values for the line generator
.curve(d3.curveMonotoneX) // apply smoothing to the line
// 1. Add the SVG to the page and employ #2
var svg = d3.select("body").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 + ")");
// 3. Call the x axis in a group tag
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale)); // Create an axis component with d3.axisBottom
// 4. Call the y axis in a group tag
svg.append("g")
.attr("class", "y axis")
.call(d3.axisLeft(yScale)); // Create an axis component with d3.axisLeft
// 9. Append the path, bind the data, and call the line generator
svg.append("path")
.datum(data) // 10. Binds data to the line
.attr("class", "line") // Assign a class for styling
.attr("d", line); // 11. Calls the line generator
</script>
答案 1 :(得分:0)
遍历JSON键并创建新对象
data = Object.keys(data).map(k => { return {x:+k, value: data[k]}; });
也许您需要对数组进行排序
data.sort( (a,b) => a.x - b.x );
var data = {"0": 120,
"1": 32,
"2": 234,
"3": 43};
data = Object.keys(data).map(k => { return {x:+k, value: data[k]}; });
console.log(data);