ggplot не соответствует порядку цветов в scale_fill_manual ()? - PullRequest
0 голосов
/ 01 июня 2018

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

ggplot скрипка, указать разные цвета по группе?

, но когда я увеличу размер до 15Порядок цветов не соблюдается.Почему это происходит?

Здесь это работает (9 столбцов):

library(ggplot2)
dat <- matrix(rnorm(250*9),ncol=9)

# Violin plots for columns
mat <- reshape2::melt(data.frame(dat), id.vars = NULL)

mat$variable_grouping <- as.character(sort(rep(1:9,250)))



pp <- ggplot(mat, aes(x = variable, y = value, fill = variable_grouping)) + 
  geom_violin(scale="width",adjust = 1,width = 0.5)  + scale_fill_manual(values=rep(c("red","green","blue"),3))
pp

Здесь это не работает (15 столбцов):

library(ggplot2)
dat <- matrix(rnorm(250*15),ncol=15)

# Violin plots for columns
mat <- reshape2::melt(data.frame(dat), id.vars = NULL)

mat$variable_grouping <- as.character(sort(rep(1:15,250)))



pp <- ggplot(mat, aes(x = variable, y = value, fill = variable_grouping)) + 
  geom_violin(scale="width",adjust = 1,width = 0.5)  + scale_fill_manual(values=rep(c("red","green","blue"),5))
pp

1 Ответ

0 голосов
/ 01 июня 2018

Это относится к уровням установки коэффициента .Поскольку variable_grouping является символом, ggplot2 преобразует его в коэффициент для построения.Используется порядок коэффициентов по умолчанию, где 1 всегда предшествует 2.Так что в вашем примере 11-15 все идут перед 2 в легенде.

Вы можете вручную установить порядок коэффициентов, чтобы избежать порядка по умолчанию.Я использую forcats::fct_inorder() для этого, потому что в этом случае удобно, когда вы хотите, чтобы порядок коэффициента соответствовал порядку переменной.Обратите внимание, что вы также можете напрямую использовать factor() и устанавливать порядок уровней с помощью аргумента levels.

ggplot(mat, aes(x = variable, y = value, fill = forcats::fct_inorder(variable_grouping))) + 
     geom_violin(scale="width", adjust = 1, width = 0.5)  + 
     scale_fill_manual(values=rep(c("red","green","blue"),5)
...