考虑以下数据框:
x = read.table(text = 'Lo Re Pe
1 T 33
1 F 22
1 H 11
2 T 22
2 F 22', header = TRUE)
和下面的情节:
qplot(factor(Lo), data=x, geom='bar', fill=Re, weight=Pe,
xlab='L', main='Title', ylab='Pe')
现在考虑这个数据框:
x <- read.table(text = 'Lo Re Pe
1 D 33
1 K 22
2 D 22
2 K 22', header=TRUE)
同
qplot
陈述。分配给每个
Re
的颜色地 block 之间的值不一致,因此很难直接比较地 block 。如何指定
Re
值(value) T
例如,应始终为“红色”,并且 Re
值(value) F
例如,应始终为“蓝色”,以便 qplot
命令总是使用 一致每个 Re
的颜色值,不管数据框的内容如何? Re
的值是有限且已知的。 ,所以我可以全部指定。当数据框包含值
T
时,我尝试了以下操作, F
和 H
:qplot(factor(Lo), data=x, geom='bar', fill=Re, weight=Pe,
xlab='Loci', main='Title', ylab='Pe',
scale_fill_manual(values=c("Blue","Red","Green"),labels=c("T","F","H")))
但 R 报告关于不正确长度的错误并且不生成绘图。
理想情况下,该解决方案允许我为
Re
的所有可能值指定颜色。 ,即使所有这些可能都不存在于数据框中。
最佳答案
使用 ggplot
的模块化特性,这是完全可能的。 .我会建议你放弃qplot
, 但是, 并切换到使用 ggplot()
.从长远来看,它不会花费您任何费用并且会更方便,因为它更适合做“复杂”的事情。
让我们从您的两个数据集开始:
x1 = read.table(text = 'Lo Re Pe
1 T 33
1 F 22
1 H 11
2 T 22
2 F 22', header = TRUE)
x2 <- read.table(text = 'Lo Re Pe
1 D 33
1 K 22
2 D 22
2 K 22', header=TRUE)
现在这是你的第一个情节,但翻译成
ggplot()
:p <- ggplot(x1,aes(x = factor(Lo))) +
geom_bar(aes(fill = Re,weight = Pe)) +
labs(x = 'L',y = 'Pe') +
opts(title = 'Title')
为了使绘图中的颜色保持一致,并防止未使用的颜色出现在图例中,我们将简单地创建一个主颜色键,并仅将所需的子集传递给我们的比例:
color_key <- c('red','blue','green','black','orange')
#If Re is a character variable:
names(color_key) <- unique(c(x1$Re,x2$Re))
#If Re is a factor:
names(color_key) <- unique(c(as.character(x1$Re),as.character(x2$Re)))
(您也可以使用
levels
函数执行类似的操作,但我想防止包含未出现在数据集中的级别。)显然,您可以选择任何您喜欢的颜色。现在我可以自定义
fill
我们的情节规模p
通过只传递 color_key
的那一段与 scale_fill_manual
相关的:p + scale_fill_manual(values = color_key[names(color_key) %in% x1$Re])
此外,如果您的地 block 确实具有相同的结构,我们甚至不需要复制
ggplot
一遍又一遍地打电话。我们可以简单地应用我们的情节 p
到一个新的数据集:p1 <- p %+% x2
然后添加
fill
以同样的方式缩放:p1 + scale_fill_manual(values = color_key[names(color_key) %in% x2$Re])
最后,让我们自己混合搭配一个新的数据集:
x3 <- rbind(x1[1:2,],x2[3:4,])
同样的过程再次起作用:
p3 <- p %+% x3
p3 + scale_fill_manual(values = color_key[names(color_key) %in% x3$Re])
关于r - 与 qplot 一致的图例颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361404/