ggplot颜色基于因子的总数,而不仅仅是R中的图中的因子

时间:2015-09-30 20:13:08

标签: r plot ggplot2

我想制作两个情节。一个显示变量x的箱线图按因子类别1分割,第二个图表相同,但变量y。

我在下面提供了可重现的代码。

require(ggplot2)

dataset <- data.frame(category1 = rep(LETTERS[1:5], 100),
                  y = rnorm(500, mean = rep(1:5, 100)),
                  z = rnorm(500, mean = rep(c(1:4,NA), 100)))

ggplot(dataset, aes(x=factor(category1), y=y, fill=category1)) + geom_boxplot()
ggplot(dataset, aes(x=factor(category1), y=z, fill=category1)) + geom_boxplot()

情节很好,除了我想让颜色透过,即使类别1中A的颜色始终与红色相同。我知道ggplot基于色轮除以5,然后分别为4,但是我不知道如何使它总是除以5并且使用相同的颜色,即使没有因子z中的值E,在第二个图中。

2 个答案:

答案 0 :(得分:0)

您应手动设置颜色以确保在两个图中使用相同的调色板。以下是默认调色板的示例:

+ scale_fill_manual(values = palette("default"))

RColorBrewer具有优雅的预定义调色板,您可以在their website上浏览。

library(RColorBrewer)
ggplot(...) + 
  scale_fill_brewer(palette = "Accent")

答案 1 :(得分:0)

最简单,最优雅的方式是使用scale_fill_discrete,请参阅下面的示例第二个绘图代码:

ggplot(dataset, aes(x=factor(category1), y=z, fill=category1)) +
    geom_boxplot() + scale_fill_discrete(drop=FALSE)

但是,也可以使用以下附加代码完成,这些代码会创建一个用于绘图的调色板,然后手动设置颜色以使用此调色板。该解决方案的好处是允许用户定义任何调色板以用作固定方案。解决方案来自代码here和来自@scoa的答案。

require(ggplot2)

dataset <- data.frame(category1 = rep(LETTERS[1:5], 100),
                  y = rnorm(500, mean = rep(1:5, 100)),
                  z = rnorm(500, mean = rep(c(1:4,NA), 100)))

n <- length(levels(dataset$category1)) 
hues = seq(15, 375, length=n+1)
cpt <- hcl(h=hues, l=65, c=100)[1:n]

ggplot(dataset, aes(x=factor(category1), y=y, fill=category1)) + 
    geom_boxplot() + scale_fill_manual(values = cpt)
ggplot(dataset, aes(x=factor(category1), y=z, fill=category1)) + 
    geom_boxplot() + scale_fill_manual(values = cpt)