ggplot2 boxplots - 如何在 x 轴上对因子水平进行分组(并为每个组均值添加参考线)
ggplot2 boxplots - How to group factors levels on the x-axis (and add reference lines for each group mean)
我使用箱线图和包 ggplot2
显示了 30 种植物的正午叶水势分布 (lwp_md
)。但是我如何根据它们的叶习性(例如 Deciduous
、Evergreen
)沿 x 轴对这些物种进行分组,并显示一条参考线,指示每片叶子的平均 lwp_md
值习惯水平?
我已经尝试使用包 forcats
但真的不知道如何继续这个包。在网上广泛搜索后,我找不到任何东西。我似乎能做的最好的事情就是通过其他功能订购物种,例如中位数。
下面是我目前的代码示例。注意我使用了包 ggplot2
和 ggthemes
:
library(ggplot2)
ggplot(zz, aes(x=fct_reorder(species, lwp_md, fun=median, .desc=T), y=lwp_md)) +
geom_boxplot(aes(fill=leaf_habit)) +
theme_few(base_size=14) +
theme(legend.position="top",
axis.text.x=element_text(size=8, angle=45, vjust=1, hjust =1)) +
xlab("Species") +
ylab("Maximum leaf water potential (MPa)") +
scale_y_reverse() +
scale_fill_discrete(name="Leaf habit",
breaks=c("DEC", "EG"),
labels=c("Deciduous", "Evergreen"))
这是我的数据的一个子集,包括我的 4 个物种(2 个落叶树,2 个常绿树):
> dput(zz)
structure(list(id = 1:20, species = structure(c(1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L
), .Label = c("AMYELE", "BURSIM", "CASXYL", "COLARB"), class = "factor"),
leaf_habit = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("DEC",
"EG"), class = "factor"), lwp_md = c(-2.1, -2.5, -2.35, -2.6,
-2.45, -1.7, -1.55, -1.4, -1.55, -0.6, -2.6, -3.6, -2.9,
-3.1, -3.3, -2, -1.8, -2, -4.9, -5.35)), class = "data.frame", row.names = c(NA,
-20L))
我希望如何显示我的数据、剪切和编辑的示例 - 我希望在 x 轴上 species
,在 y 轴上 lwp_md
:
gpplot
默认按字母顺序排列您的因素。为避免这种情况,您必须将它们作为订购因素提供。这可以通过排列 data.frame
然后重新声明因子来完成。要生成平均值,我们可以使用 group_by
并在 df 中改变一个新的平均值列,稍后可以绘制它。
完整代码如下:
library(ggplot)
library(ggthemes)
library(dplyr)
zz2 <- zz %>% arrange(leaf_habit) %>% group_by(leaf_habit) %>% mutate(mean=mean(lwp_md))
zz2$species <- factor(zz2$species,levels=unique(zz2$species))
ggplot(zz2, aes(x=species, y=lwp_md)) +
geom_boxplot(aes(fill=leaf_habit)) +
theme_few(base_size=14) +
theme(legend.position="top",
axis.text.x=element_text(size=8, angle=45, vjust=1, hjust =1)) +
xlab("Species") +
ylab("Maximum leaf water potential (MPa)") +
scale_y_reverse() +
scale_fill_discrete(name="Leaf habit",
breaks=c("DEC", "EG"),
labels=c("Deciduous", "Evergreen")) +
geom_errorbar(aes(species, ymax = mean, ymin = mean),
size=0.5, linetype = "longdash", inherit.aes = F, width = 1)
我使用箱线图和包 ggplot2
显示了 30 种植物的正午叶水势分布 (lwp_md
)。但是我如何根据它们的叶习性(例如 Deciduous
、Evergreen
)沿 x 轴对这些物种进行分组,并显示一条参考线,指示每片叶子的平均 lwp_md
值习惯水平?
我已经尝试使用包 forcats
但真的不知道如何继续这个包。在网上广泛搜索后,我找不到任何东西。我似乎能做的最好的事情就是通过其他功能订购物种,例如中位数。
下面是我目前的代码示例。注意我使用了包 ggplot2
和 ggthemes
:
library(ggplot2)
ggplot(zz, aes(x=fct_reorder(species, lwp_md, fun=median, .desc=T), y=lwp_md)) +
geom_boxplot(aes(fill=leaf_habit)) +
theme_few(base_size=14) +
theme(legend.position="top",
axis.text.x=element_text(size=8, angle=45, vjust=1, hjust =1)) +
xlab("Species") +
ylab("Maximum leaf water potential (MPa)") +
scale_y_reverse() +
scale_fill_discrete(name="Leaf habit",
breaks=c("DEC", "EG"),
labels=c("Deciduous", "Evergreen"))
这是我的数据的一个子集,包括我的 4 个物种(2 个落叶树,2 个常绿树):
> dput(zz)
structure(list(id = 1:20, species = structure(c(1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L
), .Label = c("AMYELE", "BURSIM", "CASXYL", "COLARB"), class = "factor"),
leaf_habit = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("DEC",
"EG"), class = "factor"), lwp_md = c(-2.1, -2.5, -2.35, -2.6,
-2.45, -1.7, -1.55, -1.4, -1.55, -0.6, -2.6, -3.6, -2.9,
-3.1, -3.3, -2, -1.8, -2, -4.9, -5.35)), class = "data.frame", row.names = c(NA,
-20L))
我希望如何显示我的数据、剪切和编辑的示例 - 我希望在 x 轴上 species
,在 y 轴上 lwp_md
:
gpplot
默认按字母顺序排列您的因素。为避免这种情况,您必须将它们作为订购因素提供。这可以通过排列 data.frame
然后重新声明因子来完成。要生成平均值,我们可以使用 group_by
并在 df 中改变一个新的平均值列,稍后可以绘制它。
完整代码如下:
library(ggplot)
library(ggthemes)
library(dplyr)
zz2 <- zz %>% arrange(leaf_habit) %>% group_by(leaf_habit) %>% mutate(mean=mean(lwp_md))
zz2$species <- factor(zz2$species,levels=unique(zz2$species))
ggplot(zz2, aes(x=species, y=lwp_md)) +
geom_boxplot(aes(fill=leaf_habit)) +
theme_few(base_size=14) +
theme(legend.position="top",
axis.text.x=element_text(size=8, angle=45, vjust=1, hjust =1)) +
xlab("Species") +
ylab("Maximum leaf water potential (MPa)") +
scale_y_reverse() +
scale_fill_discrete(name="Leaf habit",
breaks=c("DEC", "EG"),
labels=c("Deciduous", "Evergreen")) +
geom_errorbar(aes(species, ymax = mean, ymin = mean),
size=0.5, linetype = "longdash", inherit.aes = F, width = 1)