我如何使用一个绘图脚本绘制一个数据中存在的多重条件?

时间:2018-11-27 06:22:28

标签: r loops boxplot

我正在使用R studio绘制箱形图。

我的数据看起来像-

level  Q9HC84       P02768
2      232742108.4  32822363539
2      2886647577   25661800126
1      629319882.2  26745385141
1      1293306218   2173862517
0      632315638.5  994599604.8
0      221394201.3  1659282642

这是我用来绘制图形的命令:

boxplot(Q9HC84 ~ level ,  data = x , xlab = "Cases", ylab = "Protein",
        main = "Q9HC84" , notch = FALSE, 
        varwidth = TRUE, names = c("C","T","O"))

这显示了我想要的完美结果。 但是我的数据中有90种蛋白质名称,我想更改此脚本,以使其分别为每种蛋白质生成箱线图。

我对lineplot所做的事情很简单,但是在boxplot中很难找到如何应用循环的方法。我尝试了此脚本----

for(i in 3:5)
{
  x = data.frame(proteomics$level)
  y = data.frame(proteomics[i])
boxplot(y ~ x ,  xlab = "Cases", ylab = "Metabolite",
        main = "Q9HC84" , notch = FALSE, 
        varwidth = TRUE, names = c("Control","Tobacco","OSCC"))

}

有人可以帮助我吗? 预先谢谢

2 个答案:

答案 0 :(得分:0)

这里有2个解决方案:

假设您的数据(略有简化)如下所示(包含三种蛋白质,但是该数字显然可以扩展):

df <- data.frame(
  level = c(2,2,1,1,0,0),
  prot1 = c(rnorm(6)+1),
  prot2 = c(rnorm(6)),
  prot3 = c(rnorm(6)-1)
)

您可以采用以下方式重新构建数据:蛋白质名称形成一列,蛋白质名称形成另一列:

df_new <- data.frame(
  level = rep(c(2,2,1,1,0,0),3),
  protein_names = c(rep("prot1",6),rep("prot2",6),rep("prot3",6)),
  protein_values = c(df$prot1, df$prot2, df$prot3)
)
df_new

第一个解决方案是R base解决方案: 此行代码在一个框架内绘制所有箱形图:

boxplot(df_new$protein_values ~ df_new$level+df_new$protein_names)

for循环为每种蛋白质绘制单独的框架:

par(mfrow=c(1,3))
for(i in unique(df_new$protein_names)){
  boxplot(df_new[df_new$protein_names==i,]$protein_values ~   df_new[df_new$protein_names==i,]$level)
}

第二个解决方案是ggplot2解决方案:

library(ggplot2)

ggplot(df_new, aes(as.factor(level), protein_values)) +
geom_boxplot() +
facet_grid(.~protein_names)

enter image description here

答案 1 :(得分:0)

要创建具有这么多组的箱形图,同时又使图可读性是很困难的。

# generate example data
set.seed(1)
np <- 20
level <- rep(1:3, times=c(4, 5, 5))
pnames <- replicate(
  np, paste(c(sample(LETTERS, 1), sample(c(0:9, LETTERS), 5)), collapse="")
)
prot <- round(runif(np*length(level), 2213942000, 328223635400), 1)
x <- as.data.frame(cbind(level, matrix(prot, ncol=np)))
colnames(x)[-1] <- pnames


# reshape to long format
library(reshape2)
x.long <- melt(x, id.vars="level")
x.long$level <- c("C","T","O")[x.long$level]

# plot vertically, level + variable
par(xaxs="i", yaxs="i", mar=c(3.5, 3, 0.5, 0.5))
col <- c("orange", "cornflowerblue", "purple")
boxplot(value ~ level + variable, data=x.long, cex=0.5, cex.axis=0.5, las=2, 
  col=col, border=col, boxwex=0.5)

# plot horizontally, variable + level
par(xaxs="i", yaxs="i", mar=c(2, 3.5, 0.5, 0.5))
col <- rep(c("orange", "cornflowerblue", "purple"), 
  each=length(unique(x.long$variable)))
boxplot(value ~ variable + level, data=x.long, cex=0.5, cex.axis=0.5, las=1,
  horizontal=TRUE, col=col, border=col, boxwex=0.5)

enter image description here enter image description here