Javascript d3js:提供一个函数来填充

Javascript d3js:提供一个函数来填充,javascript,svg,d3.js,Javascript,Svg,D3.js,假设我有,所以我想交替使用记号填充(文本和x轴之间的垂直距离),这样记号标签就不会重叠 我知道这可以通过选择勾号元素并应用变换属性在渲染后实现。但我想做: var xAxis = d3.svg.axis() .scale(x0) .orient("bottom") .tickSize(0) .tickPadding(function(i) { // some logic here to determine the alternating-height strategy by index, e

假设我有,所以我想交替使用记号填充(文本和x轴之间的垂直距离),这样记号标签就不会重叠

我知道这可以通过选择勾号元素并应用变换属性在渲染后实现。但我想做:

var xAxis = d3.svg.axis()
.scale(x0)
.orient("bottom")
.tickSize(0)
.tickPadding(function(i) {
  // some logic here to determine the alternating-height strategy by index, e.g.
  return i % 2 ? 20 : 30;
 });

这在d3中不起作用——文档()说,tickPadding只取像素数。有更好的方法吗?Monkey patch d3的axis.tickPadding函数获取函数或数字,然后在绘制记号时应用该函数?

唯一的选择是修改源。D3假设在整个axis实现过程中,
tickPadding
是一个数字,而不是一个函数——请参阅。

有关源代码补丁,请参阅:

另一种修复方法是在渲染后手动换行文本:


我也希望这样做。我用的是周数,有点挤。基本上x轴看起来像

111213141516171819 
我希望把它们叠起来。最后我做了这个

$('.tick text').each(function(i){
   var yval = this.getAttribute("y");
   if( i % 2 == 0 )this.setAttribute("y",parseInt(yval)+10);
});
一旦画出图表。我也确保在底部加上一些额外的边距(10)。结果是

  12  14  16  18
11  13  15  17  19

谢谢我们通过d3选择而不是JQ:xAxis.selectAll('text').attr('transform',function(d,i){var y=i%2==0?10:0;//向下移动偶数返回'translate(0,+y+)';});