ggplot2 boxplots - Как сгруппировать уровни факторов по оси X (и добавить опорные линии для каждой средней группы) - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть 30 видов растений, для которых я отобразил распределения потенциала полуденной листовой воды (lwp_md) с использованием коробок и пакета ggplot2. Но как мне сгруппировать эти виды вдоль оси x в соответствии с их привычками листьев (например, Deciduous, Evergreen), а также отобразить контрольную линию, указывающую среднее значение 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))

Пример того, как я хочу отобразить мои данные, вырезать и отредактировать - я хотел бы species по оси X, lwp_md по оси Y: image

1 Ответ

0 голосов
/ 01 апреля 2019

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)
...