请考虑以下数据框:
x = read.table(text = 'Lo Re Pe
1 T 33
1 F 22
1 H 11
2 T 22
2 F 22', header = TRUE)
Run Code Online (Sandbox Code Playgroud)
和以下情节:
qplot(factor(Lo), data=x, geom='bar', fill=Re, weight=Pe,
xlab='L', main='Title', ylab='Pe')
Run Code Online (Sandbox Code Playgroud)
现在考虑这个数据框:
x <- read.table(text = 'Lo Re Pe
1 D 33
1 K 22
2 D 22
2 K 22', header=TRUE)
Run Code Online (Sandbox Code Playgroud)
用同样的qplot声明.
分配给每个Re值的颜色在图之间不一致,因此很难直接比较这些图.
例如,如何指定该Re值T应始终为"红色",并且该Re值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")))
Run Code Online (Sandbox Code Playgroud)
但是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)
Run Code Online (Sandbox Code Playgroud)
现在这是你的第一个情节,但翻译成ggplot():
p <- ggplot(x1,aes(x = factor(Lo))) +
geom_bar(aes(fill = Re,weight = Pe)) +
labs(x = 'L',y = 'Pe') +
opts(title = 'Title')
Run Code Online (Sandbox Code Playgroud)
为了使图表之间的颜色保持一致,并防止未使用的颜色出现在图例中,我们只需创建一个主颜色键,并将其所需的子集传递给我们的比例:
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)))
Run Code Online (Sandbox Code Playgroud)
(您也可以使用该levels功能执行类似操作,但我希望防止包含未出现在数据集中的级别.)
显然,你可以选择你喜欢的任何颜色.现在我可以通过仅传递与以下内容相关的部分来自定义fill绘图的比例:pcolor_keyscale_fill_manual
p + scale_fill_manual(values = color_key[names(color_key) %in% x1$Re])
Run Code Online (Sandbox Code Playgroud)

此外,如果您的情节确实具有相同的结构,我们甚至不需要反复复制该ggplot调用.我们可以简单地将我们的绘图p应用于新的数据集:
p1 <- p %+% x2
Run Code Online (Sandbox Code Playgroud)
然后fill以相同的方式添加比例:
p1 + scale_fill_manual(values = color_key[names(color_key) %in% x2$Re])
Run Code Online (Sandbox Code Playgroud)

最后,让我们自己混合和匹配一个新的数据集:
x3 <- rbind(x1[1:2,],x2[3:4,])
Run Code Online (Sandbox Code Playgroud)
相同的过程再次有效:
p3 <- p %+% x3
p3 + scale_fill_manual(values = color_key[names(color_key) %in% x3$Re])
Run Code Online (Sandbox Code Playgroud)
