【问题标题】:Barplots in pairs for each row of a dataframe数据框每一行的条形图成对
【发布时间】:2020-08-22 12:35:14
【问题描述】:

我对 R 相当陌生,所以请原谅我的菜鸟问题。 我有一个如下所示的数据框:

gene    ctrl   treated
gene_1   100   37.5
gene_2   100   20.2
...      ...   ...

对于 df 中的每一行(即每个基因),我想以这样一种方式绘制值,即 ctrl 和处理的值是一个相邻的。 下面的代码给出了一些接近我想要的东西,但输出没有按应有的方式分组:控件的条在处理样本的条之前绘制。

 barplot(height = df$df.ctrl1, df$df.avg_treated), names.arg = df$df.gene)

我知道有很多类似的问题,但我已经解决了这些问题,但没有成功。 任何人都可以帮助我了解我做错了什么?

第二个(可选)问题:如果我想根据基因 id 对条形进行颜色编码怎么办?

非常感谢。

【问题讨论】:

  • 添加ggplot2 方法是否正确?

标签: r dataframe bar-chart melt


【解决方案1】:

我会为此使用 ggplot。让我们从一个稍微扩展的例子开始:

df <- data.frame(genes   = c("gene_1", "gene_2", "gene_3", "gene_4"),
                 ctrl    = c(50, 60, 70, 80),
                 treated = c(55, 64, 75, 83))

df
#>    genes ctrl treated
#> 1 gene_1   50      55
#> 2 gene_2   60      64
#> 3 gene_3   70      75
#> 4 gene_4   80      83

我们需要做的第一件事是使用tidyr::pivot_longer 将数据框切换为长格式,将所有值放在一列中,并将“ctrl”和“治疗”的标签放在另一列中。然后我们可以使用 ggplot 来构建我们的输出:

library(tidyr)
library(ggplot2)

df %>% 
  pivot_longer(cols = c("ctrl", "treated")) %>%
  ggplot(aes(name, value, fill = genes, alpha = name)) +
  geom_col(position = position_dodge(), color = "black") +
  scale_alpha_manual(values = c(0.5, 1), guide = guide_none()) +
  facet_grid(~genes, scales = "free_x", switch = "x") +
  theme(strip.placement  = "outside",
        panel.spacing    = unit(0, "points"),
        strip.background = element_blank(),
        strip.text       = element_text(face = "bold", size = 12)) +
  labs(x = "Gene")

reprex package (v0.3.0) 于 2020 年 8 月 22 日创建

【讨论】:

  • 非常感谢!这很棒而且非常清晰。
  • @OliverBit 不客气。如果这回答了您的问题,请考虑将其标记为已接受。
  • 我并不是要利用您的耐心,但是如果我想阻止 ggplot 按字母顺序对我的数据进行排序怎么办?我发现了一些类似的问题并想出了这段代码;建立新秩序是否正确? df$genes
  • @OliverBit 您提供的级别应该是唯一的。如果您希望基因按照它们在数据框中出现的顺序出现,请执行df$genes &lt;- factor(df$genes, levels = unique(df$genes))
【解决方案2】:

考虑转置您的数据,使用dimnames 转换为矩阵。然后运行barplotlegend。下面用随机数据进行演示。注意:ylim 已针对漂亮的范围限制进行了调整。

set.seed(92220)

df <- data.frame(gene = paste("gene", 1:30),
                 ctrl = runif(30, 50, 100),
                 treated = runif(30, 50, 100))
head(df)
#     gene     ctrl  treated
# 1 gene 1 75.74607 76.15832
# 2 gene 2 61.73860 70.19874
# 3 gene 3 56.57906 63.67602
# 4 gene 4 60.23045 80.21108
# 5 gene 5 62.52773 60.86909
# 6 gene 6 85.71849 61.25974

# TRANSPOSE INTO MATRIX WITH DIMNAMES
dat <- `dimnames<-`(t(as.matrix(df[c("ctrl", "treated")])),
                    list(c("ctrl", "treated"), df$gene))

barplot(dat, beside=TRUE, col=c("blue", "red"), las=3,
        main="Control Vs. Treatment",
        ylim=range(pretty(c(0, dat*1.05))))

legend("top", legend=row.names(dat),
       fill=c("blue", "red"), ncol=2, cex=0.75)

【讨论】:

  • 这些是来自不同包的完全不同的功能; dimnames 只是将 row.namescolnames 添加到矩阵对象。您可能要比较的是转置、t()pivot_longer,它们会重塑数据(长宽)。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2020-06-05
  • 2019-03-20
  • 2016-10-10
  • 2017-10-24
  • 1970-01-01
  • 2020-08-13
相关资源
最近更新 更多