2015-03-31 83 views
1

我有数百个箱图的个从我的巨大的数据集自动打印和我已制造的代码来着色地块“珊瑚”如果变量具有跨越选定的组的统计显着性和'海蓝宝石'如果没有检测到重要性。这是我用col=ifelse(...< 0.05,'coral','aquamarine')做的。的R - 颜色地块根据p值

我以为我的输出会更容易滑过,如果箱线图是根据p值着色。因此,我想告诉col=...将p值从0.05 - 0.01变为黄色,0.01 - 0.005变为桔黄色和< 0.005变为红色的变量着色。

我试图与

boxplot(a~b, data=df, col=if(pv1<0.05)"yellow" else if (pv1<0.01) "orange" else if (pv1<0.005) "red" else "green") 

正如你可以看到,这不会做,因为值重叠。我需要做的是写在if句子里面的范围,但我只是不知道如何去做。

这里有一些数据可以使用。请注意,组的实际p值与此处给出的值不同。我只显示pv1,2和3,以便测试代码。

a <- c(23,24,64,12,4,75,12,65,86,76) 
b <- c(1,2,2,1,2,1,3,3,1,3) 
df <- data.frame(a,b) 
pv1 <- c(0.05) 
pv2 <- c(0.01) 
pv3 <- c(0.005) 

回答

2

要修改if...else说法,你应该认为它周围(在这里,你问的其他方式,“如果它不是< 0.05,那么如果是< 0.01 ......”这是不可能的),所以你可以写:

col=if(pv1<0.005)"red" else if (pv1<0.01) "orange" else if (pv1<0.05) "yellow" else "green" 

pv1 <- 0.04 ; if(pv1<0.005)"red" else if (pv1<0.01) "orange" else if (pv1<0.05) "yellow" else "green" # "yellow" 
pv1 <- 0.004 ; if(pv1<0.005)"red" else if (pv1<0.01) "orange" else if (pv1<0.05) "yellow" else "green" # "red" 
pv1 <- 0.06 ; if(pv1<0.005) "red" else if (pv1<0.01) "orange" else if (pv1<0.05) "yellow" else "green" # "green" 
pv1 <- 0.006 ; if(pv1<0.005) "red" else if (pv1<0.01) "orange" else if (pv1<0.05) "yellow" else "green" # "orange" 

Anothe -r选项,如果你的p值是一个矢量,你可以尝试cut

mycolours <- as.character(cut(pv1, ,c(1,0.05,0.01,0.005,0), right=F, labels=c("red","orange","yellow","aquamarine"), include.lowest=T)) 

然后

boxplot(a~b, data=df, col=mycolours) 
+0

谢谢。这似乎很棒,但我希望在'if'中写出范围。在计算p值时,我需要考虑大约300个变量。由于p值在单独的向量中,我不得不写这个“减少”300次。 – 2015-03-31 07:17:04

+0

@OlliJ,我认为你所有的pvalues都在一个单独的向量中。那么,也许首先要做的事情就是将所有的pvalues放在一个单独的向量中? – Cath 2015-03-31 07:21:29

+0

@OlliJ,请参阅我的编辑解决方案,以'if ... else' – Cath 2015-03-31 07:26:20