ggplot不重新调整scale_fill_manual()中的颜色顺序?

时间:2018-06-01 15:50:57

标签: r ggplot2 violin-plot

我正在创作一些小提琴情节,并希望给它们上色。它适用于维度9的矩阵,如我之前的问题

https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events

但是当我将尺寸增加到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 :(得分:3)

这与setting factor levels有关。由于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)