gpt4 book ai didi

d3.js - 如何使用 d3.js 对图表标签进行自动换行

转载 作者:行者123 更新时间:2023-12-04 01:49:26 40 4
gpt4 key购买 nike

我正在尝试使用 d3.js 实现水平条形图。一些图表标签太长。
如何对y aixs上的图表标签进行自动换行?

源代码:

var data = [{"Name": "Label 1", "Count": "428275" }, { "Name": "Label 2", "Count": "365005" }, { "Name": "Label 3", "Count": "327619" }];

var m = [30, 10, 10, 310],
w = 1000 - m[1] - m[3],
h = 550 - m[0] - m[2];

var format = d3.format(",.0f");

var x = d3.scale.linear().range([0, w + 10]),
y = d3.scale.ordinal().rangeRoundBands([0, h], .4);

var xAxis = d3.svg.axis().scale(x).orient("bottom").tickSize(h),
yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0);

$("#chartrendering").empty();
var svg = d3.select("#chartrendering").append("svg")
.attr("width", w + m[1] + m[3])
.attr("height", h + m[0] + m[2])
.append("g")
.attr("transform", "translate(" + m[3] + "," + m[0] + ")");

// Set the scale domain.

x.domain([0, d3.max(data, function (d) { return d.Count; })]);
y.domain(data.map(function (d) { return d.Name; }));

var bar = svg.selectAll("g.bar")
.data(data)
.enter().append("g")
.attr("class", "bar")
.attr("transform", function (d) { return "translate(0," + y(d.Name) + ")"; });

bar.append("rect")
.attr("width", function (d) { return x(d.Count); })
.attr("height", y.rangeBand());

bar.append("text")
.attr("class", "value")
.attr("x", function (d) { return x(d.Count); })
.attr("y", y.rangeBand() / 2)
.attr("dx", +55)
.attr("dy", ".35em")
.attr("text-anchor", "end")
.text(function (d) { return format(d.Count); });

svg.append("g")
.attr("class", "x axis")
.call(xAxis);

svg.append("g")
.attr("class", "y axis")
.call(yAxis);

最佳答案

这是我通过将各种位放在一起编写的工作实现。正如另一个答案所暗示的那样,foreignObject 仍然是要走的路。先说功能:

var insertLinebreaks = function (t, d, width) {
var el = d3.select(t);
var p = d3.select(t.parentNode);
p.append("foreignObject")
.attr('x', -width/2)
.attr("width", width)
.attr("height", 200)
.append("xhtml:p")
.attr('style','word-wrap: break-word; text-align:center;')
.html(d);

el.remove();

};

这需要一个文本元素 (t)、文本内容 (d) 和要换行的宽度。然后它获取 text 的 parentNode对象,并附加一个 foreignObject节点到其中一个 xhtml:p被添加。 foreignObject设置为所需的 width和偏移 -width/2到中心。最后,删除原始文本元素。

然后可以将其应用于您的轴元素,如下所示:
d3.select('#xaxis')
.selectAll('text')
.each(function(d,i){ insertLinebreaks(this, d, x1.rangeBand()*2 ); });

在这里,我使用 rangeBand 来获取宽度(图中的 2 个条形为 *2)。

Resulting image with wrapped labels

关于d3.js - 如何使用 d3.js 对图表标签进行自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16039693/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com