我正在使用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"))
}
有人可以帮助我吗? 预先谢谢
答案 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)
答案 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)