Заставьте ggplot2 использовать одинаковые метки и цвета в легендах для двух сюжетов - PullRequest
0 голосов
/ 05 ноября 2018

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

Вот вам пример с игрушкой.

mydata <- data.frame(from=rep(c("b","c"), each=15),
    to=rep(c("a","b","c"), each=10), 
    value=c(rep(1:5,5:1),rep(1:5,1:5)) )

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

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

niv <- c("a", "b", "c")
colo <- c("black", "red", "blue")

mydata$from <- factor(mydata$from, levels=niv)
mydata$to <- factor(mydata$to, levels=niv)

А теперь я генерирую графики. Сначала с группировкой по столбцу "из".

ggplot(mydata) +  stat_density(geom="line",size=0.8,
 position = "identity", aes(x=value, color=from)) +
  scale_colour_manual(name="Type",labels = niv, 
  values=colo)  +  theme_bw()

enter image description here

Как вы можете видеть, он не дает желаемого графика, потому что он показывает фактор "а", но его нет в столбце "из".

А теперь группировка по столбцу "до".

ggplot(mydata) +  stat_density(geom="line",size=0.8,
  position = "identity", aes(x=value, color=to)) +
  scale_colour_manual(name="Type",labels = niv, 
  values=colo)  +  theme_bw()

enter image description here

Работает как положено.

Теперь я пытаюсь снова создать первый график без параметра метки.

ggplot(mydata) +  stat_density(geom="line",size=0.8,
  position = "identity", aes(x=value, color=from)) +
  scale_colour_manual(name="Type", values=colo)  +  
  theme_bw()

enter image description here

Теперь он правильно маркирует категории, но цвет не соответствует второму графику.

Как я могу это сделать?

Настоящая проблема имеет больше категорий и много значений.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете использовать именованный вектор в scale_color_manual для явного сопоставления Type с цветами:

color_map <- c("a" = "black", "b" = "red", "c" = "blue")
scale_colour_manual(values=color_map)

Из help(scale_color_manual):

значения

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

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

library(tidyverse)

mydata <- data.frame(
  from = rep(c("b", "c"), each = 15),
  to = rep(c("a", "b", "c"), each = 10),
  value = c(rep(1:5, 5:1), rep(1:5, 1:5))
)

niv <- c("a", "b", "c")
colo <- c("black", "red", "blue")

color_map <- set_names(colo, niv)

mydata$from <- factor(mydata$from, levels = niv)
mydata$to <- factor(mydata$to, levels = niv)

ggplot(mydata) + stat_density(
  geom = "line", size = 0.8,
  position = "identity", aes(x = value, color = from)
) +
  scale_colour_manual(name = "Type", values = color_map) + theme_bw()

ggplot(mydata) + stat_density(
  geom = "line", size = 0.8,
  position = "identity", aes(x = value, color = to)
) +
  scale_colour_manual(
    name = "Type",
    values = color_map
  ) + theme_bw()

...