5

考虑以下数据框:

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,因此我可以全部指定。

当数据框包含值时,我尝试了以下操作TF并且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,即使所有这些可能都不存在于数据框中。

4

1 回答 1

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我们的情节的比例:pcolor_keyscale_fill_manual

p + scale_fill_manual(values = color_key[names(color_key) %in% x1$Re])

在此处输入图像描述

此外,如果您的所有情节都确实具有相同的结构,我们甚至不需要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])

在此处输入图像描述

于 2012-07-06T14:33:10.763 回答