Как я могу сохранить цветовую схему для 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)

Обратите внимание, что уровень без графика все еще появляется в легенде (в соответствии с идеей 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 = зеленый, но на правом графике это отображение изменилось.

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)

Другие вопросы по тегам