在这个拼凑而成的小插图中解释了如何组合多个 ggplots。我遇到的一个困难是收集图例并在它们的标题在字符数上非常不同时正确对齐/对齐它们。
下面是一个示例 - 我希望“mpg”图例也左对齐/对齐,而不是在“大小”图例下方居中。有什么建议?请注意,添加theme(legend.justification = "left")并不能解决问题。
library(ggplot2)
library(patchwork)
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp, colour = mpg, size = wt)) +
guides(size = guide_legend(title = "Size - long title for the purpose of this example")) +
ggtitle('Plot 1')
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('Plot 2')
p3 <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
ggtitle('Plot 3')
(p1 | (p2 / p3)) + plot_layout(guides = 'collect')
Run Code Online (Sandbox Code Playgroud)

如何使用 ggtext 为拼凑而成的 ggplots 赋予彩色标题?
假设我们有四个图
library(ggplot2)
library(patchwork)
library(ggtext)
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('Plot 1')
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('Plot 2')
p3 <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
ggtitle('Plot 3')
p4 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl) +
ggtitle('Plot 4')
Run Code Online (Sandbox Code Playgroud)
这些可以这样安排
patch <- (p1 + p2) / (p3 + p4)
patch
Run Code Online (Sandbox Code Playgroud)
拼凑而成的标题可以像这样
patch +
plot_annotation(
title = "Here is a regular title")
Run Code Online (Sandbox Code Playgroud)
单个 ggplot 可以像这样被赋予一个丰富多彩的标题
p1 + …Run Code Online (Sandbox Code Playgroud) 虚拟代码:
library(ggplot2)
library(patchwork)
plot1 <- mpg %>% ggplot()
plot2 <- mpg %>% ggplot()
plot3 <- mpg %>% ggplot(aes(cyl, displ)) +
geom_point(aes(colour = manufacturer)) +
guides(colour=guide_legend(ncol=4))
(plot1 + plot2) / plot3
Run Code Online (Sandbox Code Playgroud)
我不是在寻找组合的图例,而是看起来像这样的东西:
图例被“视为”情节的一部分。theme()我尝试过使用and添加边距plot_spacer(),但这并不完全是我想要的。这就是我得到的:
我正在尝试将(在单个图表中)常规ggplot图表与使用flextable.
考虑以下示例:
library(tidyverse)
library(patchwork)
mydf <- tibble(a = c(1,2,3,4,5,4),
b = c(4,4,4,3,3,3))
p1 <- mydf %>% ggplot(aes(x = a, y = b, color = as.factor(b))) + geom_point()
p2 <- mydf %>% flextable::flextable()
Run Code Online (Sandbox Code Playgroud)
p2 好像
但不幸的是我不能将它与 p1
> p1 + p2
Error: Don't know how to add p2 to a plot
Run Code Online (Sandbox Code Playgroud)
我们可以做什么?谢谢!
是否可以将 ggplot ly和 ggplot 与拼凑而成?
这将并排显示两个图
library(ggplot2)
library(plotly)
library(patchwork)
a <- ggplot(data.frame(1), aes(X1)) + geom_bar()
b <- ggplot(data.frame(1), aes(X1)) + geom_bar()
a + b
Run Code Online (Sandbox Code Playgroud)
但是,如果我们将其转换为 ggplotly,则会出错
b <- ggplotly(b)
a + b
Error: Can't add `b` to a ggplot object.
Run `rlang::last_error()` to see where the error occurred.
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
我真的很喜欢 patchwork 包,多个图的对齐通常比其他包(cowplot/gridextra)更好、更容易实现。
然而,有一件事我无法解决:是否可以忽略拼凑物中的 x 轴对齐,而只对齐所有其他元素?或者手动调整拼凑后的x轴对齐方式?参见附图:如果可能的话,我希望补丁 B 和 C (Petal.Length) 的 x 轴标题更接近 x 轴。
生成图像的代码:
library(ggplot2)
library(patchwork)
plot.1 <- ggplot(iris, aes(x = Species, y = Petal.Width)) +
geom_boxplot() +
scale_x_discrete(labels = c("A very\nvery\nlong\nlabel", "","")) +
labs(x = element_blank())
plot.2 <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) +
geom_point()
(plot.1 |plot.2)/(plot.2|plot.1) +
plot_annotation(tag_levels = "A")
Run Code Online (Sandbox Code Playgroud) 我使用patchwork包的功能将 3 个ggplot2图排列成一个图形。我试图收集这些图例,结果它们一个接一个地出现。但尽管如此,他们仍然是 3 个独立的传奇,而我原本以为只有一个传奇。那么如何将包含相同因子变量的相同值的图例合并到单个图例中呢?
笔记:
theme(legend.position = "none")以防出现一些附加因素水平。我期待拼凑出具体的解决方案。代码:
library(ggplot2)
library(patchwork)
iris_1 <-
ggplot(iris, aes(x = Sepal.Length, fill = Species, color = Species)) +
geom_density(alpha = 0.3, adjust = 1.5)
iris_2 <-
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point()
iris_3 <-
ggplot(iris, aes(x = Species, y = Sepal.Width, fill = Species)) +
geom_boxplot()
(iris_1 + iris_2 + …Run Code Online (Sandbox Code Playgroud) 我遇到了使用patchworkwhen组合图的问题theme(aspect.ratio = 1)。提供了一些示例:
library(tidyverse)
library(patchwork)
# Create the base plots
plotlist = list(
fig1 = iris %>%
filter(Species == "setosa") %>%
ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(),
fig2 = iris %>%
filter(Species == "versicolor") %>%
ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(),
fig3 = iris %>%
filter(Species == "virginica") %>%
ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point()
)
# Here patchwork combines the plots nicely
plotlist$fig1 / (plotlist$fig2 + plotlist$fig3)
Run Code Online (Sandbox Code Playgroud)

# However, …Run Code Online (Sandbox Code Playgroud) 使用下面的代码(根据此处的代码进行编辑)我生成了两个带有gt包的示例表:
library(tidyverse)
library(patchwork)
library(gt)
p1 <- mtcars %>%
head(5) %>%
gt()
p2 <- mtcars %>%
tail(5) %>%
gt()
# using wrap elements because this seems to be the answer to non-ggplot grobs e.g. #164
wrap_elements(full = p1 | p2)
grid.arrange(p1, p2, ncol=2, top="Main Title")
Run Code Online (Sandbox Code Playgroud)
出去:
Error in p1 | p2 :
operations are possible only for numeric, logical or complex types
Run Code Online (Sandbox Code Playgroud)
我希望将它们合并为一个 ggplot 对象:p <- (p1 | p2)使用patchwork包,但我还没有找到有效的答案。
我还尝试使用as_ggplot()函数将其转换为 ggplot: …
根据下面的代码和数据,是否可以拥有通用的图例标签,而不必使用来从代码中删除xlab和?ylabggplotpatchwork
我之所以问这个问题,是因为我有很多,所以我觉得从每个中删除和然后在代码中使用该方法ggplots并不理想。我知道我可以使用但比 慢得多。xlabylabggplotsggarrangeggpubrpatchwork
示例数据和代码:
library(tidyverse)
library(patchwork)
library(gridextra)
gg1 = ggplot(mtcars) +
aes(x = cyl, y = disp) +
geom_point() +
xlab("Disp") +
ylab("Hp // Cyl") +
theme(axis.title = element_blank())
gg2 = gg1 %+% aes(x = hp) +
xlab("Disp") +
ylab("Hp // Cyl")
# This method still keeps the individual axis labels.
p = gg1 + gg2
gt = patchwork::patchworkGrob(p)
gridExtra::grid.arrange(gt, left = "Disp", bottom = "Hp // …Run Code Online (Sandbox Code Playgroud)