26

我正在使用 nvd3 的 multiBarChart 构建条形图,需要调整旋转 x 轴标签的位置:

在此处输入图像描述

var chart = nv.models.multiBarChart();
...
chart.rotateLabels(-90);

我希望列标签不与图表重叠并在每个条形下方居中。我可以在绘制图表后选择标签并调整它们,但有没有更简单的方法?

4

6 回答 6

35

我发现处理此问题的最佳方法是自己执行 x 轴刻度标签的旋转。为什么?因为 NVD3 没有正确处理旋转和相关的平移。查看您的图像,您会看到库允许旋转将标签直接从它们所代表的列下方翻译出来。它也开始错误地处理这些axis.tickPadding()值,等等。

您需要做的第一件事是确保图表有足够的空间容纳已翻译的标签,如下所示:

chart.margin({bottom: 60});

然后我们可以平移和旋转标签:

var xTicks = d3.select('.nv-x.nv-axis > g').selectAll('g');
xTicks
  .selectAll('text')
  .attr('transform', function(d,i,j) { return 'translate (-10, 25) rotate(-90 0,0)' }) ;

标签现在看起来像这样:

旋转/翻译的标签

于 2012-11-20T11:38:33.060 回答
5

对于多图,您可以在d3.select中添加“ '#' + containerId +' svg ”,如下所示:

//Rotate x-axis label
var xTicks = d3.select('#' + containerId + ' svg .nv-x.nv-axis > g').selectAll('g');
xTicks
    .selectAll('text')
    .attr('transform', function(d,i,j) { return 'translate (-15, 60) rotate(-90 0,0)' });

无论如何,感谢@River 的回答。

于 2013-12-05T06:59:47.183 回答
1

这对我有用。我提交这个的主要原因是更改锚点比手动转换位置更好。

var xTicks = d3.select('.nv-x.nv-axis > g > g',_this.context.element).selectAll('g').selectAll('text');
xTicks.attr('transform', function() { return 'rotate(' + angle + ' 0,0)' }) ;
xTicks.attr('text-anchor',function() {
    var anchor;
    if(angle > 0){ anchor = 'start'; }
    else if(angle < 0){ anchor = 'end'; }
    else { anchor = 'middle'; }
    return anchor;
});
于 2014-06-04T18:03:55.780 回答
1

以下对我有用:

chart.axislist["xAxis"]["rotateLabels"]= -45
于 2016-05-26T09:04:15.307 回答
0

无论你的文字旋转是给开始/中间/结束

d3.select('.nv-x.nv-axis > g > g').selectAll('g.tick text').style('text-anchor', 'start');  //start/middle/end
于 2014-12-11T05:23:10.327 回答
0

有一个 css 替代方案。

.nv-x .tick text {
    transform: rotate(-90deg) translateX(-15px) translateY(-7px);
}
于 2018-06-07T13:08:17.803 回答