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