如何将颜色分配给ggplot2中具有稳定映射的分类variables?

我在上个月已经开始加速与R,这是我在这里的第一篇文章。 期待join社区。 这是我的问题:

将颜色分配给ggplot2中具有稳定映射的分类variables的好方法是什么? 我需要在具有不同子集和不同数量分类variables的一组图表中使用一致的颜色。

例如,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line() 

其中categoricalData有5个级别。

接着

 plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, color=categoricaldData.subset)) + geom_line() 

其中categoricalData.subset有3个级别。

然而,两组中的特定层次将以不同的颜色结束,这使得难以一起读取graphics。

我是否需要在数据框中创build颜色vector? 还是有另一种方法来分配特定的颜色类别?

谢谢

对于OP这样的简单情况,我同意Thierry的答案是最好的。 但是,我认为指出另一种方法是很有用的,因为当您尝试在多个dataframe中维护一致的颜色scheme时,这些方法并非都是通过对单个大型数据框进行子集化获得的。 在多个数据框架中pipe理因素级别可能会变得单调乏味,如果它们是从单独的文件中提取的,并不是所有的因子级别都出现在每个文件中。

解决这个问题的一种方法是创build一个自定义的手动色阶,如下所示:

 #Some test data dat <- data.frame(x=runif(10),y=runif(10), grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE) #Create a custom color scale library(RColorBrewer) myColors <- brewer.pal(5,"Set1") names(myColors) <- levels(dat$grp) colScale <- scale_colour_manual(name = "grp",values = myColors) 

然后根据需要将色标添加到图上:

 #One plot with all the data p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point() p1 <- p + colScale #A second plot with only four of the levels p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale 

第一个情节是这样的:

在这里输入图像描述

第二个情节是这样的:

在这里输入图像描述

这样你就不需要记住或者检查每个dataframe,看看它们是否有适当的级别。

我和malcook在他的评论中指出了相同的情况:不幸的是, Thierry的答案不适用于ggplot2版本0.9.3.1。

 png("figure_%d.png") set.seed(2014) library(ggplot2) dataset <- data.frame(category = rep(LETTERS[1:5], 100), x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100))) dataset$fCategory <- factor(dataset$category) subdata <- subset(dataset, category %in% c("A", "D", "E")) ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point() ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point() 

这是第一个数字:

ggplot A-E,混合的颜色

和第二个数字:

ggplot ADE,混合颜色

正如我们所看到的,颜色不会保持不变,例如E从洋红切换到蓝光。

正如malcook在他的评论中和hadley在他的评论中所暗示的那样 ,使用limits的代码正常工作:

 ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point() + scale_colour_discrete(drop=TRUE, limits = levels(dataset$fCategory)) 

给出下图,这是正确的:

正确的ggplot

这是sessionInfo()的输出:

 R version 3.0.2 (2013-09-25) Platform: x86_64-pc-linux-gnu (64-bit) locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] methods stats graphics grDevices utils datasets base other attached packages: [1] ggplot2_0.9.3.1 loaded via a namespace (and not attached): [1] colorspace_1.2-4 dichromat_2.0-0 digest_0.6.4 grid_3.0.2 [5] gtable_0.1.2 labeling_0.2 MASS_7.3-29 munsell_0.4.2 [9] plyr_1.8 proto_0.3-10 RColorBrewer_1.0-5 reshape2_1.2.2 [13] scales_0.2.3 stringr_0.6.2 

最简单的解决scheme是将分类variables转换为子集之前的因子。 最重要的是,你需要一个因子variables,在你所有的子集中都有相同的水平。

 library(ggplot2) dataset <- data.frame(category = rep(LETTERS[1:5], 100), x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100))) dataset$fCategory <- factor(dataset$category) subdata <- subset(dataset, category %in% c("A", "D", "E")) 

用一个字符variables

 ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point() ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point() 

有一个因素variables

 ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point() ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point() 

基于乔兰的非常有用的答案,我能够想出一个稳定的布尔因子色彩比例( TRUEFALSE )的解决scheme。

 boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294")) boolScale <- scale_colour_manual(name="myboolean", values=boolColors) ggplot(myDataFrame, aes(date, duration)) + geom_point(aes(colour = myboolean)) + boolScale 

由于ColorBrewer对二进制颜色比例不是很有帮助,因此需要手动定义两种颜色。

这里mybooleanmyDataFrame保存TRUE / FALSE因子的列的名称。 dateduration是在此示例中要映射到绘图的x和y轴的列名称。