R语言 为2个不同的几何体指定颜色并获得2个不同的图例

wfsdck30  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(156)

我怎样才能让ggplot2为不同的几何图形给予一个单独的图例,它们都使用颜色来表示2个不同的变量。我想要3个图例,一个用于za,和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"))

yks3o0rb

yks3o0rb1#

如果使用填充绘图符号,则可以将一个因子Map为填充,将另一个Map为颜色,然后将它们分为两个比例,从而形成图例。

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

wvmv3b1j

wvmv3b1j2#

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是为了方便

ia2d9nvy

ia2d9nvy3#

在类似的情况下,图例捕获方法似乎是最通用的,尽管在@jennybryan 's上的这个特定方法更简单,而且可能是大多数人想要的。我在这里也记录了图例捕获方法。我第一次从@桑迪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)

相关问题