1

我有一个看起来像这样的数据框:

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

我想使用这个数据框来生成小提琴图,使得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使用来自所有值的数据(以线分隔)生成一个图。

有没有办法做到这一点?

4

3 回答 3

1

您可以使用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

小提琴图

于 2013-06-30T11:48:55.573 回答
0

另一种替代方法mfrow是使用 layout. 组织你的情节非常方便。您只需创建一个带有绘图索引的矩阵。在这里你可以做什么。似乎 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))
于 2013-06-30T11:54:33.480 回答
0

这是一个老问题,但尽管我会提出一个不同的解决方案来让 vioplot 在同一个图(即相同的轴)上制作多个小提琴图,而不是像上面的答案那样在不同的图形对象上制作。

基本上用于do.call应用于vioplot数据列表。归根结底,vioplot 写得不是很好(甚至不能设置标题、轴名等)。我通常更喜欢base 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)

结果图像

于 2017-01-17T21:43:16.180 回答