Как я могу построить несколько условий, присутствующих в одних данных, используя один сценарий построения? - PullRequest
0 голосов
/ 27 ноября 2018

Я использую 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 названий белков в данных, и я хочу изменить этот сценарий таким образом, чтобы он генерировал коробочный график для каждого белка в отдельности.

То же самое я делал с линейным графиком, который был простым, но в боксплоте это сложночтобы найти, как применить цикл.Я попробовал этот скрипт ----

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 голосов
/ 27 ноября 2018

Сложно создать блокпосты с таким количеством групп, при этом график остается читаемым.

# 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

0 голосов
/ 27 ноября 2018

Вот 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)

enter image description here

...