更新
如果你想要左边的图表外观而不是右边的图表:
![enter image description here](https://istack.dev59.com/SBEKWm.webp)
那么你只需要在geom_col
中使用rev()
即可:
geom_col(aes(x = ID, y = rev(-(190-C)/5)))
如果你想让条形图向下移动,它们必须包含负值。当您添加第二个y轴时,实际上只是一个视觉效果;您的所有跟踪都没有真正遵循该轴。"技巧"在于转换。如果您希望条形图位于线条上方,就好像顶部有一个零轴用于条形图,底部有一个零轴用于线条,则需要进行一些更改。首先,条形图需要是负数才能向下;这驱动了其他所有内容。其次,线条的值应该小于条形图中的值,而不会失去纵横比(缺乏更好的术语)。将两个跟踪偏移以确保条形图不重叠的最简单方法是通过否定当前的y并将其偏移至出现在条形图中的最大值来完成。首先,找到该偏移值:
offset = max((190 - Mydata$C)/5) # how much to offset the other traces
看看我们所做的,y 轴取反并偏移:
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5))
![进入图像描述](https://istack.dev59.com/p7v2I.webp)
接下来,我们需要修复两个 y 轴。从左侧的 y 轴开始,我们需要让它看起来好像我们没有把所有东西都取反。为了做到这一点,我们需要找到实际的负值,反映在 y 轴上的感知零点。
由于列 B
的值较大(为 20),我用它来确定底部位置。此外,由于 A 和 B 之间的最低值为 1,我们将添加 -1 来获得那条零线。要查找底部或我们想要的零线位置,请查找取反的 B 列的最小值 - 偏移量减去 1。
btm = min(-1 * Mydata$B - offset - 1) # because the min value is 1
看看我们目前的进展:
btm = min(-1 * Mydata$B - offset - 1)
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10))
![enter image description here](https://istack.dev59.com/Mgrp6.webp)
现在是添加第二个y轴的时候了。
我反转了变换的符号,然后看看数字在第二个y轴上落在哪里。
btm = min(-1 * Mydata$B - offset - 1)
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10),
sec.axis = sec_axis(~190 + . * 5))
![这里输入图片描述](https://istack.dev59.com/gCzRv.webp)
接下来,我们需要确定辅助 y 轴上的零点在哪里。为了计算这个值,我们需要首先计算在图表中经过转换后的 C 列的最大值,然后加上 C 列的最大值、B 列的最大值以及之前计算出的偏移量。
top = max(((190 + (-(190 - Mydata$C)/5) * 5) + offset - btm + max(Mydata$B)))
请注意,在创建这个值的调用中:
条形图中的Y为:
-(190 - Mydata$C)/5
使用第二个轴转换后条形图中的Y为:
190 + (-(190 - Mydata$C)/5) * 5
好了!现在您可以根据自己的需要调整标签了。 (我猜你已经有想法了。)
btm = min(-1 * Mydata$B - offset - 1)
offset = max((190 - Mydata$C)/5)
top = max(((190 + (-(190 - Mydata$C)/5) * 5) + offset - btm + max(Mydata$B)))
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10),
sec.axis = sec_axis(~190 + . * 5,
breaks = seq(top - 20 * 4, top, by = 20),
labels = seq(100, 0, by = -25)))
![enter image description here](https://istack.dev59.com/ImwKf.webp)
geom
添加图例条目,请在每个aes
中添加color =“您想在图例中看到的内容”
。这将添加颜色。(对于条形图,请使用fill
。这看起来比color
好看。) - Kat