javascript - 在 d3 可视化上下文中调用工具提示

标签 javascript d3.js

所以我有一个可视化,我正在尝试使用 d3.tip() - https://github.com/Caged/d3-tip/blob/master/docs/initializing-tooltips.md#d3tip

这是我的代码-

            this.svg = d3.select(".timechart").append("svg")
            .attr("width", this.width + this.margin.left + this.margin.right)
            .attr("height", this.height + this.margin.top + this.margin.bottom)
            .append("g")
            .attr("transform", "translate(" + this.margin.left + "," + this.margin.top + ")");

svg.selectAll('.point')
                .data(newData)
                .enter()
                .append("svg:circle")
                .attr("cx", function(d,i){ 
                    var date = d["date"].match(/(\d+)/g);
                    date = new Date(date[2], date[0], date[1]);
                    return xScale(date);
                })
                .attr("cy", function(d,i){
                    var quantitySold = yScale(d["quantity-sold"]);
                    return quantitySold;
                })
                .attr("fill", "red")
                .attr("r", 4)
                .on("mouseover", function(d){
                    tooltip.show();
                })
                .on("mouseout", function(d){
                    tooltip.hide();
                });


            var tooltip = d3.tip()
                .attr("class", "tooltip")
                .offset([0,5])
                .html(function(d){
                    console.log(d);
                    return "<strong> 20 </strong>";
                });

            svg.call(tooltip);

console.log(d) 给了我未定义的信息,而它应该给我数据。

为什么?

我还意识到 - 我不确定应该在这里发布什么代码来提供帮助 - 只是让我知道什么是有用的。

最佳答案

您正在使用的工具提示库 ( d3.tip ) 为整个可视化创建单个 html 工具提示。使用工具提示的 .show(d,i) 方法将特定元素的数据传递到工具提示。

This example from the plug-in's creator展示了它应该如何工作。特别要注意的是,show 和 hide 方法直接作为参数传递给矩形选择的 .on(event, function) 方法:

svg.selectAll(".bar")
 /* ... */
  .on('mouseover', tip.show)
  .on('mouseout', tip.hide) 

当事件发生时,d3 将调用这些方法并将数据对象作为参数传递给它们

相反,在您的代码中:

        .on("mouseover", function(d){
            tooltip.show();
        })
        .on("mouseout", function(d){
            tooltip.hide();
        });

d3 会将数据传递给您的匿名函数,但您不会将其传递给显示/隐藏函数。因此,当工具提示的 show 函数尝试设置工具提示的 html 内容时,数据是未定义的。

如果您发现一切仍然令人困惑,您可能会喜欢 this write-up about passing functions as parameters .

最后,虽然这不是您现在的主要问题,但您应该在将工具提示的功能分配给事件处理程序之前定义工具提示。如果您在定义 tooltip 之前尝试执行 .on('mouseover', tooltip.show) 操作,则会收到错误消息。您只能通过将该函数调用包装在另一个函数中来避免它。

关于javascript - 在 d3 可视化上下文中调用工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927605/

相关文章:

javascript - 我们能否通过IP地址准确获取任何设备的位置?如果是,哪个是最好的 API?

javascript - 如何在 Electron 渲染器进程中使用 RxJs 等模块?

javascript - 显示 y 轴最底部的刻度

javascript - 更新折线图上的数据不起作用

javascript - 防止在 d3v5 中平移到 map 边界之外

javascript - d3 JSON 多折线图

javascript - 使用socket io发送和获取数据的两条指令

javascript - 使用 javascript 替换数组中的空格。简单但有一个转折

javascript - 在我的 Python CGI 脚本中,如何将通过用户在表单中输入的数据的 POST 请求上传的文件保存到磁盘?

javascript - 在 d3.js 中从 csv 创建树层次结构