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

Ggplot2 facets: put y-axis of the right hand side panel on the right side

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

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

这就是我想要做的:

这是一个代表:

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')

谢谢!

对于具有 2 个以上地块的案例,此解决方案缺乏灵活性,但它可以满足您的需求。这个想法是分别生成图并将这些图组合成一个列表。 ggplot 函数调用包含 scale_y_discrete 层的 if else 函数,它根据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))

您可以离开 facet_wrap(~ panel, scales = 'free_y') 图层,您将保留图中顶部的条带。

更新

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

plot_list <- lapply(panel, function(x) {
  ggplot(data = df %>% filter(panel == x), aes(x = value, y = region)) +
         geom_point() +
         theme(axis.title.x = element_blank()) +
         facet_wrap(. ~ panel) +
         {if (x == 0) scale_y_discrete(position = "left") else scale_y_discrete(position = "right")} +
         {if (x == 1) theme(axis.title.y = element_blank())}
})

do.call("grid.arrange", c(plot_list, ncol = 2, bottom = "value"))