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

Sab*_*lfy 5 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)
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值的颜色在图之间不一致,因此很难直接比较这些图.

例如,如何指定该ReT应始终为"红色",并且该ReF应始终为"蓝色",以便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,即使所有这些都可能不存在于数据帧中.

jor*_*ran 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)
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)

在此输入图像描述