Полосы ошибок на штабелированном баре ggplot2
Я изо всех сил стараюсь помещать строки ошибок в правильное место на штабеле. Когда я читал более раннюю запись, я использовал ddply, чтобы уложить строки ошибок. Затем это изменило порядок укладки, поэтому я заказал коэффициент. Теперь кажется, что строки ошибок правильны на одном наборе баров, но не на другом. То, что я хочу, это график, который выглядит так, как показано ниже, только со стандартной ошибкой, отображаемой с ошибками. Я перечисляю данные исходных данных и данных ddply, а также набор данных. ![enter image description here]()
Suz2$org <- factor(Suz2$org, levels = c('fungi','bacteria'),ordered = TRUE)
library(plyr)
plydat <- ddply(Suz2,.(org, group, time),transform,ybegin = copy - se,yend = copy + se)
colvec <-c("blue", "orange")
ggplot(plydat, aes(time, copy)) +
geom_bar(aes(fill = factor(org)), stat="identity", width = 0.7) +
scale_fill_manual(values = colvec) +
facet_wrap(~group,nrow = 1)+
geom_errorbar(aes(ymax=ybegin , ymin= yend ),width=.5) +
theme(panel.background = element_rect(fill='white', colour='white'),
panel.grid = element_line(color = NA),
panel.grid.minor = element_line(color = NA),
panel.border = element_rect(fill = NA, color = "black"),
axis.text.x = element_text(size=10, colour="black", face = "bold"),
axis.title.x = element_text(vjust=0.1, face = "bold"),
axis.text.y = element_text(size=12, colour="black"),
axis.title.y = element_text(vjust=0.2, size = 12, face = "bold"))
dput (plydat)
structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria"
), class = c("ordered", "factor")), time = structure(c(1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W",
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000,
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000,
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L,
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0",
"Native D707", "Notill D0", "Notill D707"), class = "factor"),
se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000,
1930000, 2980000, 43900000, 20100000, 56400000, 41200000,
75700000, 22500000, 57500000, 28100000), ybegin = c(86700000,
12690000, 33090000, 7490000, 38100000, 12800000, 14070000,
5660000, 254100000, 57800000, 176600000, 178800000, 261300000,
65900000, 266500000, 160900000), yend = c(108900000, 18310000,
47310000, 13310000, 72100000, 15800000, 17930000, 11620000,
341900000, 9.8e+07, 289400000, 261200000, 412700000, 110900000,
381500000, 217100000)), .Names = c("org", "time", "copy",
"group", "se", "ybegin", "yend"), row.names = c(NA, -16L), class = "data.frame")
dput (Suz2)
structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria"
), class = c("ordered", "factor")), time = structure(c(1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W",
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000,
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000,
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L,
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0",
"Native D707", "Notill D0", "Notill D707"), class = "factor"),
se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000,
1930000, 2980000, 43900000, 20100000, 56400000, 41200000,
75700000, 22500000, 57500000, 28100000)), .Names = c("org",
"time", "copy", "group", "se"), row.names = c(NA, -16L), class = "data.frame")
Suz2
org time copy group se
1 fungi 0W 9.78e+07 Notill D0 11100000
2 fungi 0W 1.55e+07 Notill D707 2810000
3 fungi 0W 4.02e+07 Native D0 7110000
4 fungi 0W 1.04e+07 Native D707 2910000
5 fungi 6W 5.51e+07 Notill D0 17000000
6 fungi 6W 1.43e+07 Notill D707 1500000
7 fungi 6W 1.60e+07 Native D0 1930000
8 fungi 6W 8.64e+06 Native D707 2980000
9 bacteria 0W 2.98e+08 Notill D0 43900000
10 bacteria 0W 7.79e+07 Notill D707 20100000
11 bacteria 0W 2.33e+08 Native D0 56400000
12 bacteria 0W 2.20e+08 Native D707 41200000
13 bacteria 6W 3.37e+08 Notill D0 75700000
14 bacteria 6W 8.84e+07 Notill D707 22500000
15 bacteria 6W 3.24e+08 Native D0 57500000
16 bacteria 6W 1.89e+08 Native D707 28100000
Ответы
Ответ 1
Значения как для ybegin
, так и yend
, диапазона ошибок, слишком малы для данных bacteria
. Поскольку столбцы для bacteria
находятся поверх таблиц fungi
, высота баров fungi
(plydat$copy[plydat$org == "fungi"]
) должна быть добавлена к значениям ошибок ошибок данных bacteria
.
plydat[plydat$org == "bacteria", ]
<- transform(plydat[plydat$org == "bacteria", ],
ybegin = ybegin + plydat[plydat$org == "fungi", "copy"],
yend = yend + plydat[plydat$org == "fungi", "copy"])
![enter image description here]()
Ответ 2
Лично я не очень люблю сложную гистограмму, особенно когда количество штабелированных баров велико (что не так для вас). Основная проблема заключается в том, что все, кроме самого низкого, не имеют одинаковой базовой линии. В вашем случае трудно сравнить оранжевый bacteria
класс, поскольку они не используют одну и ту же базу (значение y, copy
).
Я предлагаю использовать сюжет, называемый dotplot:
library(ggplot2)
theme_set(theme_bw())
ggplot(plydat, aes(time, copy, color = org)) +
geom_point() + facet_wrap(~group, ncol = 1) +
geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0) + coord_flip()
![enter image description here]()
Обратите внимание, что значение copy
здесь не является аддитивным, как это было в штабелированном бархате. Поскольку они имеют одно и то же базовое значение copy
(0), вы можете легко сравнивать разные значения bacteria
. Кроме того, я меняю оси x и y, чтобы упростить сравнение значения copy
(просто удалите coord_flip
, чтобы увидеть, насколько плохо работает при сравнении copy
).
Единственный реальный недостаток заключается в том, что нет простого способа судить сумму fungi
и bacteria
. В зависимости от того, что должен показать график (история диаграммы), это может быть или не быть проблемой. Вы можете добавить отдельную дополнительную категорию к org
, т.е. both
, которая является суммой обеих категорий, чтобы исправить это. Конечно, интерпретация ошибки в этой суммируемой категории нетривиальна.
Ответ 3
Из сочетания вышеупомянутых ответов я думаю, что я собираюсь пойти с чем-то вроде этого.
plydat <- ddply(Suz2,.(org),transform,ybegin = copy - se,yend = copy + se)
colvec <-c("blue", "orange")
ggplot(plydat, aes(time, copy, color = factor(org))) +
geom_point(size = 3.5) + facet_wrap(~group, ncol = 4) +
scale_color_manual(values = colvec) +
geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0.08,
color = "black", size = 0.1) +
theme(panel.background = element_rect(fill='white', colour='white'),
panel.grid = element_line(color = NA),
panel.grid.minor = element_line(color = NA),
panel.border = element_rect(fill = NA, color = "black"),
strip.background = element_blank(),
axis.text.x = element_text(size=10, colour="black", face = "bold"),
axis.title.x = element_text(vjust=0.1, face = "bold"),
axis.text.y = element_text(size=12, colour="black"),
axis.title.y = element_text(vjust=0.2, size = 12, face = "bold"))
![enter image description here]()