【问题标题】:Overlay circle, text, etc. over d3.js multi-series lines在 d3.js 多系列行上叠加圆圈、文字等
【发布时间】:2012-12-26 16:42:55
【问题描述】:

我有 multi series line chart code 稍作修改以支持我的数据集。这就是我想要做的,而且我看过的任何解决方案似乎对我来说都无法正常工作。我希望在线上的每个点上覆盖一些元素(圆形、矩形、隐藏,无论哪个),这样我就可以在该点上附加一个mouseover 元素以显示一个包含 d.time、d.jobID 数据的框以及与平均值相差多少。如果可能的话,我希望解决方案只对主线(变化线)执行此操作,而不是绘制代表平均值的两条线。在这里,我有一张原样的图表图片,用于目视检查。如果不行,我也附上。

我在下面贴了一点代码:

d3.tsv("values.tsv", function(error, data) {
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "time" && key !==   "jobID"; }));

data.forEach(function(d) {
  d.time = parseDate(d.time);
  d.jobID = parseInt(d.jobID);
});

var points = color.domain().map(function(name) {
return {
  name: name,
  values: data.map(function(d) {
    return {time: d.time, jobID: d.jobID, value: parseFloat(d[name],10)};
  })
};
});

....

svg.append("g")
  .attr("class", "x axis")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis);

svg.append("g")
  .attr("class", "y axis")
  .call(yAxis)
.append("text")
  .attr("transform", "rotate(-90)")
  .attr("y", 7)
  .attr("dy", ".71em")
  .style("text-anchor", "end")
  .text("mbps");

var point = svg.selectAll(".point")
  .data(points)
.enter().append("g")
  .attr("class", "point");

point.append("path")
  .attr("class", "line")
  .attr("d", function(d) { return line(d.values); })
  .style("stroke", function(d) { return color(d.name); });

point.append("text")
  .datum(function(d) { return {name: d.name, jobID: d.jobID, value: d.values[d.values.length - 1]}; })
  .attr("transform", function(d) { return "translate(" + x(d.value.time) + "," + y(d.value.value) + ")"; })
  .attr("x", 6)
  .attr("dy", ".7em")
  .text(function(d) { return d.name; });
});

我已经尝试了以下代码,只是为了看看它是否适用于我的实现:

point.append("svg:circle")
     .attr("stroke", "black")
     .attr("fill", function(d, i) { return "black" })
     .attr("cx", function(d, i) { return x(d.time) })
     .attr("cy", function(d, i) { return y(d.value) })
     .attr("r", function(d, i) { return 3 });

D3.JS 似乎是一个非常棒的作品,我很幸运拥有它。

编辑:jsfiddle

【问题讨论】:

    标签: javascript d3.js charts dom-events graphing


    【解决方案1】:

    诀窍是将数据再次传递给选择,然后对其结果进行操作。查看Mike's tutorial 了解一些背景和示例。

    我已更改您的 jsfiddle 以添加圈子 here。附加svg:title 元素或执行其他操作以显示更多信息应该很简单。请注意,我修改了您的代码以稍微创建数据点以包含每个元素的名称。这样,只需要一个额外的选择级别(将所有点视为相同,并在一次通过中添加它们)。从代码设计的角度来看,解决这个问题的更简洁的方法是增加 2 个级别——首先选择单行的点(并添加 svg:g 元素对它们进行分组),然后添加点在这个组内。不过,这会使代码更加复杂且难以理解。

    【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多