javascript - D3 X轴长标签重叠

标签 javascript css d3.js visualization overlap

我有一个 D3 条形图,其中 X 轴标签相互重叠。我有以下内容:

//x 轴自动换行

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

试图跟随http://bl.ocks.org/mbostock/7555321通过添加必要的功能但无效。任何人都可以提供建议吗?

function wrap(text, width) {
  text.each(function() {
    var text = d3.select(this),
        words = text.text().split(/\s+/).reverse(),
        word,
        line = [],
        lineNumber = 0,
        lineHeight = 1.1, // ems
        y = text.attr("y"),
        dy = parseFloat(text.attr("dy")),
        tspan = text.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em");
    while (word = words.pop()) {
      line.push(word);
      tspan.text(line.join(" "));
      if (tspan.node().getComputedTextLength() > width) {
        line.pop();
        tspan.text(line.join(" "));
        line = [word];
        tspan = text.append("tspan").attr("x", 0).attr("y", y).attr("dy", ++lineNumber * lineHeight + dy + "em").text(word);
      }
    }
  });

谢谢。

最佳答案

不仅要设置位置,甚至还必须设置宽度,但是您无法像 svg 文本标签中的 html 标签那样设置宽度,您可以简单地添加多个 tspan 并且相对顶部应该是这就是为什么在 tspan 的函数 dy 中设置为 lineNumber * lineHeight + dy 的原因。

在下面的代码中,.selectAll(".tick text") 将选择带有 tick 类的标签内的所有文本标签。

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

看看你的代码,你有 wrap 功能,但它没有被调用。 应该调用它来格式化文本。

调用将调用函数,第一个参数是所选的 svg 对象,第二个参数是您传递的参数。

因此,对于类为 tick 的标签内的每个文本标签,将使用第一个属性 svg 文本对象和第二个 x.rangeBand 的值调用 wrap 函数()

您的 wrap 函数通过将字符串吐出到单词列表中来复制文本对象中的字符串,然后通过 text.text(null) 清空文本标签内容。

一旦 text 对象为空,它就会添加一个 tspan 标签并设置文本,使其长度不超过给定的宽度,如果还有更多单词,则它附加另一个 tspan 并重复直到添加所有单词。

您可以在 text 标签内找到多个 tspan 标签,每个标签的文本都小于或等于宽度(只需检查元素)。

关于javascript - D3 X轴长标签重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589306/

相关文章:

javascript - PubNub Twitter 数据流设置不返回数据

javascript - 添加 :hover pseudoclass

javascript - 生成一组唯一的 N 个随机数,如果所有数字加起来等于 N

javascript - 如何选择日期范围(如 onClick 但拖动/选择)

javascript - 如何使用 jquery 将无序列表转换为 <select> 下拉列表?

css - 固定宽度的页面布局

html - 在 git 页面上托管时图像 url 路径混淆的解决方案

javascript - 通过 jquery 查找和替换用 <a> 标签包装文本 url

html - 在同一个 div 上叠加颜色和背景图像

d3.js - 如何在 Polymer.dart 元素中嵌入 D3 图表?