Ggplot2构面:将右侧面板的y轴放在右侧

时间:2020-06-15 02:57:56

标签: r ggplot2 facet axes facet-wrap

我正在尝试使用左右两个面板制作多面图。 x轴上的变量是连续的,y轴上的变量是离散的,带有相对较长的标签。我想将右侧图的y轴放在右侧(并保持左侧的y轴在左侧),以使两个面板不会被的y轴标签分开右侧图。

我尝试了几种不同的解决方法(例如cowplot),但我无法满足任何要求,因为我的情节中还需要一个图例。

这是我想做的: enter image description here

这里是一个代表:

library(tidyverse)

region <- sample(words, 20)
panel <- rep(c(0, 1), each = 10)
value <- rnorm(20, 0, 1)

df <- tibble(region, panel, value)

ggplot(df, aes(value, region)) +
  geom_point() +
  facet_wrap(~ panel, scales = 'free_y')

谢谢!

1 个答案:

答案 0 :(得分:1)

此解决方案在具有多于2个图的情况下缺乏灵活性,但可以为您的情况做工作。想法是分别生成图并将图合并成一个列表。 ggplot函数调用包含一个if else层的scale_y_discrete函数,该函数根据{{1}的值将y轴放在左侧还是右侧}。我们使用panel来组合图。

gridExtra

您可以保留library(tidyverse) library(gridExtra) region <- sample(words, 20) panel <- rep(c(0, 1), each = 10) value <- rnorm(20, 0, 1) df <- tibble(region, panel, value) panel <- sort(unique(df$panel)) plot_list <- lapply(panel, function(x) { ggplot(data = df %>% filter(panel == x), aes(value, region)) + geom_point() + if (x == 0) scale_y_discrete(position = "left") else scale_y_discrete(position = "right") }) do.call("grid.arrange", c(plot_list, ncol = 2)) 层,并将条形图保留在绘图的顶部。

enter image description here

更新

代码已更新,可从各个图中删除x轴,并在网格图的底部添加文本;添加了第二个facet_wrap(~ panel, scales = 'free_y')以抑制右侧图中的y轴标题。请注意,if else函数需要用大括号括起来(既不知道:-,但还是有道理的):

if else

enter image description here