簡體   English   中英

用一個圖形設備產生多個小提琴圖

[英]r producing multiple violin plots with one graphic device

我有一個看起來像這樣的數據框:

bin_with_regard_to_strand CLONE3
 31                      0.14750872 
 33                      0.52735917
 28                      0.48559060
 .                            .
 .                            .

我想使用此數據框生成小提琴圖,這樣CLONE3CLONE3的給定值相對應的所有值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

vioplots

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.callvioplot應用於數據列表。 最終,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)

resultingImage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM