[英]ggplot stacked bar graph with bars relating to two different variables with percentages
[英]Add custom labels to bars in ggplot stacked bar graph with multiple variables
我在ggplot2中创建了一个带有多个变量的堆积条形图:
使用以下代码:
library(ggplot2)
ggplot(meltd, aes(x=Burst, y=value, fill=variable)) +
geom_bar(stat="identity") + facet_grid(~samp,scales="free",space="free") +
theme_bw() + scale_fill_manual("Fertilization",values = c('#98FB98', '#FF6347')) +
scale_x_continuous(breaks = seq(1, 19, by = 1))
在此数据上(有序):
Burst samp %Fert %Unfert
1 1 Nassau 1.0000000 0.000000000
5 2 Nassau 0.9793237 0.020676300
8 3 Nassau 0.9774301 0.022569886
16 4 Nassau 0.9750000 0.025000000
13 5 Nassau 0.9734843 0.026515719
12 6 Nassau 0.9651163 0.034883721
17 7 Nassau 0.9516807 0.048319328
4 8 Nassau 0.9444444 0.055555556
9 9 Nassau 0.9183673 0.081632653
14 10 Nassau 0.9106901 0.089309907
18 11 Nassau 0.9074555 0.092544547
7 12 Nassau 0.9017857 0.098214286
10 13 Nassau 0.8622995 0.137700535
3 14 Nassau 0.8559867 0.144013322
6 15 Nassau 0.8551978 0.144802240
15 16 Nassau 0.8389423 0.161057692
11 17 Nassau 0.7916667 0.208333333
19 18 Nassau 0.6976611 0.302338930
2 19 Nassau 0.4482759 0.551724138
25 1 Nassau PT 0.8896552 0.110344828
24 2 Nassau PT 0.1836735 0.816326531
20 1 Tiger 0.9980843 0.001915711
22 2 Tiger 0.9971968 0.002803175
21 3 Tiger 0.9934823 0.006517695
23 4 Tiger 0.8092784 0.190721649
26 1 Tiger PT 0.7407045 0.259295499
27 2 Tiger PT 0.5734797 0.426520270
28 3 Tiger PT 0.4337979 0.566202091
然后将其融化以为ggplot创建此数据框:
Burst samp variable value
1 1 Nassau %Fert 1.000000000
2 2 Nassau %Fert 0.979323700
3 3 Nassau %Fert 0.977430114
4 4 Nassau %Fert 0.975000000
5 5 Nassau %Fert 0.973484281
6 6 Nassau %Fert 0.965116279
7 7 Nassau %Fert 0.951680672
8 8 Nassau %Fert 0.944444444
9 9 Nassau %Fert 0.918367347
10 10 Nassau %Fert 0.910690093
11 11 Nassau %Fert 0.907455453
12 12 Nassau %Fert 0.901785714
13 13 Nassau %Fert 0.862299465
14 14 Nassau %Fert 0.855986678
15 15 Nassau %Fert 0.855197760
16 16 Nassau %Fert 0.838942308
17 17 Nassau %Fert 0.791666667
18 18 Nassau %Fert 0.697661070
19 19 Nassau %Fert 0.448275862
20 1 Nassau PT %Fert 0.889655172
21 2 Nassau PT %Fert 0.183673469
22 1 Tiger %Fert 0.998084289
23 2 Tiger %Fert 0.997196825
24 3 Tiger %Fert 0.993482305
25 4 Tiger %Fert 0.809278351
26 1 Tiger PT %Fert 0.740704501
27 2 Tiger PT %Fert 0.573479730
28 3 Tiger PT %Fert 0.433797909
29 1 Nassau %Unfert 0.000000000
30 2 Nassau %Unfert 0.020676300
31 3 Nassau %Unfert 0.022569886
32 4 Nassau %Unfert 0.025000000
33 5 Nassau %Unfert 0.026515719
34 6 Nassau %Unfert 0.034883721
35 7 Nassau %Unfert 0.048319328
36 8 Nassau %Unfert 0.055555556
37 9 Nassau %Unfert 0.081632653
38 10 Nassau %Unfert 0.089309907
39 11 Nassau %Unfert 0.092544547
40 12 Nassau %Unfert 0.098214286
41 13 Nassau %Unfert 0.137700535
42 14 Nassau %Unfert 0.144013322
43 15 Nassau %Unfert 0.144802240
44 16 Nassau %Unfert 0.161057692
45 17 Nassau %Unfert 0.208333333
46 18 Nassau %Unfert 0.302338930
47 19 Nassau %Unfert 0.551724138
48 1 Nassau PT %Unfert 0.110344828
49 2 Nassau PT %Unfert 0.816326531
50 1 Tiger %Unfert 0.001915711
51 2 Tiger %Unfert 0.002803175
52 3 Tiger %Unfert 0.006517695
53 4 Tiger %Unfert 0.190721649
54 1 Tiger PT %Unfert 0.259295499
55 2 Tiger PT %Unfert 0.426520270
56 3 Tiger PT %Unfert 0.566202091
每列代表一个鸡蛋样品,以及该样品中所含受精卵和未受精卵的百分比。 我想做的是在最下面的向量中注释最顶部的每一列,以包括每个样本中的卵数。
[1] 20.0 29.0 619.0 36.0 970.0 443.0 112.0 1594.0 98.0 374.0 180.0 215.0 248.0
[14] 342.0 208.0 40.0 238.0 481.0 305.0 1045.0 457.0 1768.0 97.0 220.5 217.5 255.5
[27] 296.0 287.0
我遇到了问题,因为条形图被分成4个变量,而且还因为它是堆积的条形图。 例如,我尝试将卵数的向量加倍并将其绑定到融化的数据框中,但是当我使用注释绘制文本时,将卵数放入每列的%Fert和%Unfert块中(因此2个值),而我只想在每个列的顶部代表一个值,代表每个样本或列中鸡蛋的总数。 使用geom_text函数也有些古怪,因为当我尝试添加坐标时,我似乎无法为每个变量(例如Nassau,Nassau PT,Tiger,Tiger PT)添加特定的坐标,因此只能将通用坐标应用于每个方面。 有什么建议么??
谢谢!
你可以创建一个包含新的数据帧Burst
和samp
列中包含的样本数原始数据帧列。 余由服用前28行和前两列该数据帧meltd
并加入nsamp
柱,用取样数。
df.text=cbind(meltd[1:28,1:2],nsamp=round(runif(28,10,200)))
head(df.text)
Burst samp nsamp
1 1 Nassau 64
2 2 Nassau 88
3 3 Nassau 57
4 4 Nassau 44
5 5 Nassau 59
6 6 Nassau 86
然后,将标签与geom_text()
添加在一起,其中x值为Burst
,y值设置为某个常数(1.1),标签为nsamp
。 文本的角度由参数angle=
控制。 inherit.aes=FALSE
用于忽略geom_text()
fill=variable
。
ggplot(meltd, aes(x=Burst, y=value, fill=variable)) +
geom_bar(stat="identity") + facet_grid(~samp,scales="free",space="free") +
theme_bw() + scale_fill_manual("Fertilization",values = c('#98FB98','#FF6347')) +
scale_x_continuous(breaks = seq(1, 19, by = 1))+
geom_text(data=df.text,aes(x=Burst,y=1.1,label=nsamp),
inherit.aes=FALSE,angle=90,hjust=1)
最简单的方法可能只是创建一个新的数据集,而不是尝试将其添加到保持鸡蛋状态的data.frame中。
在这里,我根据meltd
帧制作一个data.frame,其中包含Burst和samp变量以及计数。 (您将要确保正确排列所有数据。)
counts<-c(20.0, 29.0, 619.0, 36.0, 970.0, 443.0, 112.0, 1594.0, 98.0, 374.0, 180.0, 215.0, 248.0, 342.0, 208.0, 40.0, 238.0, 481.0, 305.0, 1045.0, 457.0, 1768.0, 97.0, 220.5, 217.5, 255.5, 296.0, 287.0)
eggcounts <- cbind(unique(meltd[, 1:2]), counts=as.integer(counts))
现在,我将填充和y美学geom_bar()
因为我们的文本不需要这些,然后添加文本
ggplot(meltd, aes(x=Burst)) +
geom_bar(stat="identity", aes(y=value, fill=variable)) +
geom_text(data=eggcounts, aes(y=1, label=counts), angle=45, size=4) +
facet_grid(~samp,scales="free",space="free") +
theme_bw() +
scale_fill_manual("Fertilization",values = c('#98FB98', '#FF6347')) +
scale_x_continuous(breaks = seq(1, 19, by = 1))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.