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"))
我正在尝试制作一个带有两个面板的多面图 - 左侧和右侧。 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"))