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

how i can plot the multiple condition present in one data using one plot script?

我正在使用 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 个解决方案:

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

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 的解决方案: 这行代码在一个框架内绘制所有箱线图:

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)

很难创建具有这么多组的箱线图,同时仍然具有可读性。

# 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)