如何使用ggplot箱形图基因表达数据框仅对特定基因进行子集,并在2个条件下划分我的样本

时间:2017-07-20 18:33:06

标签: r ggplot2 boxplot

我是R的新人,我有一些与bloxpot有关的基本问题。我有一个数据框9800 obs。 (这些是基因)有17个变量(这些是我的样本),以及这些基因的表达值。我在下面放了一个简化的例子。

View(df) 

           sample1   sample2  sample3  

gene1         1         2        25

gene2        5.2        5        32

gene3        3.1        3        50

gene4        2.5       2.6       21

首先,我想将每个样本与特定条件(响应者或无响应者)相关联。在这种情况下,样本1和2将是响应者而样本3是非响应者。如果我创建这样的数据框会有效吗?

condition <- c('responder','responder','non-responder')
sample_condition <- cbind(colnames(df), condition)
View(sample_condition)

sample     condition

sample1    responder

sample2    responder

sample3    non-responder

现在,我想用ggplot做一个箱形图,显示我设计的2个条件下gene1的表达值。 example of the boxplot I want. I would like to include the dots for each sample as well

我认为我的问题实际上是如何告诉ggplot()绘制仅仅特定基因的df子集并将我的样本分成我之前设计的2个条件。

提前致谢!

2 个答案:

答案 0 :(得分:1)

欢迎来到堆栈, 看起来你需要首先从宽格式数据转换为长格式数据,然后创建一个boxplot。我将在tidyverse中使用Hadley Wickham的几个包来实现这一目标。

library(tidyverse)
df <- gather(df, condition, values, -condition)
ggplot(df, aes(condition, values))+
  geom_boxplot()

完成基础绘图后,您可以在顶部添加一些透明度或alpha以及围绕垂直轴的一些“摆动”,以使它们更好地显示颜色。

ggplot(df, aes(condition, values, color = condition))+
  geom_boxplot(outler.fill = F, alpha = .5)+
  geom_jitter(alpha = .5,width = .1)

答案 1 :(得分:1)

您的示例数据

df <- data.frame(sample1=runif(4),
                 sample2=runif(4),
                 sample3=runif(4))
rownames(df) <- c("gene1","gene2","gene3","gene4")

        sample1    sample2   sample3
gene1 0.7068424 0.81313273 0.1021884
gene2 0.2212768 0.87664923 0.3599538
gene3 0.7835704 0.08712978 0.7942733
gene4 0.3909335 0.70202803 0.8851641

定义您的响应者和非响应者

responders <- c("sample1","sample2")
nonresponders <- setdiff(colnames(df),responders)

仅过滤gene 1和标签条目

library(tidyverse)
gene1 <- df[1,] %>%
           gather() %>%         
       mutate(category=ifelse(key%in%responders,"responder","nonresponder"))

制作情节

qplot(x=category, y=value, data=gene1, geom=c("boxplot","jitter"), fill=category)