条形图中仅丢失一个条

时间:2019-08-05 13:24:13

标签: ggplot2 bar-chart

我正在使用ggplot处理重复的条形图,几乎可以得到所需的内容,除了无法解决的错误。

我正在绘制的数据:

      comp     reg counts
1   C0xC12      up    569
2   C0xC12    down    845
3   C0xC24      up    420
4   C0xC24    down    227
5   C0xT12      up   2904
6   C0xT12    down   2989
7   C0xT24      up   2536
8   C0xT24    down   2309
9  C12xC24      up    314
10 C12xC24    down    138
11 C12xT12      up   3006
12 C12xT12    down   3082
13 C12xT24      up   2795
14 C12xT24    down   2577
15 C24xT12      up   1381
16 C24xT12    down   1901
17 C24xT24      up    482
18 C24xT24    down    862
19 T12xT24      up   1732
20 T12xT24    down   1464
21  C0xC12   uppcw      7
22  C0xC12 downpcw     15
23  C0xC24   uppcw     10
24  C0xC24 downpcw      4
25  C0xT12   uppcw     56
26  C0xT12 downpcw     58
27  C0xT24   uppcw     49
28  C0xT24 downpcw     41
29 C12xC24   uppcw      8
30 C12xC24 downpcw      2
31 C12xT12   uppcw     64
32 C12xT12 downpcw     50
33 C12xT24   uppcw     48
34 C12xT24 downpcw     39
35 C24xT12   uppcw     35
36 C24xT12 downpcw     40
37 C24xT24   uppcw     11
38 C24xT24 downpcw     15
39 T12xT24   uppcw     33
40 T12xT24 downpcw     30

我正在运行的代码:

teste <- read.table("teste.txt", sep = "\t", header = TRUE)
ggplot(data = teste, 
       mapping = aes(x = comp, fill = reg,
                     y = ifelse(test = reg == "down" | reg == "downpcw", 
                                yes = -counts, no = counts))) +
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(teste$counts) * c(-1,1)) +
  geom_text(aes(label=counts), vjust=0.5, color="black", size=3.0, nudge_y = c(-130,130))+
  labs(y = "DEGs", x = "Groups comparisons") + scale_fill_manual(values=c("#98FB98","#FA8072","#00FF00","#FF0000")) +
  scale_x_discrete(limits=c("T12xT24", "C24xT24", "C24xT12", "C12xT24", "C12xT12", "C12xC24", "C0xT24", "C0xT12", "C0xC24","C0xC12")) +
  coord_flip()

这就是我要得到的情节

enter image description here 请注意,“ C12xT12”最大的条形图并未显示,只是其大小(3082)。

我一直在寻找解决方案,但一无所获,我无法独自提出一个解决方案,所以我问是否有人曾经处理过此问题。

3 个答案:

答案 0 :(得分:2)

这里的行scale_y_continuous(labels = abs, limits = max(teste$counts) * c(-1,1)) + 是“有罪的”,因为它将轴限制为恰好是3082。这会导致ggplot裁剪该条。 忽略limits = max(teste$counts) * c(-1,1)或使用类似scale_y_continuous(labels = abs, limits = max(teste$counts) * c(-1.02,1.02)) +

答案 1 :(得分:1)

问题来自您的scale_y_continuous。 您将其设置为counts列的最大值,该列将截断max列,因为它正好在图的极限处。 如果您将最大值乘以1.05而不是1,那么一切都会正常。
scale_y_continuous的相应部分更改为:limits = max(teste$counts) * c(-1.05,1.05)

还有一些最佳做法的颜色建议:避免使用红绿色组合,因为约10%的男人是色盲的,无法分辨出这些颜色的阴影。

答案 2 :(得分:1)

说实话,您的代码充满了冗余。如果您接受答案,请考虑接受先前的答案,因为它们可以解决问题。我只是添加此代码,以提出一些改进代码的建议。
这不仅是样式问题,而且是清晰度问题,并且可以减少问题-通常,ggplot会自动为您带来很多收益。例如,在您的绘图中,实际上不需要手动设置scale_discrete中断和手动设置scale_continuous限制。

该代码的其他注释在代码块中-看看。尽管可能会稍微夸大10%的色盲,但这确实是一个问题。看看this fabulous website-它会帮助您选择漂亮的颜色。

library(ggplot2)
teste <- data.table::fread("      comp     reg counts
1   C0xC12      up    569
                  2   C0xC12    down    845
                  3   C0xC24      up    420
                  4   C0xC24    down    227
                  5   C0xT12      up   2904
                  6   C0xT12    down   2989
                  7   C0xT24      up   2536
                  8   C0xT24    down   2309
                  9  C12xC24      up    314
                  10 C12xC24    down    138
                  11 C12xT12      up   3006
                  12 C12xT12    down   3082
                  13 C12xT24      up   2795
                  14 C12xT24    down   2577
                  15 C24xT12      up   1381
                  16 C24xT12    down   1901
                  17 C24xT24      up    482
                  18 C24xT24    down    862
                  19 T12xT24      up   1732
                  20 T12xT24    down   1464
                  21  C0xC12   uppcw      7
                  22  C0xC12 downpcw     15
                  23  C0xC24   uppcw     10
                  24  C0xC24 downpcw      4
                  25  C0xT12   uppcw     56
                  26  C0xT12 downpcw     58
                  27  C0xT24   uppcw     49
                  28  C0xT24 downpcw     41
                  29 C12xC24   uppcw      8
                  30 C12xC24 downpcw      2
                  31 C12xT12   uppcw     64
                  32 C12xT12 downpcw     50
                  33 C12xT24   uppcw     48
                  34 C12xT24 downpcw     39
                  35 C24xT12   uppcw     35
                  36 C24xT12 downpcw     40
                  37 C24xT24   uppcw     11
                  38 C24xT24 downpcw     15
                  39 T12xT24   uppcw     33
                  40 T12xT24 downpcw     30")

现在是情节

ggplot(data = teste, aes(x = comp, y = ifelse(grepl('down', reg), -counts, counts), fill = reg)) + 
    ## I reduced your statement to a simple "grepl" statement, and you don't really need to name your ifelse arguments
  geom_bar(stat = "identity") +
  geom_text(aes(label=counts), vjust=0.5, size=3.0, nudge_x = c(-0.1,0.1)) +
    ### I think nudge_x is what you want - your labels were overlapping
  scale_fill_brewer(palette = 'RdBu') + ## that's one of the palettes from colorbrewer
  coord_flip()


reprex package(v0.3.0)于2019-08-05创建