d3 图缺少数组中的第一项

2024-02-12

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

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])

情节如下:

当我尝试添加文本时出现问题。我使用完全相同的过滤器来过滤数据,该数据创建一个数组供 .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")

但情节是这样的:

无论我在数据集中将多少个圆圈定义为“是”以便绘制它们,第一个圆圈总是缺少其标签。我猜测数据在某个地方发生了变异,但无法弄清楚在哪里。我还尝试在圆圈之前先绘制文本只是为了看看,但结果总是相同的。

这是控制台的输出,显示 .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 或者我会举一个例子

Thanks


当你这样做时:

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

您正在创建一个textSVG 中的元素(在您的情况下为副标题)。因此,当您稍后执行此操作时:

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') 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3 图缺少数组中的第一项 的相关文章

随机推荐

  • Java 电子邮件监听器

    我遇到了 IdleManager 类和 watch 方法 它使 imap 文件夹保持打开状态 并且理论上正在监视新消息 但如何让它在新电子邮件到达时输出或通知 代码 public static void main String args t
  • 报表查看器.rdlc 如何传递参数?

    显然 我一直在 C Windows 表单中制作试算表报告 报告查看器 其中显示 帐户 的年度报告及其每个帐户中的应付总额 该报告具有假定的年度复利值 具体取决于用户的选择 ex Jan 1 2013 to Feb 1 2014 将会有一个复
  • IDEA 以及如何禁用 gradle 包装器生成?

    我是 IJ IDEA 和 Gradle KTS 的新手 我手动创建了 kts 并将其导入到 IJ 中 IDEA 已经生成了 gradle 包装器 但我不想要这个 如果我删除 gradle 包装器和关联的目录 IDEA 会提示我从 gradl
  • 有没有办法用 FireMonkey 添加提示或工具提示?

    我已经搜索过但找不到任何东西 有没有办法用 FireMonkey 添加提示或工具提示 是否有可用的组件可以实现此目的 理想情况下 我正在寻找这样的东西 标注类型工具提示 对于搁置此问题的版主 我正在寻找有关如何实现此目标的源代码行 而不是购
  • jQuery 验证插件:如何强制验证以前有效的字段?

    我正在使用 jQuery 验证插件来验证表单 您知道如何强制重新验证吗以前成功过 fields 我已使用以下检查尝试了 form 函数 这是在用户单击 提交 后执行的 if form1 validate form false formVal
  • 如何将 SVG 对象插入到带有链接的 HTML 中?

    我不想添加到 svg 的链接 这是不可能的 因为 svg 不是我提供的 但想添加一个链接 例如 a href img src foo svg a 只是这一次不是img but a object 这样我就可以包含一个 svg 它适用于某些浏览
  • 如何让Jqgrid冻结列自动换行

    我正在使用最新的 jqgrid 包 4 4 5 我想让标题栏自动换行 我读了奥列格answer https stackoverflow com questions 8686616 how can i get jqgrid frozen co
  • Python BeautifulSoup:通配符属性/id搜索

    我有这个 dates soup findAll div id date 但是 我需要 id 作为通配符搜索 因为id can be date 1 date 2 etc 您可以提供可调用作为过滤器 dates soup findAll div
  • 如何访问 rowdatabound 上的 gridview 列?

    我想在值为 1 时将 gridview 列的值更改为活动状态 我有类似的 gridview 列
  • 为什么在类中实现的 C# 接口方法必须是公共的?

    我有一个继承接口的类 接口成员方法在我的类中实现 没有访问修饰符 因此 默认情况下它是 private 我收到错误 无法实现接口成员 因为它不是公共的 为什么不允许 我不能覆盖可访问性吗 这是一个例子why能够覆盖可见性是没有意义的 int
  • 在调整大小时保存 NSWindow 大小并为用户关闭

    我注意到 OS X 上的所有应用程序似乎都会保存您设置的大小 下次打开它时 它通常处于相同的位置和大小 我正在制作一个应用程序 我注意到调整大小后 如果我再次启动应用程序 它的大小只是我在 Xcode 4 的 IB 中设置的大小 而不是我在
  • 检查是否连接了打印机

    Windows 中有没有一种方法 在 Windows CE 中工作 来检查打印机是否已连接并与 C 中的 LPT1 进行通信 Edit 更多信息 我们目前正在使用通用 Windows CE 打印机驱动程序 pcl dll 通过将其传递到Cr
  • 将 Perfmon 分析解释为特定于应用程序的观察/数据的最佳方法是什么?

    我们很多人都使用过Perfmon工具来进行性能分析 特别是对于 Net 计数器 但 Perfmon 中存在太多变量 因此总是很难将 Perfmon 结果解释为有关我的应用程序的有价值的反馈 我想使用 perfmon 不是像蚂蚁分析器 htt
  • 如果我们是有效用户,我们可以克隆存储库吗?

    我是 Git 新手 所以如果这是一个愚蠢的问题 请原谅 在我们的组织中 我们使用 Git 作为存储库 我可以这样做git checkin checkout pull 从我的办公室机器 我们的 Git 存储库 URL 是这样的 但由于限制我无
  • 如何使 Flex Row 响应式 Bootstrap 4

    目前页面如下所示 现在 调整大小到移动屏幕时 弹性框会溢出容器 Html div class d flex flex row text white text center div class port item p 4 bg primary
  • 如何修改 C 程序以便 gprof 可以分析它?

    当我在我的 C 程序上运行 gprof 时 它说我的程序没有累积时间 并且所有函数调用都显示 0 时间 但是它确实对函数调用进行计数 如何修改我的程序 以便 gprof 能够计算某项运行所需的时间 编译的时候有没有指定 pg http so
  • 通过解析纯文本文件生成数据结构

    我为我正在编写的游戏编写了一个文件解析器 以便自己轻松更改游戏的各个方面 例如角色 舞台 碰撞数据 例如 我可能有一个像这样的字符类 class Character public int x y Character s location C
  • 使用 Golang 限制可执行文件的单个实例

    我一次只需要允许 Golang 可执行文件的一个实例 我不确定如何使用全局互斥体来确保没有其他实例正在运行 这将在 Windows 机器上运行 我知道这个主题有点老了 但我最近在 Windows 上需要它 我将在这里发布我是如何做到的 以防
  • 建立一个字典来按值查找键[重复]

    这个问题在这里已经有答案了 字典通常适合按键查找值 但按值查找键相当慢 for k v in dictionary items if v myValue return k 是否已经有一个数据结构可以同时实现 key gt value 和 k
  • d3 图缺少数组中的第一项

    我真的很挣扎 我正在使用 d3 库在 javascript 中创建点图 我想过滤实际绘制的点 以便稍后我可以将文本字段添加到数据集中名为 突出显示 的列中指定的其中一些字段 就像测试一样 我只绘制标记为 是 的圆圈 但最终会绘制所有圆圈 我