使用 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 轴为两组水平绘制条形图的主要内容,如果未能解决你的问题,请参考以下文章
在 pandas 中创建一个条形图,x 轴为日期,另一列中的每个值一个条形图
R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签