使用qplot保持一致的图例颜色

时间:2012-07-06 11:33:51

标签: r ggplot2

考虑以下数据框:

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值的颜色在图之间不一致,因此很难直接比较这些图。

如何指定ReT应始终为“红色”,并且ReF应始终为“蓝色”,例如,qplot命令始终对每个Re值使用一致颜色,而不管数据框的内容是什么? Re有一个有限且已知数量的值,因此我可以全部指定它们。

当数据框包含值TFH时,我尝试了以下操作:

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的所有可能值指定颜色,即使所有这些都可能不存在于数据框中。

1 个答案:

答案 0 :(得分:6)

使用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的{​​{1}}比例:

scale_fill_manual

enter image description here

此外,如果您的情节确实具有相同的结构,我们甚至不需要一遍又一遍地复制p + scale_fill_manual(values = color_key[names(color_key) %in% x1$Re]) 调用。我们可以简单地将我们的情节ggplot应用于新的数据集:

p

然后以相同的方式添加p1 <- p %+% x2 比例:

fill

enter image description here

最后,让我们自己混合和匹配一个新的数据集:

p1 + scale_fill_manual(values = color_key[names(color_key) %in% x2$Re])

同样的过程再次起作用:

x3 <- rbind(x1[1:2,],x2[3:4,])

enter image description here

相关问题