如何在 d3 中显示分组条形图数据右侧的第二个 y 轴

How to display second y-axis to right of grouped bar chart data in d3

我正在使用 the following example 作为我的起点,用 d3 创建一个分组条形图。为了便于阅读,我做了一些小修改,如下面的屏幕截图所示;屏幕截图还演示了我遇到的问题。

我想添加第二个 y 轴,但自然我希望它一直在右边。正如您从屏幕截图中看到的那样,虽然它位于向左的 y 轴的右侧,但也与其相邻而不是数据的右侧。

我所做的就是添加以下内容(注意 orient("right")

var yRight = d3.svg.axis()
    .scale(y)
    .orient("right");

然后我应用了以下追加,甚至在 Javascript 源代码的最后,以防顺序很重要,但无济于事。我将这两件事都基于如何处理(左)yAxis,但显然还需要做一些事情才能将第二个 y 轴一直移动到实际图表的右侧。

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

基于this other example我找到了我的答案,那就是添加一个transform/translate子句如下:

svg.append("g")
    .attr("class", "y axis")
    .attr("transform", "translate(" + width + " ,0)")
    .call(yRight);

虽然我是 d3 的新手,但评论中 transform/translate 对 d3 专家所做的一些解释肯定会提高此问答的质量。

是的,如您所见,.orient调整轴标签位置,而不是轴本身: "Changing the orientation affects the position of the ticks and their labels in relation to the axis path, but does not change the position of the axis itself; to change the position of the axis with respect to the plot, specify a transform attribute on the containing g element." mbostock wiki

"transform"、"translate" 将所有点移动 X 和 Y 值。这是一个 SVG 命令,而不是 D3。所以,你的命令

 .attr("transform", "translate(" + width + " ,0)")

将第二个 y 轴向右移动 "width" 像素,如您所愿。请注意,您已经对 x 轴做了同样的事情:

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

您使用变换将其向下移动 "height" 像素。如果没有这个翻译,x 轴将沿着图表的顶部。

还有其他有用的变换,如旋转,可用于旋转轴标签。当它们很长并且开始相互重叠时很有用。 SVG doc transform