使用 R 中的正 x 轴为两组水平绘制条形图

Posted

技术标签:

【中文标题】使用 R 中的正 x 轴为两组水平绘制条形图【英文标题】:Plot barplot horizontaly for two groups using positive x axis in R 【发布时间】:2019-11-21 09:45:44 【问题描述】:

给定以下矩阵

df <- matrix(c(10,8, 20, 6, 20, 25,"exp", "cnt", "exp","cnt","exp","cnt","gene1","gene1","gene2","gene2","gene3","gene3"), 
nrow=6, dimnames=list(c("1", "2", "3","4","5","6"),c("Abundance", "Group","gene")  )) 

我想水平绘制两组“exp”和“cnt”的条形图,由一条垂直线在零处分隔,y 轴显示对应于每个基因的正值,x 轴显示基因名称。 举个例子:

我使用 ggplot 尝试了以下代码,但没有成功。

ggplot(df, aes(x=gene))+
  geom_bar(aes(y=Abundance, fill="exp"), stat="identity")+
  geom_bar(aes(y=-Abundance, fill="cnt"),  stat="identity")+
  scale_fill_manual("Group",values=c(exp="red",cnt="green"))+
  labs(y="Abundance")+coord_flip()

有什么建议吗?

【问题讨论】:

不工作怎么办?这就是为什么要具体化的好处:当我运行你的代码时,我收到一条错误消息,非常清楚地告诉我数据需要是一个数据框。你有别的东西吗? 是的..这是真的。除了生成数据框之外,我还遇到了一些问题,即为两组设置正 x 值并显示对应于每个组的正确基因值。 【参考方案1】:

您的代码是正确的,但您的问题是您将 data.frame 设为矩阵。 ggplot 仅将 data.frames 作为输入。第二个问题是矩阵只能保存一种数据类型,因此它将所有内容都转换为字符(因此,当您尝试将 Abundance 设为负数时会出错)

将您的数据放入 data.frame 中,它将起作用:

library(tidyverse)

df <- tibble(Abundance = c(10, 8, 20, 6, 20, 25), 
             Group = c("exp", "cnt", "exp", "cnt", "exp", "cnt"),
             gene = rep(paste0("gene", 1:3), each = 2))
df
#> # A tibble: 6 x 3
#>   Abundance Group gene 
#>       <dbl> <chr> <chr>
#> 1        10 exp   gene1
#> 2         8 cnt   gene1
#> 3        20 exp   gene2
#> 4         6 cnt   gene2
#> 5        20 exp   gene3
#> 6        25 cnt   gene3

ggplot() + 
    geom_bar(data = filter(df, Group == "cnt"), 
             aes(x = gene, y = Abundance, fill = Group),
             stat = 'identity', position = 'stack') + 
    geom_bar(data = filter(df, Group == "exp"), 
             aes(x = gene, y = -Abundance, fill = Group), 
             stat = 'identity', position = 'stack') + 
    coord_flip() + 
    geom_hline(yintercept = 0, linetype = "dashed")

由reprex package (v0.3.0) 于 2019 年 7 月 11 日创建

【讨论】:

谢谢。似乎该图对两组显示相同的值,而在 df 中它们对于每个基因都不同。运行一个类似的脚本我遇到了同样的问题(镜面反射值和负/正轴)。您知道如何将两个组的 x 轴设置为正值并显示与每个基因/组的值对应的条吗?

以上是关于使用 R 中的正 x 轴为两组水平绘制条形图的主要内容,如果未能解决你的问题,请参考以下文章

绘制水平堆积条形图不适用于日期中的 x 轴

在 pandas 中创建一个条形图,x 轴为日期,另一列中的每个值一个条形图

R语言 条形图

R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签

R语言ggplot2可视化绘制分组水平条形图并在条形图的各种位置添加数值标签实战

R中具有多列整数的堆积条形图