灵活重复填充调色板

时间:2015-12-22 13:08:18

标签: r ggplot2

我希望根据变量的级别创建一个带填充的频率图。此变量的级别高于我希望使用的填充调色板中的颜色:scale_fill_economist()。填充主要用于简化解释,因此并非所有级别颜色都必须是唯一的。因此,我希望循环使用3种颜色。

我遇到两个问题: 1)我的情节包括一个NAs级别,我无法通过我想出的方法(我在下面包括)中得到颜色。 2)虽然我使用的当前数据集代表19个级别(包括NA级别),但我希望定期重新创建该级别,其中将添加更多级别。因此,我希望代码具有灵活性。我目前的代码是硬编码的。

我设法完成的可重复的例子:

library(ggplot2)
library(ggthemes)
Tempfreq <- structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
                              8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, NA), .Label = c("A", 
                                                                                                   "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
                                                                                                   "O", "P", "Q", "R"), class = "factor"), Freq = c(4L, 1L, 3L, 
                                                                                                                                                    1L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 7L, 3L, 4L, 1L, 4L, 2L, 27L
                                                                                                   )), .Names = c("Var1", "Freq"), row.names = c(NA, -19L), class = "data.frame")
ggplot(data=Tempfreq, aes(x=Var1, y=Freq, fill=Var1)) + 
geom_bar(stat='identity') + guides(fill=FALSE) + xlab("Level") + ylab("Frequency") + ggtitle("Title") +
geom_text(aes(label=Freq), vjust = 0.5, hjust= -1, size=4, family="ITC Officina Sans") +
coord_flip() + theme_economist() + 
scale_fill_manual(values=c(rep(economist_pal(fill=TRUE)(3), times=length(Tempfreq$Var1)/3), economist_pal(fill=TRUE)(1)))

重要的主线是最后一行,包括scale_fill_manual命令。此命令调用economist_pal()调色板的3个值,并以Var1的长度除以3重复此值。当19/3 = 6.33时,这是向下舍入的,这只会填满18个等级。这就是为什么我要添加一个调色板的值。但是,如图所示,这不会填充NA级别:

我希望有人可以帮助我填写NA数据,并使这段代码变得灵活。

1 个答案:

答案 0 :(得分:4)

这对你有用吗?

首先,我们将因子Var1的级别更改为包括&#34;缺少&#34;并且制造&#39; NA&#39;,&#34; Missing&#34;:

levels(Tempfreq$Var1) <- c(levels(Tempfreq$Var1),"Missing")
Tempfreq$Var1[is.na(Tempfreq$Var1)] <- "Missing" 

然后我们使用&#39; length.out&#39;在&#39; rep&#39;中的论点创造我们的颜色:

mycols <- rep(economist_pal(fill=TRUE)(3),length.out=nrow(Tempfreq))

并在scale_fill_manual中使用这些颜色作为参数。 (当然可以不分配,但我认为这更具可读性。)

ggplot(data=Tempfreq, aes(x=Var1, y=Freq, fill=Var1)) + 
  geom_bar(stat='identity') + guides(fill=FALSE) + xlab("Level") + ylab("Frequency") + ggtitle("Title") +
  geom_text(aes(label=Freq), vjust = 0.5, hjust= -1, size=4, family="ITC Officina Sans") +
  coord_flip() + theme_economist() + 
  scale_fill_manual(values=mycols)

enter image description here