Добавьте пользовательские метки на столбцы в гистограмме с несколькими переменными
Я создал гистограмму с накоплением в 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 также немного странно, так как, когда я пытаюсь добавить координаты, я не могу добавить конкретные координаты для каждой переменной (например, Нассау, Нассау, Тигра, Тигра, PT), только универсальные координаты, которые затем применяются к каждый аспект. Какие-либо предложения??
Спасибо!
2 ответа
Вы можете создать новый фрейм данных, который содержит 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()
где значения х Burst
, значение y установлено на некоторую константу (1.1), а метка nsamp
, Угол текста контролируется аргументом angle=
, inherit.aes=FALSE
используется для игнорирования fill=variable
за geom_text()
,
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
фрейм, в котором есть переменные Burst и sample, а также счетчики. (Вы хотите убедиться, что все данные правильно выстроены.)
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))
Теперь я перемещаю заливку и эстетически 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))