gpt4 book ai didi

javascript - d3 plot 缺少数组中的第一项

转载 作者:行者123 更新时间:2023-11-29 21:14:26 25 4
gpt4 key购买 nike

我真的很纠结这个。我正在使用 d3 库在 javascript 中创建一个点图。我想过滤实际绘制的点,以便稍后我可以将文本字段添加到数据集中名为“highlight”的列中指定的一些点。就像测试一样,我只绘制标记为"is"但最终会绘制所有圆圈的圆圈。我只包含了实际的绘图代码,因为我很确定数据结构没问题。以下代码按照我的预期绘制了圆圈。

var category = plot.selectAll("."+media+"category")
.data(plotData)
.enter()
.append("g")
.attr("transform", function (d) {return "translate(0," + yScale(d.key) + ")"; })
.attr("class", media+"category")
.call(function(parent){
parent.append('text')
.attr("class", media+"Subtitle")
.attr("x",margin.left)
.attr("y",0)
.text(function(d){return d.key})

parent.selectAll('circles')
.data(function(d){
//console.log("object= ",d)
let filtered=d.values.filter(function(d){
return d.highlight=="yes"
})
//console.log("circles filtered ", filtered)
return filtered
})
.enter()
.append('circle')
.attr("class",function(d,i){
if(d.highlight=="yes"){
return media+"highlight"
}
else {return media+"fill"}
})
.attr("id",function(d){return d.name +" "+d.value+ " "+d.size})
.attr("cx",function(d){return xScale(d.value)})
.attr("cy",yScale.rangeBand()*.4)
.attr("r", function(d) {
if (size) {return d.size*(yScale.rangeBand()*.003 )}
else {return yOffset/2}
})
.attr("transform", function (d) {return "translate("+(margin.left)+","+(0)+")"})
.style("fill",colours[0])

剧情是这样的:

enter image description here

当我尝试添加文本时出现问题。我使用完全相同的过滤器来过滤数据,该数据创建一个数组供 .data 参数使用。然而由于某种原因,虽然第一个对象在数组中,但它没有被绘制出来。我修改后的代码如下所示:

var category = plot.selectAll("."+media+"category")
.data(plotData)
.enter()
.append("g")
.attr("transform", function (d) {return "translate(0," + yScale(d.key) + ")"; })
.attr("class", media+"category")
.call(function(parent){

parent.append('text')
.attr("class", media+"Subtitle")
.attr("x",margin.left)
.attr("y",0)
.text(function(d){return d.key})

parent.selectAll('circles')
.data(function(d){
//console.log("object= ",d)
let filtered=d.values.filter(function(d){
return d.highlight=="yes"
})
//console.log("circles filtered ", filtered)
return filtered
})
.enter()
.append('circle')
.attr("class",function(d,i){
if(d.highlight=="yes"){
return media+"highlight"
}
else {return media+"fill"}
})
.attr("id",function(d){return d.name +" "+d.value+ " "+d.size})
.attr("cx",function(d){return xScale(d.value)})
.attr("cy",yScale.rangeBand()*.4)
.attr("r", function(d) {
if (size) {return d.size*(yScale.rangeBand()*.003 )}
else {return yOffset/2}
})
.attr("transform", function (d) {return "translate("+(margin.left)+","+(0)+")"})
.style("fill",colours[0])

parent.selectAll('text')
.data(function(d){
console.log("object= ",d)
let filtered=d.values.filter(function(d){
return d.highlight=="yes"
})
console.log("text filtered ", filtered)
return filtered
})
.enter()
.append('text')
.attr("x",function(d){
return xScale(d.value)+(margin.left);
})
.attr("y",function(d){
return yScale.rangeBand()*.4;
})
.text(function(d){
return d.name+' '+d.size
})
.attr("class",media+"subtitle")

但是剧情是这样的:

enter image description here

无论我在数据集中将多少个圆圈定义为"is"以便绘制它们,第一个圆圈总是缺少其标签。我猜数据在某处发生了变异,但无法弄清楚在哪里。我也试过先在圆圈之前绘制文本只是为了看看,但结果总是一样的。

这是控制台的输出,显示 .data 数组中有第一个项目

[Object, Object, Object, Object]
dot-plot.js:104 object= Object {key: "Endland", values: Array[22]}
dot-plot.js:108 text filtered [Object, Object]0: Objectgroup: "Endland"highlight: "yes"name: "Manchester City"size: "95.65695168"value: "55097"__proto__: Object1: Objectgroup: "Endland"highlight: "yes"name: "Stoke"size: "9.13121722"value: "27743"__proto__: Objectlength: 2__proto__: Array[0]
dot-plot.js:104 object= Object {key: "Spain", values: Array[44]}
dot-plot.js:108 text filtered [Object, Object, Object]0: Objectgroup: "Spain"highlight: "yes"name: "Barcelona"size: "47.32724506"value: "100000"__proto__: Object1: Objectgroup: "Spain"highlight: "yes"name: "Deportivo de La Coru_a"size: "59.93202583"value: "34600"__proto__: Object2: Objectlength: 3__proto__: Array[0]
dot-plot.js:104 object= Object {key: "Italy", values: Array[22]}
dot-plot.js:108 text filtered [Object]
dot-plot.js:104 object= Object {key: "Germany", values: Array[20]}
dot-plot.js:108 text filtered [Object, Object]

我将不胜感激任何人可能拥有的任何见解。真的很抱歉这么冗长,但我从未使用过 js.fiddle,否则我会举个例子

谢谢

最佳答案

当你这样做时:

parent.append('text')
.attr("class", media+"Subtitle")
.attr("x",margin.left)
.attr("y",0)
.text(function(d){return d.key});

您正在 SVG 中创建一个 text 元素(在您的例子中是副标题)。因此,当您稍后执行此操作时:

parent.selectAll('text')//here you select ALL text elements
.data(function(d){
console.log("object= ",d)
let filtered=d.values.filter(function(d){
return d.highlight=="yes"
})
console.log("text filtered ", filtered)
return filtered
})
.enter()
.append('text');

您正在选择之前的文本(副标题)。因此,您的输入选择少了一个元素。

解决方案:选择其他东西:

parent.selectAll('.somethingElse')//here you don't select existing elements
.data(function(d){
console.log("object= ",d)
let filtered=d.values.filter(function(d){
return d.highlight=="yes"
})
console.log("text filtered ", filtered)
return filtered
})
.enter()
.append('text')

关于javascript - d3 plot 缺少数组中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40043720/

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