2013-10-17 97 views
2

我有一個數據幀mdata看起來像:Vioplot R:如何設置軸標籤

>head(mdata) 

      ID variable value 
SJ5444_MAXGT coding 4.241920 
SJ5426_MAXGT coding 4.254331 
HR1383_MAXGT coding 4.244994 
HR5522_MAXGT missense 4.250347 
CH30041_MAXGT missense 4.303174 
SJ5438_MAXGT utr.3 4.242218 

,我試圖繪製小提琴的情節是這樣的:

x1<- mdata$value[mdata$variable=='coding'] 
x2<- mdata$value[mdata$variable=='missense'] 
x3<- mdata$value[mdata$variable=='utr.3'] 

vioplot(x1, x2, x3, names=as.character(unique(mdata$variable)), col="red") 
title("Violin Plot: Log10 values") 

但我有另一種據幀ndata它看起來像:

>head(ndata) 

      ID variable value 
SJ5444_MAXGT coding 17455 
SJ5426_MAXGT coding 17961 
HR1383_MAXGT coding 17579 
HR5522_MAXGT missense 17797 
CH30041_MAXGT missense 20099 
SJ5438_MAXGT utr.3 17467 

基本上MDATA $值是:

mdata$value = log10(ndata$value) 

所以我可以讓小提琴劇情好。但我需要更改Y軸標籤以匹配ndata $值而不是mdata $值。我正在繪製mdata $值,但想要從ndata $值中獲取Y軸標籤。僅供參考,這是實際的數據,實際數據&最小值和最大值是12 & 36937的一個子集,我知道如何使用繪製它的箱線圖:

axis(side=2,labels=round(10^(seq(log10(min(ndata$value)),log10(max(ndata$value)),len=5))),at=seq(log10(min(ndata$value)),log10(max(ndata$value)),len=5)) 

但我不能繪製Y軸標籤以匹配小提琴圖中的ndata $值。有什麼建議麼?

P.S.我找不到標籤vioplotviolinplot,所以我無法標記它。

回答

2

vioplot不是很靈活 - 它不允許您關閉軸標籤或修改它們 - 但您可以先創建自己的空圖,然後用vioplot(...,add=TRUE)將小提琴圖添加到它,然後手動添加標籤,如下所示:

## make up data 
set.seed(101) 
x1 <- rlnorm(1000,meanlog=3,sdlog=1) 
x2 <- rlnorm(1000,meanlog=3,sdlog=2) 
x3 <- rlnorm(1000,meanlog=2,sdlog=2) 

現在創建情節:

library(vioplot) 
par(las=1,bty="l") ## my preferred setting 
## set up empty plot 
plot(0:1,0:1,type="n",xlim=c(0.5,3.5),ylim=range(log10(c(x1,x2,x3))), 
    axes=FALSE,ann=FALSE) 
vioplot(log10(x1),log10(x2),log10(x3),add=TRUE) 
axis(side=1,at=1:3,labels=c("first","second","third")) 
axis(side=2,at=-2:4,labels=10^(-2:4)) 

enter image description here

Altern好吧,你可以使用ggplot2::geom_violin()以及scale_y_log10()(我認爲)。

+0

是有一種方法可以添加較小的刻度(以對數爲單位)? – ToNoY

1

根據本Bolker的建議下,我用GGPLOT2 :: geom_violin()取得我想要的東西,繪製LOG10(值),但使用標籤「值」本身在Y軸:

ggplot(mdata, aes(variable, log10(value))) + geom_violin(colour="black",fill="red") 
+ scale_y_continuous(
breaks = seq(log10(min(mdata$value)),log10(max(mdata$value)),len=5), 
labels = round(10^(seq(log10(min(mdata$value)),log10(max(mdata$value)),len=5))) 
)