5

我想比较一个图中我的数据的一些子组和另一个图中的一些其他子组。如果我绘制一个所有子组的图,那么这个数字是压倒性的,并且每个单独的比较都变得困难。我认为如果给定的子组在所有地块中颜色相同,对读者来说会更有意义。

这是我尝试过的两件事,几乎可以奏效,但都不太奏效。他们和我一样接近 MWE!

错误,因为所有三个级别都显示在图例中

library(tidyverse)

# compare first and second species
ggplot(data = iris %>% filter(Species != 'virginica'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_discrete(drop = FALSE)


# compare second and third species
ggplot(data = iris %>% filter(Species != 'setosa'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_discrete(drop = FALSE)

请注意,未绘制的级别仍然出现在图例中(与 drop = FALSE 的想法一致)。

错误,因为第二个图不保持第一个图建立的物种颜色映射

# compare first and second species
ggplot(data = iris %>% filter(Species != 'virginica'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_manual(values = c('red', 'forestgreen', 'blue'),
                     breaks = unique(iris$Species))


# compare second and third species
ggplot(data = iris %>% filter(Species != 'setosa'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_manual(values = c('red', 'forestgreen', 'blue'),
                     breaks = unique(iris$Species))

请注意,在左图中 setosa = red 和 virginica = green,但在右图中,映射发生了变化。

4

1 回答 1

8

最有效的方法是为每个级别(物种)设置一个命名的颜色变量,并在每个图中使用它。

在这里,您可以使用上面使用的相同颜色,但是通过向变量添加名称,您可以确保它们始终正确匹配:

irisColors <-
  setNames( c('red', 'forestgreen', 'blue')
            , levels(iris$Species)  )

setosa     versicolor     virginica 
 "red"  "forestgreen"        "blue"

然后你可以用它来设置你的颜色:

首先是所有颜色:

ggplot(data = iris,
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_manual(values = irisColors)

在此处输入图像描述

然后是您问题中的每个子集:

ggplot(data = iris %>% filter(Species != 'virginica'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_manual(values = irisColors)

在此处输入图像描述

ggplot(data = iris %>% filter(Species != 'setosa'),
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width,
                     color = Species)) +
  geom_point() +
  scale_color_manual(values = irisColors)

在此处输入图像描述

于 2017-03-20T14:25:25.203 回答