2015-03-31 85 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