上个月我一直在加快速度。
这是我的问题:
在ggplot2中为具有稳定映射的分类变量分配颜色有什么好方法?我需要在一组图表中具有一致的颜色,这些图表具有不同的子集和不同数量的分类变量。
例如,
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个级别。
然而,两组中的特定级别最终会有不同的颜色,这使得更难以一起阅读图形。
我是否需要在数据框中创建颜色矢量?或者是否有另一种方法可以为类别指定特定的颜色?
答案 0 :(得分:157)
对于像OP中的确切示例这样的简单情况,我同意Thierry的答案是最好的。但是,我认为指出另一种方法变得更容易,当您尝试在多个数据帧之间保持一致的颜色方案时,不都是通过对单个大数据帧进行子集化而获得的。如果从单独的文件中提取多个数据框中的因子级别,并且并非所有因子级别都显示在每个文件中,则可能会变得单调乏味。
解决此问题的一种方法是创建自定义手动色标,如下所示:
#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
第一张情节如下:
,第二个情节看起来像这样:
这样,您无需记住或检查每个数据框,以确定它们具有适当的级别。
答案 1 :(得分:35)
malcook his comment中answer指出的情况与此相同:不幸的是Thierry malcook与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()
这是第一个数字:
和第二个数字:
我们可以看到颜色不会保持固定,例如E从品红色切换到蓝色。
根据his comment中的hadley和his comment中的{{3}}的建议,使用limits
的代码正常运行:
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) +
geom_point() +
scale_colour_discrete(drop=TRUE,
limits = levels(dataset$fCategory))
给出了下图,这是正确的:
这是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
答案 2 :(得分:19)
最简单的解决方案是将分类变量转换为子集之前的因子。底线是你需要一个在所有子集中具有完全相同级别的因子变量。
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 = category)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()
使用因子变量
ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()
答案 3 :(得分:12)
根据joran非常有用的答案,我能够为布尔因子(TRUE
,FALSE
)提供稳定色标的解决方案。
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对二进制色标没有多大帮助,因此需要手动定义所需的两种颜色。
此处myboolean
是myDataFrame
中保留TRUE / FALSE因子的列的名称。 date
和duration
是在此示例中要映射到绘图的x和y轴的列名。
答案 4 :(得分:6)
这是一篇旧帖子,但我一直在寻找这个问题的答案,
为什么不尝试这样的事情:
scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))
如果您有明确的价值观,我就不明白为什么这不应该有效。