[英]r producing multiple violin plots with one graphic device
我有一個看起來像這樣的數據框:
bin_with_regard_to_strand CLONE3
31 0.14750872
33 0.52735917
28 0.48559060
. .
. .
我想使用此數據框生成小提琴圖,這樣CLONE3
與CLONE3
的給定值相對應的所有值bin_with_regard_to_strand
將生成一個圖。 此外,我希望所有圖都出現在同一圖形設備中(我正在使用R-studio,並且我希望所有圖都出現在一個圖窗口中)。 從理論上講,我可以這樣做:
vioplot(df$CLONE3[which(df$bin_with_regard_to_strand==1)],
df$CLONE3[which(df$bin_with_regard_to_strand==2)]...)
但是由於bin_with_regard_to_strand
具有60個不同的值,所以這似乎有點荒謬。 我嘗試使用tapply
:
tapply(df$CLONE3, df$bin_with_regard_to_strand,vioplot)
但這將打開60個不同的窗口(每個圖一個)。 或者,如果我使用了add
參數:
tapply(df$CLONE3, df$bin_with_regard_to_strand,vioplot(add=TRUE))
使用來自所有值bin_with_regard_to_strand
的數據(由線分隔)生成單個圖。
有沒有辦法做到這一點?
您可以使用par(mfrow=c(rows, columns))
(有關詳細信息,請參見?par
)。
(有關更復雜的安排,另請參見?layout
)
d <- lapply(1:6, function(x)runif(100)) # generate some example data
library("vioplot")
par(mfrow=c(3, 2)) # use a 3x2 (rows x columns) layout
lapply(d, vioplot) # call plot for each list element
par(mfrow=c(1, 1)) # reset layout
mfrow
另一種替代方法是使用layout
。 整理地塊非常方便。 您只需創建一個具有plots索引的矩陣。 在這里您可以做什么。 看來60個箱型圖是一個巨大的數目。 也許您應該分兩頁來組織它們。
以下代碼以N為函數(地塊數)
library(vioplot)
N <- 60
par(mar=rep(2,4))
layout(matrix(c(1:N),
nrow=10,byrow=T))
dat <- data.frame(bin_with_regard_to_strand=gl(N,10),CLONE3=rnorm(10*N))
with(dat ,
tapply(CLONE3,bin_with_regard_to_strand ,vioplot))
這是一個古老的問題,但是盡管我會提出一種不同的解決方案,以使vioplot在同一張圖(即同一根軸)上而不是在上面的答案之類的不同圖形對象上繪制多個小提琴圖。
基本上使用do.call
將vioplot
應用於數據列表。 最終,vioplot的書寫方式不是很好(甚至無法設置標題,軸名稱等)。 我通常更喜歡基數R,但是在這種情況下,ggplot2選項可能是可行的方法。
x<-rnorm(1000)
fac<-rep(c(1:10),each=100)
listOfData<-tapply(x,fac,function(x){x},simplify=FALSE)
names(listOfData)[[1]]<-"x" #because vioplot requires a 'x' argument
do.call(vioplot,listOfData)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.