gpt4 book ai didi

json - 如何使用 d3 使用 JSON 数组

转载 作者:行者123 更新时间:2023-12-04 05:10:46 26 4
gpt4 key购买 nike

我是 d3 和 json 的新手。我正在尝试构建一个水平甘特图。早些时候,我使用存储在 var 数据集中的内联数组实现了相同的功能。但是现在我已经用 json object array 替换了数组。

[   {
"process" :"process-name 1",
"stage" : "stage name 1",
"activities": [
{
"activity_name": "waiting",
"start": new Date('2012-12-10T06:45+05:30'),
"end": new Date('2012-10-10T08:45+05:30'),
},
{
"activity_name": "processing",
"start": new Date('2012-10-11T05:45+05:30'),
"end": new Date('2012-10-11T06:45+05:30'),
},
{
"activity_name": "pending",
"start": new Date('2012-10-12T11:45+05:30'),
"end": new Date('2012-10-13T12:45+05:30'),
}
]

},
{
"process" :"process-name 2",
"stage" : "stage name 2",
"activities": [
{
"activity_name": "waiting",
"start": new Date('2012-10-22T06:45+05:30'),
"end": new Date('2012-10-23T08:45+05:30'),
},
{
"activity_name": "processing",
"start": new Date('2012-10-25T05:45+05:30'),
"end": new Date('2012-10-25T06:45+05:30'),
},
{
"activity_name": "pending",
"start": new Date('2012-10-27T11:45+05:30'),
"end": new Date('2012-10-27T12:45+05:30'),
}
]
}

];

绘制矩形的代码的 d3 部分是这样的:
console.log(dataset);

var height = 600;
var width = 500;
var x = d3.time.scale().domain([new Date(2011, 0, 1,23,33,00), new Date(2013, 0, 1, 23, 59)]).range([0, width]);



var svg = d3.selectAll("body")
.append("svg")
.attr("width",width)
.attr("height",height)
.attr("shape-rendering","crispEdges");


temp = svg.selectAll("body")
.data(dataset) // LINE 1
.enter()


temp.append("rect")
.attr("width", 4)
.attr("height",12)
.attr("x", function(d) {return x(d.activities[0].start)}) // LINE 2
.attr("y",function(d,i){return i*10;})
.attr("fill","steelblue");

我有以下问题:
  • 我要访问 开始 日期内 事件 但是我写的代码行(标记为 LINE 1 和 LINE 2)只为每个事件的第一次开始提供 2 个矩形。为什么?
  • 第 1 行 我可以使用 dataset.actitvies 而不是数据集吗?我尝试使用它,给了我这个错误:

  • Uncaught TypeError: Cannot read property '0' of undefined

    最佳答案

  • 因为数据集的长度是 2,所以当你把它和你的矩形连接起来时,你只会得到 2 个矩形。
  • 您可以使用 dataset.activities,但您需要将第 2 行更改为

    .attr("x", function(d) {return x(d.start)})

  • 因为您已经更改了连接,因此 d 现在指的是事件。然而,如果你这样做,你只会得到三个矩形——你的一个项目的事件。

    如果要使用嵌套数据,则需要使用嵌套选择,或者需要先通过将所有事件添加到一个简单数组来展平数据。
    var data = [];

    for (var i = 0, len = dataset.length; i < len; i++) {
    data = data.concat(dataset[i].activities);
    }

    嵌套选择如下所示:
    projects = svg.selectAll("g")
    .data(dataset)
    .enter().append("g")
    .attr("transform", function (d, i) { return "translate(0," + (i * 10) + ")"; }),

    rects = projects.selectAll("rect")
    .data(function (d) { return d.activities; })
    .enter().append("rect")
    .attr("height", 12)
    .attr("width", 4)
    .attr("x", function (d) { return x(d.start); })

    编辑:这是一个 jsfiddle

    关于json - 如何使用 d3 使用 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955820/

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