我希望创建一个频率图,并根据变量的级别进行填充。此变量的级别比我要使用的填充调色板中的颜色多scale_fill_economist()
。填充主要用于简化解释,因此并非所有色阶颜色都需要唯一。因此,我希望循环显示3种颜色。
我遇到两个问题:1)我的绘图包含一个带有NA的色阶,我无法通过我想出的方法(在下面包括)对它进行着色。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数据,并使此代码更灵活。
这对您有用吗?
首先,我们将因子Var1的级别更改为包括“ Missing”,并使“ NA”为“ Missing”:
levels(Tempfreq$Var1) <- c(levels(Tempfreq$Var1),"Missing") Tempfreq$Var1[is.na(Tempfreq$Var1)] <- "Missing"
然后,在“ rep”中使用“ length.out”参数来创建颜色:
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)