问题描述
我使用软件包 patchwork 的功能将3个 ggplot2 地块布置成一个图形。我试图收集这些传说,它们彼此相邻出现。但是,它们是3个独立的图例,我希望有一个图例。那么如何将包含相同因子变量的相同值的图例合并到单个图例中?
注意:
- 而且我不想通过使用
theme(legend.position = "none")
来删除单独图表的图例,以防出现某些附加因子水平。我希望有拼凑而成的特定解决方案。 - 在Combine and merge legends in ggplot2 with patchwork中回答了类似的问题,但是数据是连续的。就我而言,我拥有分类数据。
代码:
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,y = Sepal.Width,color = Species)) +
geom_point()
iris_3 <-
ggplot(iris,aes(x = Species,fill = Species)) +
geom_Boxplot()
(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")
由reprex package(v0.3.0)于2020-10-14创建
更新
我尝试使用与下面的注释中建议的相同的美学映射(fill = Species
和color = Species
),但无效:
library(tidyverse)
library(patchwork)
iris_1 <-
ggplot(iris,color = Species,fill = Species)) +
geom_density(alpha = 0.3,fill = Species)) +
geom_point()
iris_3 <-
ggplot(iris,fill = Species)) +
geom_Boxplot(color = "black")
(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")
由reprex package(v0.3.0)于2020-10-14创建
解决方法
不幸的是,设置相同的aes只是一种条件。拼凑而成的图例只有在它们相同的情况下才会合并。因此,我们必须确保每个图例的图例都相同。为此,我添加了一个guides
层,通过设置color
,shape
,size
和alpha
使每个图例的外观相同。另外,我们必须使用参数key_glyph
为每个geom选择相同的字形。经过这些调整,三个图例合并为一个。
library(ggplot2)
library(patchwork)
g <- guides(fill = guide_legend(override.aes = list(color = scales::hue_pal()(3),shape = c(16,16,16),size = c(1,1,1),alpha = c(1,1)),))
iris_1 <-
ggplot(iris,aes(x = Sepal.Length)) +
geom_density(aes(fill = Species,color = Species),key_glyph = "point",alpha = 0.3,adjust = 1.5) +
g
iris_2 <-
ggplot(iris,aes(x = Sepal.Length,y = Sepal.Width)) +
geom_point(aes(fill = Species,key_glyph = "point") +
g
iris_3 <-
ggplot(iris,aes(x = Species,y = Sepal.Width)) +
geom_boxplot(aes(fill = Species,key_glyph = "point") +
scale_color_manual(values = c("black","black","black")) +
g
(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")