1

我有一组从两个不同地区的七个不同站点收集的数据。我想使用箱线图来显示站点之间和区域之间的差异。我目前有两个单独的箱形图。我正在尝试解决(但没有运气)如何在一个图中显示两者...即我希望我的图将结果显示为:站点 1、站点 2、站点 3、站点 4 ......区域1,区域 2 <- 全部在一个数字上。我在下面提供了示例数据和我当前的代码。你会注意到我的轴被翻转了——这是故意的,因为我的站点名称很长。

谢谢!

#Example script

example<-structure(list(Site = c("NS", "NS", "NS", "NE", "NE", "NE", "KO", 
                                 "KO", "KO", "MI", "MI", "MI", "KI", "KI", "KI", "HP", "HP", "HP", 
                                 "HA", "HA", "HA"), Var1 = c(30, 5, 4, 0.3, 0, 0, 48, 79, 43, 
                                                             30, 30, 50, 5, 3, 3, 20, 31, 50, 30, 40, 68), Region = c("A", 
                                                                                                                      "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
                                                                                                                      "B", "B", "B", "B", "B", "B", "B")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                               -21L))
######## By Site
library(forcats)
p <- example %>%
  mutate(Site = fct_relevel(Site, "HA", "HP",
                            "KI", "MI","KO", "NE",
                            "NS"
  )) %>%
  ggplot( aes(x=Site, y=Var1, fill = Region)) +
  geom_boxplot()+xlab("Site") + ylab ("Variable 1") + ylim(0,100) +
  coord_flip() + theme_bw() 
plot1<- p+scale_fill_manual(values=c("#0072B2", "#D55E00")) + theme(axis.text=element_text(size=11),
                                                                    axis.title=element_text(size=12))

plot1
####################### By Regions

example$Region<-factor(example$Region, levels=c("B", "A"))


pplot2<-ggplot(example, aes(x = Region, y = Var1, fill = Region)) + geom_boxplot()
pplot2<-pplot2 + ylab("Variable 1") + ylim (0,100) + 
  scale_x_discrete(limits = rev(levels("Region"))) + coord_flip()+ theme_bw() + scale_fill_manual(values=c("#D55E00", "#0072B2")) + theme(axis.text=element_text(size=11),
                                                                                                                                          axis.title=element_text(size=12))

pplot2
4

2 回答 2

1

如果您只想堆叠图,可以尝试library(patchwork). 它具有将多个图组合在一起的简单语法。这是一个教程

library(patchwork)
p3 <- plot1/(pplot2 + theme(legend.position="none"))

在此处输入图像描述

如果您真的希望它们共享相同的轴,我有一种 hacky/笨拙的解决方案。如果您堆叠数据框以便“区域”也包含在“站点”列中,那么您可以将站点和区域作为同一轴。缺点是这使得标记轴有点笨拙。所以,我玩弄hjust并在其中添加空格lab(x=)以使其正确排列。我还添加了geom_vline()(因为坐标被翻转了),以便在视觉上区分基于区域和基于站点的箱线图在哪里。同样,不优雅,但可以完成工作。

example2 <- example %>% mutate(Site = Region)
dat <- rbind(example, example2)

p4 <- dat %>% mutate(Site = fct_relevel(Site, "HA", "HP",
                                  "KI", "MI","KO", "NE",
                                  "NS", "B", "A"
)) %>% ggplot(aes(x=Site, y=Var1, fill=Region)) + geom_boxplot() + 
  coord_flip() + theme_bw() + scale_fill_manual(values=c("#0072B2", "#D55E00")) + 
  theme(axis.text=element_text(size=11),
        axis.title=element_text(size=12)) + labs(y="Variable 1", 
                                                 x="Site                            Region") + 
  theme(axis.title.y=element_text(hjust=.90)) +
  geom_vline(xintercept = 7.5)

在此处输入图像描述

于 2020-08-09T15:29:22.947 回答
1

另一种可能性是将您的数据框变成长格式,Site然后Region绘制:

library(tidyverse)
# get data in long format
example_long <- example %>% 
  pivot_longer(
    cols = c(Site, Region),
    names_to = "names",
    values_to = "values"
  ) %>% 
  mutate(values = fct_relevel(values, "HA", "HP",
                              "KI", "MI","KO", "NE",
                              "NS", "B", "A"
  )) 

# plot
ggplot(example_long, aes(x=values, y=Var1, fill = names)) +
  geom_boxplot()+ 
  xlab("Values") + ylab ("Variable 1") + ylim(0,100) +
  coord_flip() + 
  theme_bw() +
  scale_fill_manual(values=c("#0072B2", "#D55E00")) + theme(axis.text=element_text(size=11),
                                                            axis.title=element_text(size=12)) +
  theme(legend.title = element_blank(),
        axis.title.y = element_blank()) 

在此处输入图像描述

于 2021-06-07T05:59:43.703 回答