Как я могу сохранить цветовую схему для ggplots, удаляя при этом неиспользуемые уровни на каждом графике?

Я хочу сравнить некоторые подгруппы моих данных на одном графике и некоторые другие подгруппы на другом графике. Если я сделаю один график со всеми нанесенными на него подгруппами, цифра будет огромной, и каждое отдельное сравнение станет затруднительным. Я думаю, что читатель будет иметь больше смысла, если данная подгруппа будет одного цвета на всех графиках.

Вот две вещи, которые я пробовал, которые почти работают, но ни одна из них не работает. Они настолько близки, насколько я могу, к 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)

Обратите внимание, что не нанесенный на график уровень по-прежнему появляется в легенде (в соответствии с идеей отбрасывания = ЛОЖЬ).

Неверно, потому что второй график не поддерживает сопоставление видов и цветов, установленное первым графиком

# 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 = красный и virginica = зеленый, но на правом графике это сопоставление изменено.


person rcorty    schedule 19.03.2017    source источник


Ответы (1)


Самый эффективный способ - установить именованную переменную цветов для каждого уровня (вида) и использовать ее на каждом графике.

Здесь вы можете использовать те же цвета, что и выше, но, добавляя имена к переменной, вы гарантируете, что они всегда правильно совпадают:

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)

введите описание изображения здесь

person Mark Peterson    schedule 20.03.2017