我正在使用ggplod制作一个重复的条形图,我几乎得到了我想要的,除了这个错误我无法修复。
我正在绘制的数据:
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()
这就是我得到的情节
我一直在寻找解决方案,但什么也没找到,我无法单独想出一个,所以我想问,以前是否有人处理过这个问题。
问题来自你的scale_y_continuous
。您将其设置为计数
列的最大值,这将切断最大值列,因为它正好处于绘图的极限。
将scale_y_continuous
的相应部分更改为:限制=max(teste$数)*c(-1.05,1.05)
。
还有一些最佳实践颜色建议:避免使用红绿组合,因为约10%的男性是色盲,无法区分这些颜色的深浅。
线scale\u y\u continuous(labels=abs,limits=max(teste$counts)*c(-1,1))
在这里是“有罪的”,因为它将轴精确地限制在3082。这将导致ggplot剪裁该条。要么省略limits=max(teste$counts)*c(-1,1)
,要么使用scale\u y\u continuous(labels=abs,limits=max(teste$counts)*c(-1.02,1.02))
老实说,您的代码充满了冗余。如果你接受一个答案,考虑接受以前的答案,因为他们已经找到了问题的关键。我只是添加这一条来提出改进代码的建议
这不仅是一个风格问题,也是一个清晰度问题,可以减少问题-一般来说,ggplot会自动为您带来很多好处。例如,在绘图中,实际上不需要手动设置scale\u离散
中断,也不需要手动设置scale\u连续
限制。
代码的其他注释在代码块中-请查看。虽然10%的色盲可能被稍微夸大了,但这确实是一个令人担忧的问题。看看这个精彩的网站,它会帮助你选择好的颜色。
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软件包(v0.3.0)于2019-08-05创建