geom_bar ggplot2 具有正值和负值的堆叠、分组条形图 - 金字塔图

Posted

技术标签:

【中文标题】geom_bar ggplot2 具有正值和负值的堆叠、分组条形图 - 金字塔图【英文标题】:geom_bar ggplot2 stacked, grouped bar plot with positive and negative values - pyramid plot 【发布时间】:2016-11-11 03:29:47 【问题描述】:

我什至不知道如何正确描述我正在尝试生成的情节,这不是一个好的开始。我将首先向您展示我的数据,然后尝试解释/展示包含它的元素的图像。

我的数据:

   strain condition count.up count.down
1    phbA  balanced      120       -102
2    phbA   limited      114       -319
3    phbB  balanced      122       -148
4    phbB   limited       97       -201
5   phbAB  balanced      268       -243
6   phbAB   limited      140       -189
7    phbC  balanced       55        -65
8    phbC   limited      104       -187
9    phaZ  balanced       99        -28
10   phaZ   limited      147       -205
11   bdhA  balanced      246       -159
12   bdhA   limited      143       -383
13  acsA2  balanced      491       -389
14  acsA2   limited      131       -295

我有七个样本,每个样本有两种情况。对于这些样本中的每一个,我都有下调的基因数量和上调的基因数量(count.down 和 count.up)。

我想对此进行绘制,以便对每个样本进行分组;所以 phbA 平衡在 phbA 限制旁边被躲避。每个条形图的正侧都有一部分(代表 count.up #),负侧有一部分(代表 count.down #)。

我希望“平衡”条件下的条是一种颜色,而“有限”条件下的条是另一种颜色。理想情况下,每种颜色会有两个渐变(一个用于 count.up,​​一个用于 count.down),只是为了在条形的两个部分之间产生视觉差异。

一些图片有我想要组合在一起的元素:

我还尝试应用这个 *** 示例的一些部分,但我不知道如何使它适用于我的数据集。 I like the pos v. neg bars here; a single bar that covers both, and the colour differentiation of it. This does not have the grouping of conditions for one sample, or the colour coding extra layer that differentiates condition

我已经尝试了很多东西,但我就是做不好。我认为我真的很挣扎,因为很多 geom_bar 示例使用计数数据,该图会自行计算,而我正在给它直接计数数据。我似乎无法在我的代码中成功地做出这种区分,当我转移到stat= "identity" 时,一切都变得一团糟。任何想法或建议将不胜感激!

使用建议的链接: 所以我一直在用它作为模板,但我被卡住了。

df <- read.csv("countdata.csv", header=T) 
df.m <- melt(df, id.vars = c("strain", "condition")) 
ggplot(df.m, aes(condition)) + geom_bar(subset = ,(variable == "count.up"),    aes(y = value, fill = strain), stat = "identity") + geom_bar(subset = ,(variable == "count.down"), aes(y = -value, fill = strain), stat = "identity") + xlab("") + scale_y_continuous("Export - Import",formatter = "comma") 

当我尝试运行 ggplot 行时,它返回错误:找不到函数“.”。我意识到我没有安装/加载 dplyr,所以我这样做了。 然后我玩了很多,最后想出了:

library(ggplot2)
library(reshape2)
library(dplyr)
library(plyr)

df <- read.csv("countdata.csv", header=T)
df.m <- melt(df, id.vars = c("strain", "condition"))

#this is what the df.m looks like now (if you look at my initial input df, I    just changed in the numbers in excel to all be positive). Included so you can see what the melt does
df.m =read.table(text = "
strain condition   variable value
1    phbA  balanced   count.up   120
2    phbA   limited   count.up   114
3    phbB  balanced   count.up   122
4    phbB   limited   count.up    97
5   phbAB  balanced   count.up   268
6   phbAB   limited   count.up   140
7    phbC  balanced   count.up    55
8    phbC   limited   count.up   104
9    phaZ  balanced   count.up    99
10   phaZ   limited   count.up   147
11   bdhA  balanced   count.up   246
12   bdhA   limited   count.up   143
13  acsA2  balanced   count.up   491
14  acsA2   limited   count.up   131
15   phbA  balanced count.down   102
16   phbA   limited count.down   319
17   phbB  balanced count.down   148
18   phbB   limited count.down   201
19  phbAB  balanced count.down   243
20  phbAB   limited count.down   189
21   phbC  balanced count.down    65
22   phbC   limited count.down   187
23   phaZ  balanced count.down    28
24   phaZ   limited count.down   205
25   bdhA  balanced count.down   159 
26   bdhA   limited count.down   383
27  acsA2  balanced count.down   389
28  acsA2   limited count.down   295", header = TRUE)

这按应变绘制,两种条件下的 count.up 和 count.down 值

ggplot(df.m, aes(strain)) + geom_bar(subset = .(variable == "count.up"), aes(y = value, fill = condition), stat = "identity") + geom_bar(subset = .(variable == "count.down"), aes(y = -value, fill = condition), stat = "identity") + xlab("") 

#this adds a line break at zero
labels <- gsub("20([0-9]2)M([0-9]2)", "\\2\n\\1",
           df.m$strain)


#this adds a line break at zero to improve readability
last_plot() + geom_hline(yintercept = 0,colour = "grey90")

我无法开始工作的一件事(不幸的是)是如何在每个条形框中显示代表“值”的数字。我已经得到了要显示的数字,但我无法将它们放在正确的位置。我要疯了!

我的数据和上面一样;这是我的代码所在的位置

我查看了大量使用 geom_text 在闪避图上显示标签的示例。我一直无法成功实施。我得到的最接近如下 - 任何建议将不胜感激!

library(ggplot2)
library(reshape2)
library(plyr)
library(dplyr)
df <- read.csv("countdata.csv", header=T)
df.m <- melt(df, id.vars = c("strain", "condition"))
ggplot(df.m, aes(strain), ylim(-500:500)) + 
geom_bar(subset = .(variable == "count.up"), 
aes(y = value, fill = condition), stat = "identity", position = "dodge") +
geom_bar(subset = .(variable == "count.down"), 
aes(y = -value, fill = condition), stat = "identity", position = "dodge") + 
geom_hline(yintercept = 0,colour = "grey90")

last_plot() + geom_text(aes(strain, value, group=condition, label=label, ymax = 500, ymin= -500), position = position_dodge(width=0.9),size=4)

这给出了这个:

你为什么不对齐!

我怀疑我的问题与我实际绘制的方式有关,或者我没有正确告诉 geom_text 命令如何定位自身。有什么想法吗?

【问题讨论】:

图形逻辑与所谓的“金字塔图”非常相似。具有连续变量值的两个属性一个左一个右,在 x 轴上测量为总数或比例,并在 y 轴上有序分组。您正在添加颜色编码的“堆叠”要求。在ggplot2 pyramid 上搜索,我很快找到了这个示例的链接,这似乎是一个准确的答案。:learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts 谢谢,我不知道该叫什么,所以我的谷歌搜索不是很成功。我会调查的。 如果您发现该链接提供了有用的模板,请随时发布您自己问题的答案。我会推迟一段时间。 您需要将代码发布为edit,而不是使用 cmets。 谢谢 42,我还是这个网站的新手。 【参考方案1】:

试试这个。就像您用两种陈述(一种表示肯定,一种表示否定)定位条形一样,以相同的方式定位文本。然后,使用vjust 微调它们的位置(在栏内或栏外)。此外,数据框中没有“标签”变量;我假设标签是value

library(ggplot2)

## Using your df.m data frame
ggplot(df.m, aes(strain), ylim(-500:500)) + 
geom_bar(data = subset(df.m, variable == "count.up"), 
   aes(y = value, fill = condition), stat = "identity", position = "dodge") +
geom_bar(data = subset(df.m, variable == "count.down"), 
   aes(y = -value, fill = condition), stat = "identity", position = "dodge") + 
geom_hline(yintercept = 0,colour = "grey90")


last_plot() + 
   geom_text(data = subset(df.m, variable == "count.up"), 
      aes(strain, value, group=condition, label=value),
        position = position_dodge(width=0.9), vjust = 1.5, size=4) +
    geom_text(data = subset(df.m, variable == "count.down"), 
      aes(strain, -value, group=condition, label=value),
        position = position_dodge(width=0.9), vjust = -.5, size=4) +
    coord_cartesian(ylim = c(-500, 500))

【讨论】:

确定vjust值,你是随便玩的,还是那个标准? 默认的 vjust 0.5 定位文本,使其与栏的末端重叠。要将文本下移,添加到默认值;要向上移动文本,请从默认值中减去。将 1 视为开始一个字符的高度。因此,我通过将 1 加到 0.5 将上面的文本向下移动了一个字符;我通过从 0.5 中减去 1 将下部文本上移了一个字符。定位文本的另一种方法是在value 中添加或减去。 我正在使用相同的代码来绘制我的数据。但是,当我运行 ggplot 代码块时,我收到以下错误 Error in -value : invalid argument to unary operator。我的数据结构是一样的,代码也是一样的。我无法知道出了什么问题。我在这部分代码中得到错误:` aes(y = -value, fill = condition), stat = "identity", position = "dodge")` @novicegeek 不确定发生了什么。我刚刚在 R 3.5.3 和带有 ggplot2 3.1.1 的 R 3.6.0 中运行了上述代码。 (在 Windows 中)。在两者中,都生成了情节。 @SandyMuspratt 感谢您的回复。我发现出了什么问题。 ggplot 脚本没有问题。问题是其中一个变量的类类型。

以上是关于geom_bar ggplot2 具有正值和负值的堆叠、分组条形图 - 金字塔图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化发散型点图发散型点图可以同时处理负值和正值并按照大小排序区分数据为发散型点图添加数值标签(Diverging Dot Plot )

R语言ggplot2可视化发散棒棒糖图发散棒棒糖图可以同时处理负值和正值并按照大小排序区分数据在棒棒糖图的数据点钟添加数值标签(Diverging Lollipop Chart )

将具有正值和负值的特征转换为所有正值以输入 CNN

对具有负值和正值的整数和浮点数列表进行排序?

在 R 中使用 For 循环匹配负值和正值

自定义不同颜色的ggplot2轴标签