如何使用相同的美感提供多个填充值

时间:2018-06-22 22:39:59

标签: r ggplot2

我的目标是传递单独的值,以更改用于在不同几何图形中填充美学的颜色。

例如:

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
  stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
  geom_point(aes(fill = Species), color = 'black', shape = 21) + 
  scale_fill_manual(values = c('royal blue', 'red2', 'limegreen'))

在此绘图中,我希望能够使用单独的颜色来填充条形图和点。这可能吗?我知道使用scale_fill_manual() 将颜色设置为我想要的任何值,但这会将条形图和点的填充更改为相同的颜色。

这是我正在尝试做的一个半成品例子,但是传说不存在了……

iris_j <- iris %>%
  mutate(Species_bar = factor(paste0(Species, '_bar')))

color.groups <- c('royal blue', 'red2', 'limegreen', NA, 'royal blue', 'white')
names(color.groups) <- c(levels(iris_j$Species), levels(iris_j$Species_bar))

ggplot(iris_j, aes(x = Species, y = Sepal.Length)) + 
  stat_summary(aes(fill = Species_bar), color = 'black', geom = 'bar', fun.y = mean) +
  geom_point(aes(fill = Species), color = 'black', shape = 21) + 
  scale_fill_manual(values = color.groups)

enter image description here

3 个答案:

答案 0 :(得分:4)

这是ggplot的局限性之一-美感只能映射到单个变量。一般来说,我发现它是一个合理的限制,因为它阻止了许多令人困惑且难以理解的图形。就是说,有了一些创造力,就可以解决它,例如通过用color美学为点着色,然后过度绘图以添加笔触:

library(ggplot2)

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
    stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
    geom_point(aes(color = Species)) +    # add colored points
    geom_point(color = 'black', shape = 21, show.legend = TRUE) +    # add point strokes (including in legend)
    scale_color_manual(values = c('royal blue', 'red2', 'limegreen')) +    # define point colors
    scale_fill_manual(values = c(NA, 'royal blue', 'white'))    # define bar colors

要分隔图例,请为每个图例指定不同的名称。要将笔划添加到图例中的点,您需要在guide_legend中有效地对其进行重建。 (根据文档,为show.legend提供命名向量应该可以,但实际上却失败了。)

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
    stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
    geom_point(aes(color = Species)) + 
    geom_point(color = 'black', shape = 21) +
    scale_color_manual('points', values = c('royal blue', 'red2', 'limegreen'), 
                       guide = guide_legend(override.aes = list(shape = 21, color = 'black', 
                                                                fill = c('royal blue', 'red2', 'limegreen')))) + 
    scale_fill_manual('bars', values = c(NA, 'royal blue', 'white'))

这种方法不会推广到原本已经使用颜色的绘图中。

答案 1 :(得分:3)

以下是您可以尝试借鉴的一些小方法。

首先,如果您不需要使用填充形状,则可以将颜色映射到geom_point中的种类,这样就具有了色标和填充比例。在这种情况下,我更改了填充标签,将其标记为标记,以显示如何将它们分成两个图例。

library(tidyverse)
light_colors <- c("#87CEEB", "#FFB6C1", "#FF8C69")
dark_colors <- c("#22A0D6", "#E33650", "#BF411B")

ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  stat_summary(aes(fill = Species), geom = "bar", fun.y = mean) +
  geom_point(aes(color = Species)) +
  scale_fill_manual(values = light_colors) +
  scale_color_manual(values = dark_colors) +
  labs(fill = "Mean by Species")

第二,如果需要需要填充的形状,请让geom_point获取填充比例并砍掉条形以使用颜色。一种方法是通过使看起来像条形但实际上实际上geom_segment大的条形。我更改了图例的大小,以使图例键不会变得异常可笑。

ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  stat_summary(aes(xend = Species, yend = 0, color = Species), geom = "segment", fun.y = mean, size = 30, lineend = "butt") +
  geom_point(aes(fill = Species), color = "black", shape = 21) +
  scale_fill_manual(values = light_colors) +
  scale_color_manual(values = dark_colors, guide = guide_legend(override.aes = list(size = 4)))

第三种方法,制作一个平均值的数据框,并给它一个变量以表示已获得平均值,然后将一个变量添加到原始数据框以表示其为观测值。然后,您可以映射类型与物种的相互作用,以在一个填充比例尺中获得单独的颜色。

avgs <- iris %>%
  group_by(Species) %>%
  summarise(Sepal.Length = mean(Sepal.Length)) %>%
  mutate(type = "Mean")

iris %>%
  select(Species, Sepal.Length) %>%
  mutate(type = "Observation") %>%
  ggplot(aes(x = Species, y = Sepal.Length, fill = interaction(Species, type))) +
  geom_col(data = avgs) +
  geom_point(color = "black", shape = 21)

答案 2 :(得分:2)

并不是一个完美的解决方案,但这可能是一个足够的解决方法

df.join(pd.get_dummies(df.gender, drop_first=True))

   gender  Male
0  Female     0
1    Male     1
2    Male     1
3    Male     1
4  Female     0
5  Female     0
6    Male     1
7  Female     0
8  Female     0
9  Female     0

根据需要调整颜色,alpha和其他图形参数。