我如何使用一个绘图脚本绘制一个数据中存在的多个条件?
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)
我正在使用 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)