ggplot2 中带有错误条的分组条形图
Grouped barplot with errorbars in ggplot2
简介:
我 运行 在分组条形图上绘制一些错误条时遇到了麻烦。
我正在尝试改编一些最初用于制作下图的非分组条形图的代码:
问题:
现在我正在尝试为每个站点绘制多种空气污染物。
我正在融合两个单独的数据框(一个具有平均值,一个具有置信区间),然后将它们连接在一起。我已经成功地制作了一个分组的条形图,但是错误条看起来很疯狂!
我怎样才能正确映射我的误差线,以便它们模仿上面的非分组条形图?
可重现示例:
在下面查看我的全部数据出处:
## mean values generated from raw data for each pollutant by site:
df.mean <- structure(list(id = structure(1:5, .Label = c("A", "B", "C", "D", "E"), class = "factor"), co_mean = c(0.00965315315315315, 0.201591548253404, 0.180300223214286, 0.14681828358209, 0.136609422703303), no_mean = c(2.09379071379071, 7.17386693309651, 5.11211979166667, 7.070375, 8.84492922564529), no2_mean = c(2.90698198198198, 15.3616940497336, 14.4540014880952, 17.8782126865672, 9.94047529836248), o3_mean = c(0.848970893970894, 19.6143709295441, 18.0919508928571, 19.1743544776119, 23.300829170136)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("id", "co_mean", "no_mean", "no2_mean", "o3_mean"), row.names = c(NA, -5L))
## confidence intervals generated from raw data for each pollutant by site:
df.ci <- structure(list(id = structure(1:5, .Label = c("A", "B", "C", "D", "E"), class = "factor"), co_ci = c(0.00247560132518893, 0.00347796717254879, 0.00376771895817099, 0.025603853701267, 0.00232362415184514), no_ci = c(0.955602056071903, 0.179936357209358, 0.166243603959864, 0.413094097187208, 0.20475667069271), no2_ci = c(0.975169763947207, 0.251717055459865, 0.230073674418165, 0.479358833879918, 0.148588790912564), o3_ci = c(0.22710620006376, 0.283390020715785, 0.279702181925963, 0.754017640698111, 0.376479324970397)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("id", "co_ci", "no_ci", "no2_ci", "o3_ci"), row.names = c(NA, -5L))
## convert each df to long-format:
df.mean.long <- melt(df.mean)
df.ci.long <- melt(df.ci)
## join two long dfs back together for plotting:
df.long.join <- full_join(df.mean.long, df.ci.long, by="id")
## generate confidence intervals relative to each mean:
limits <- aes(ymax = value.x + value.y, ymin = value.x-value.y) ## this is likely the problem!
## create our barplot:
barplot <- ggplot(df.long.join, aes(x=id, y=value.x, fill = variable.x)) +
geom_bar(position="dodge", stat="identity") +
geom_errorbar(limits, position = "dodge", width = 0.25)
barplot
提前致谢!
您的连接添加了额外的行,因此增加了额外的错误栏,因为每个数据框中 id
的每个级别都有四个匹配的副本。误差条也不会被与条相同的量躲避。
下面的代码调整数据以获得所需的连接,并且还使用分面来避免对图例的需要。您可以根据要突出显示的比较来切换 x 变量和面变量。
为了塑造数据,目标是在id
和pollutant
上进行join,所以我们需要获取每个数据框的长格式,并获取每个数据框中常见的污染物名称。
我们首先使用 gather
将 df.mean
放入长格式(一个 tidyr
函数,本质上等同于 reshape2
包中的 melt
) . separate
是为了给我们提供一个仅包含污染物缩写的列,而没有附加 _mean
。然后,我们摆脱了使用 separate
创建的不需要的 mean
列(尽管我们不必这样做)。
现在我们对 df.ci
做同样的事情,但我们还将 value
列的名称更改为 ci
,这样它就不同于 value
] 我们在 df.mean
中创建的专栏。
left_join
将两个重塑后的数据框合并为一个数据框以供绘图。
library(tidyverse)
df.mean %>%
gather(key, value, -id) %>%
separate(key, c("pollutant", "mean")) %>%
select(-mean) %>%
left_join(df.ci %>%
gather(key, value, -id) %>%
separate(key, c("pollutant", "ci")) %>%
select(id, pollutant, ci=value)) %>%
ggplot(aes(x=pollutant, y=value, fill = pollutant)) +
geom_bar(position=position_dodge(0.95), stat="identity") +
geom_errorbar(aes(ymax=value + ci, ymin=value-ci), position = position_dodge(0.95), width = 0.25) +
facet_grid(. ~ id) +
guides(fill=FALSE)
简介:
我 运行 在分组条形图上绘制一些错误条时遇到了麻烦。
我正在尝试改编一些最初用于制作下图的非分组条形图的代码:
问题:
现在我正在尝试为每个站点绘制多种空气污染物。
我正在融合两个单独的数据框(一个具有平均值,一个具有置信区间),然后将它们连接在一起。我已经成功地制作了一个分组的条形图,但是错误条看起来很疯狂!
我怎样才能正确映射我的误差线,以便它们模仿上面的非分组条形图?
可重现示例:
在下面查看我的全部数据出处:
## mean values generated from raw data for each pollutant by site:
df.mean <- structure(list(id = structure(1:5, .Label = c("A", "B", "C", "D", "E"), class = "factor"), co_mean = c(0.00965315315315315, 0.201591548253404, 0.180300223214286, 0.14681828358209, 0.136609422703303), no_mean = c(2.09379071379071, 7.17386693309651, 5.11211979166667, 7.070375, 8.84492922564529), no2_mean = c(2.90698198198198, 15.3616940497336, 14.4540014880952, 17.8782126865672, 9.94047529836248), o3_mean = c(0.848970893970894, 19.6143709295441, 18.0919508928571, 19.1743544776119, 23.300829170136)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("id", "co_mean", "no_mean", "no2_mean", "o3_mean"), row.names = c(NA, -5L))
## confidence intervals generated from raw data for each pollutant by site:
df.ci <- structure(list(id = structure(1:5, .Label = c("A", "B", "C", "D", "E"), class = "factor"), co_ci = c(0.00247560132518893, 0.00347796717254879, 0.00376771895817099, 0.025603853701267, 0.00232362415184514), no_ci = c(0.955602056071903, 0.179936357209358, 0.166243603959864, 0.413094097187208, 0.20475667069271), no2_ci = c(0.975169763947207, 0.251717055459865, 0.230073674418165, 0.479358833879918, 0.148588790912564), o3_ci = c(0.22710620006376, 0.283390020715785, 0.279702181925963, 0.754017640698111, 0.376479324970397)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("id", "co_ci", "no_ci", "no2_ci", "o3_ci"), row.names = c(NA, -5L))
## convert each df to long-format:
df.mean.long <- melt(df.mean)
df.ci.long <- melt(df.ci)
## join two long dfs back together for plotting:
df.long.join <- full_join(df.mean.long, df.ci.long, by="id")
## generate confidence intervals relative to each mean:
limits <- aes(ymax = value.x + value.y, ymin = value.x-value.y) ## this is likely the problem!
## create our barplot:
barplot <- ggplot(df.long.join, aes(x=id, y=value.x, fill = variable.x)) +
geom_bar(position="dodge", stat="identity") +
geom_errorbar(limits, position = "dodge", width = 0.25)
barplot
提前致谢!
您的连接添加了额外的行,因此增加了额外的错误栏,因为每个数据框中 id
的每个级别都有四个匹配的副本。误差条也不会被与条相同的量躲避。
下面的代码调整数据以获得所需的连接,并且还使用分面来避免对图例的需要。您可以根据要突出显示的比较来切换 x 变量和面变量。
为了塑造数据,目标是在id
和pollutant
上进行join,所以我们需要获取每个数据框的长格式,并获取每个数据框中常见的污染物名称。
我们首先使用 gather
将 df.mean
放入长格式(一个 tidyr
函数,本质上等同于 reshape2
包中的 melt
) . separate
是为了给我们提供一个仅包含污染物缩写的列,而没有附加 _mean
。然后,我们摆脱了使用 separate
创建的不需要的 mean
列(尽管我们不必这样做)。
现在我们对 df.ci
做同样的事情,但我们还将 value
列的名称更改为 ci
,这样它就不同于 value
] 我们在 df.mean
中创建的专栏。
left_join
将两个重塑后的数据框合并为一个数据框以供绘图。
library(tidyverse)
df.mean %>%
gather(key, value, -id) %>%
separate(key, c("pollutant", "mean")) %>%
select(-mean) %>%
left_join(df.ci %>%
gather(key, value, -id) %>%
separate(key, c("pollutant", "ci")) %>%
select(id, pollutant, ci=value)) %>%
ggplot(aes(x=pollutant, y=value, fill = pollutant)) +
geom_bar(position=position_dodge(0.95), stat="identity") +
geom_errorbar(aes(ymax=value + ci, ymin=value-ci), position = position_dodge(0.95), width = 0.25) +
facet_grid(. ~ id) +
guides(fill=FALSE)