javascript - D3 图表工具 : Cannot display labels above columns in bar chart

标签 javascript d3.js

我知道建议为每个问题创建一个不同的问题,但截止日期太短,所以我选择了这个选项。对此我感到非常抱歉,并请求专家的建议。

我对 D3 完全陌生图表工具。到目前为止,我已经设法使用 v4 呈现以下图表:

wp_enqueue_script( 'd3-chart', 'https://d3js.org/d3.v4.min.js' );

enter image description here

但是很难让下面的东西起作用!我一定是做错了什么,但不知道那是什么。

每个栏/列上方的标签
我通过引用 this fiddle 尝试了以下代码,但标签永远不会出现!

svg.selectAll("rect")
   .data(data)
   .enter().append("rect")
   .attr("x", function(d) { return x(d.month); })
   .attr("width", x.bandwidth())
   .attr("y", function(d) { return y(d.points); })
   .attr("height", function(d) { return height - y(d.points); })
   .attr("fill", function(d){return barColor(d.data_month_number, d.current_month_number)});

//set the label
svg.selectAll("text")
   .data(data)
   .enter()
   .append("text")
   .text(function(d) {
      return d.points;
   })
   .attr("text-anchor", "middle")
   .attr("x", function(d, i) {
      return i * (w / data.length) + (w / data.length - barPadding) / 2;
   })
   .attr("y", function(d) {
      return h - (d.points * 4) + 14;
   })
   .attr("font-family", "sans-serif")
      .attr("font-size", "11px")
      .attr("fill", "black");

控制 Y 轴刻度值
理想情况下,最上面的行应该大于最大的列值,对我来说是 23。但它停在 20。我提到了 this教程并尝试了以下内容。但它不起作用。

function make_y_gridlines() {
   return d3.axisLeft(y)
    .ticks(7)
    .tickValues([0, 5, 10, 15, 20, 25, 30]);
}

...

svg.append("g")
  .attr("class", "grid")
  .call(make_y_gridlines()
    .tickSize(-width)
  );

我用于呈现图表的以下 JSON:

[{
    "target_goal": 7, // This is to be used for the additional horizonal line (Target Goal)
    "current_month_number": 11,
    "data_month_number": 4,
    "month": "Apr-19", // Used as X-Axis label and they are coming up correctly
    "points": 3  // Columns are rendering fine but cannot display as labels above each
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 5,
    "month": "May-19",
    "points": 3
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 6,
    "month": "Jun-19",
    "points": 5
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 7,
    "month": "Jul-19",
    "points": 7
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 8,
    "month": "Aug-19",
    "points": 6
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 9,
    "month": "Sep-19",
    "points": 4
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 10,
    "month": "Oct-19",
    "points": 23
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 11,
    "month": "Nov-19",
    "points": 7
}, {
    "target_goal": 7,
    "current_month_number": 11,
    "data_month_number": 12,
    "month": "Dec-19",
    "points": 7
}]

编辑

最终图表需要如下所示。

enter image description here

更新(11 月 27 日)

我的图表检查结果。没有 <text>被渲染!

enter image description here

Fiddle图检查结果

enter image description here

最佳答案

如果没有完整的代码,就很难确定到底发生了什么,但有一条黄金法则可以让你自己找到答案,还有一些事情需要思考和尝试:

黄金法则

检查 DOM 中实际发生了什么(查看 https://developers.google.com/web/tools/chrome-devtools/dom,以防您不确定我的意思)是否已将标签添加到您的 <svg>只是不在正确的地方,在这种情况下,他们在哪里,计算中出了什么问题?或者它们完全丢失了,在这种情况下,您的选择或您尝试绑定(bind)到它的数据有问题吗?

通过观察您的代码可以尝试的事情

  • 当您选择要将数据点绑定(bind)到的文本元素(即 svg.selectAll("text") )时,这会将您的数据绑定(bind)到任何现有的 <text>文档中的元素,所以如果这是在添加坐标轴之后发生的,您可能会得到一些非常奇怪的选择,最终无意中进行了修改。相反,我会做这样的事情,以便它只适用于您要添加的标签:
svg.selectAll(".data-labels")
    .data(data)
    .enter()
    .append("text")
    .attr("class","data-labels")
    .text(function(d) {
        return d.points;
     })
  • y 位置的函数,return h - (d.points * 4) + 14;闻起来有点奇怪——记住这是页面上的 y 位置而不是数据的 y 值,所以你不使用 y(d.points) 感觉有点奇怪在它的任何地方。如果您想添加偏移量而不是减去偏移量,我也会感到惊讶(记住 y 是从顶部而不是底部测量的!)您的意思是 return h - y(d.points) - 14; ?也许它们就在那里,但设计得让您看不到它们?

希望至少有一些帮助!

关于javascript - D3 图表工具 : Cannot display labels above columns in bar chart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59053726/

相关文章:

javascript - Tensorflow.js请确保使用变量的操作位于传递给minimum()的函数f内

svg - 如何在SVG路径中设置每条线的颜色或宽度

javascript - D3 - 在 map 上居中和缩放扇区

d3.js: Hierarchical Edge Bundling 分别为每个链接更改 curveBundle

javascript - 强制本地存储事件在同一窗口中触发

javascript - 隐藏 div onclick 和存储 cookie 的最佳方法是什么?

javascript - D3 - 显示/隐藏仅单击节点的文本

d3.js - D3 : Loading multiple csv data files in a folder

javascript - 使用智能手机键盘外观处理绝对布局

javascript - 如何将按钮显示顺序从桌面更改为移动?