为 2 个不同的几何体分配颜色并获得 2 个不同的图例
Assign color to 2 different geoms and get 2 different legends
如何让 ggplot2 为不同的几何体提供单独的图例,这些几何体都使用颜色来表示 2 个不同的变量。我想要 3 个图例,一个用于 z
、a
和 b
,但 a & b 似乎组合成一个图例,即使 a & b 代表不同的变量。我还希望能够控制每个图例中的颜色。
dat <- data.frame(
y = rnorm(200),
x = sample(c("A", "B"), 200, TRUE),
z = sample(100:200, 200, TRUE),
a = sample(c("male", "female"), 200, TRUE),
b = factor(sample(1:2, 200, TRUE))
)
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("#F8766D", "#00BFC4", "orange", "purple"))
如果您使用填充绘图符号,您可以将一个因素映射到填充,将另一个因素映射到颜色,然后将它们分成两个比例,因此,图例。
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(fill = a, size = z), pch = 21) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("orange", "purple")) +
scale_fill_manual(values = c("#F8766D", "#00BFC4"))
似乎图例捕获方法在类似情况下是最普遍的,尽管在@jennybryan 上的这个特定的方法更简单并且可能是大多数人想要的。我在这里也记录了图例捕获方法。我首先从@Sandy Muspratt HERE.
那里学到了这种方法
dat <- data.frame(
y = rnorm(200),
x = sample(c("A", "B"), 200, TRUE),
z = sample(100:200, 200, TRUE),
a = sample(c("male", "female"), 200, TRUE),
b = factor(sample(1:2, 200, TRUE))
)
if (!require("pacman")) install.packages("pacman")
pacman::p_load(ggplot2, grid, gridExtra, gtable)
coldot <- ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
#geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("#F8766D", "#00BFC4"))
colbox <- ggplot(dat, aes(y = y, x = x)) +
#geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("orange", "purple"))
leg1 <- gtable_filter(ggplot_gtable(ggplot_build(coldot)), "guide-box")
leg1Grob <- grobTree(leg1)
leg2 <- gtable_filter(ggplot_gtable(ggplot_build(colbox)), "guide-box")
leg2Grob <- grobTree(leg2)
noleg <- ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b), position=position_dodge(1)) +
scale_color_manual(values = c("orange", "purple", "#F8766D", "#00BFC4")) +
theme(
plot.margin = unit(c(5.1, 4.1, 4.1, 2.1), "pt"),
legend.position=c(1.3, 0.87)
) +
guides(color = FALSE)
legs <- ggplot(data = data.frame(x=1, y=1)) +
geom_blank(aes(x=x, y=y)) +
theme_minimal() +
ylab(NULL) + xlab(NULL) +
theme(
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
) +
annotation_custom(leg1Grob, xmin=1, xmax=1, ymin=.95, ymax=1.3) +
annotation_custom(leg2Grob, xmin=.6, xmax=.8, ymin=.75, ymax=1)
out <- arrangeGrob(noleg, legs, ncol=2, widths=c(.85, .15))
print(out)
ggnewscale
让这变得非常简单:
library(ggplot2)
library(ggnewscale)
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
scale_color_brewer(palette = 'Dark2') +
new_scale_color() +
geom_boxplot(fill = NA, aes(color = b)) +
scale_color_brewer(palette = 'Paired')
由 reprex package (v0.3.0)
于 2020 年 1 月 8 日创建
任何 scale_color
都可以照常使用。为了方便我选择了scale_color_brewer
如何让 ggplot2 为不同的几何体提供单独的图例,这些几何体都使用颜色来表示 2 个不同的变量。我想要 3 个图例,一个用于 z
、a
和 b
,但 a & b 似乎组合成一个图例,即使 a & b 代表不同的变量。我还希望能够控制每个图例中的颜色。
dat <- data.frame(
y = rnorm(200),
x = sample(c("A", "B"), 200, TRUE),
z = sample(100:200, 200, TRUE),
a = sample(c("male", "female"), 200, TRUE),
b = factor(sample(1:2, 200, TRUE))
)
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("#F8766D", "#00BFC4", "orange", "purple"))
如果您使用填充绘图符号,您可以将一个因素映射到填充,将另一个因素映射到颜色,然后将它们分成两个比例,因此,图例。
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(fill = a, size = z), pch = 21) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("orange", "purple")) +
scale_fill_manual(values = c("#F8766D", "#00BFC4"))
似乎图例捕获方法在类似情况下是最普遍的,尽管在@jennybryan 上的这个特定的方法更简单并且可能是大多数人想要的。我在这里也记录了图例捕获方法。我首先从@Sandy Muspratt HERE.
那里学到了这种方法dat <- data.frame(
y = rnorm(200),
x = sample(c("A", "B"), 200, TRUE),
z = sample(100:200, 200, TRUE),
a = sample(c("male", "female"), 200, TRUE),
b = factor(sample(1:2, 200, TRUE))
)
if (!require("pacman")) install.packages("pacman")
pacman::p_load(ggplot2, grid, gridExtra, gtable)
coldot <- ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
#geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("#F8766D", "#00BFC4"))
colbox <- ggplot(dat, aes(y = y, x = x)) +
#geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b)) +
scale_color_manual(values = c("orange", "purple"))
leg1 <- gtable_filter(ggplot_gtable(ggplot_build(coldot)), "guide-box")
leg1Grob <- grobTree(leg1)
leg2 <- gtable_filter(ggplot_gtable(ggplot_build(colbox)), "guide-box")
leg2Grob <- grobTree(leg2)
noleg <- ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
geom_boxplot(fill = NA, size=.75, aes(color=b), position=position_dodge(1)) +
scale_color_manual(values = c("orange", "purple", "#F8766D", "#00BFC4")) +
theme(
plot.margin = unit(c(5.1, 4.1, 4.1, 2.1), "pt"),
legend.position=c(1.3, 0.87)
) +
guides(color = FALSE)
legs <- ggplot(data = data.frame(x=1, y=1)) +
geom_blank(aes(x=x, y=y)) +
theme_minimal() +
ylab(NULL) + xlab(NULL) +
theme(
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
) +
annotation_custom(leg1Grob, xmin=1, xmax=1, ymin=.95, ymax=1.3) +
annotation_custom(leg2Grob, xmin=.6, xmax=.8, ymin=.75, ymax=1)
out <- arrangeGrob(noleg, legs, ncol=2, widths=c(.85, .15))
print(out)
ggnewscale
让这变得非常简单:
library(ggplot2)
library(ggnewscale)
ggplot(dat, aes(y = y, x = x)) +
geom_point(aes(color = a, size = z)) +
scale_color_brewer(palette = 'Dark2') +
new_scale_color() +
geom_boxplot(fill = NA, aes(color = b)) +
scale_color_brewer(palette = 'Paired')
由 reprex package (v0.3.0)
于 2020 年 1 月 8 日创建任何 scale_color
都可以照常使用。为了方便我选择了scale_color_brewer