问题在于当您旋转一个元素时,它会围绕本地坐标系的原点(0,0)进行旋转。如果您要旋转的元素不在原点旁边,它可能会移动相当大的距离,并且可能会移动到图表之外。
有两种方法可以解决这个问题:
1. 使用“transform”属性而不是x和y属性来定位标签。这样,标签的坐标系(包括旋转的(0,0)点)将与其一起定位,并且旋转将发生在您期望的位置。@Manoj提供的代码遵循该系统,但假设您正在使用默认的xAxis函数。对于自定义轴标签代码,您的标签被赋予
y
值为0,
x
值由一个函数确定。您只需要将这些值移动到
transform
属性中,特别注意整体位置的变换在旋转和调整之前进行:
var timeLabels = svg.selectAll(".timeLabel")
.data(times)
.enter().append("text")
.text(function(d) { return d; })
.attr("transform", function(d, i) {
return "translate(" + ( i * gridSize) + ",0)"
+ "translate(" + gridSize / 2 + ", -6)rotate(-90)";
} )
.style("text-anchor", "end")
.attr("class", function(d, i) { return ((i >= 8 && i <= 16) ?
"timeLabel mono axis axis-worktime" :
"timeLabel mono axis");
});
当然,您可以将这两个变换语句组合成一个,如下所示:
.attr("transform", function(d, i) {
return "translate(" + ( (i + 0.5) * gridSize) + ",-6)"
+ "rotate(-90)")
2. 或者,您可以在旋转语句中指定旋转的中心点,包括您想要围绕其旋转的点的x和y值:
var timeLabels = svg.selectAll(".timeLabel")
.data(times)
.enter().append("text")
.text(function(d) { return d; })
.attr("x", function(d, i) { return i * gridSize; })
.attr("y", 0)
.attr("transform", function(d, i) {
return "translate(" + gridSize / 2 + ", -6)" +
"rotate(-90 "+ ((i + 0.5) * gridSize) + " " + (-6) +")";
} )
.style("text-anchor", "end")
.attr("class", function(d, i) { return ((i >= 8 && i <= 16) ?
"timeLabel mono axis axis-worktime" :
"timeLabel mono axis");
});
正如您所看到的,这个版本相当重复,因为我们必须计算标签的位置两次——一次是为了定位它,一次是为了设置旋转的中心。您可以看到为什么大多数示例(以及d3轴函数)使用变换来定位标签,这样它们就可以在原地旋转。