在ggplot2中复制(和修改)离散轴

30

我想在 ggplot2 图的右侧复制左侧 Y 轴,然后更改分类轴的刻度标签。

我已经阅读了 这个问题 的答案,但是正如可以在 该包的仓库页面 上看到的那样,cowplot 包中的 switch_axis_position() 函数已被移除(作者引用了 ggplot2 中即将推出的本机功能)。

我已经查看了 ggplot2 中关于辅助轴的参考页面,但是该文档中的所有示例都使用了 scale_y_continuous 而不是 scale_y_discrete。而且,当我尝试使用离散函数时,我会收到错误提示:

Error in discrete_scale(c("y", "ymin", "ymax", "yend"), "position_d",  : 
unused argument (sec.axis = <environment>)

有没有办法用ggplot2做到这一点?即使是完全的hack解决方案对我也足够。提前致谢。(以下是MREs)

是否有任何方法使用ggplot2实现此目标?即使是一个被完全篡改的解决方案,对我来说也足够了。先感谢您。(下面是MREs)

library(ggplot2)

# Working continuous plot with 2 axes
ggplot(mtcars, aes(cyl, mpg))  + 
    geom_point() + 
    scale_y_continuous(sec.axis = sec_axis(~.+10))


# Working discrete plot with 1 axis
ggplot(mtcars, aes(cyl, as.factor(mpg)))  + 
    geom_point() 


# Broken discrete plot with 2 axes
ggplot(mtcars, aes(cyl, as.factor(mpg)))  + 
    geom_point() +
    scale_y_discrete(sec.axis = sec_axis(~.+10))

2
查看scale_y_discrete的源代码,没有指定次坐标轴的选项/参数。因此,任何解决方案可能都需要进行一些修改。 - SymbolixAU
1
我在 ggplot 提出了一个 问题,要求在 scale_y/x_discrete() 中原生支持 sec.axis - maxheld
1个回答

26

将你的离散因子用数字表示出来。然后可以将其镜像,并重新标记刻度,以便将刻度表示为因子水平而不是数字。

library(ggplot2)

irislabs1 <- levels(iris$Species)
irislabs2 <- c("foo", "bar", "buzz")

ggplot(iris, aes(Sepal.Length, as.numeric(Species))) +
  geom_point() +
  scale_y_continuous(breaks = 1:length(irislabs1),
                     labels = irislabs1,
                     sec.axis = sec_axis(~.,
                                         breaks = 1:length(irislabs2),
                                         labels = irislabs2))

根据需要调整比例中的 expand = 参数,以更接近默认离散比例。

enter image description here


3
根据 ggplot 的帮助文档,“连续变量的默认值为 c(0.05, 0),离散变量的默认值为 c(0, 0.6)。” 对于我来说,使用 expand = c(0,0.6) 能够得到非常好的效果。 - TobiO
4
刚刚又发现了这个。还是没有更好的方法吗?有人知道现在是否有更简单的方法吗? - TobiO
@TobiO 我已经有几年没有关注ggplot的开发了,但你可以在他们的Github仓库上提交一个带有良好reprex的错误报告。 - Brian
1
我又找到了这个,因为我正在寻找解决方案,只是发现几周后有一项功能请求,与你的建议类似 :-) - TobiO
4
实际上在Github上有一个待解决的问题,请在那里发表评论,让团队知道你仍然感兴趣: https://github.com/tidyverse/ggplot2/issues/3171 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接