如何使用 geom_bar 并在 x 轴上使用两个分类变量

Posted

技术标签:

【中文标题】如何使用 geom_bar 并在 x 轴上使用两个分类变量【英文标题】:How to use geom_bar and use two categorical variables on the x axis 【发布时间】:2021-12-30 10:12:52 【问题描述】:

我尝试绘制条形图,其 X 轴与通常情况略有不同。这个想法是用初始变量(代码)和分组变量(区域)来表示这个轴。每个代码都有一个归属于它的区域。我想用垂直线来划定我在情节上的区域。

这是一个代表

library(dplyr)
library(ggplot2)
data <- tibble::tribble(
                           ~code,    ~term,          ~estimate,           ~std.error,       ~statistic,             ~p.value,      ~region,
                          "ANTA", "t_chla", 0.0577051712200805, 0.000720537559840254, 80.0862778518777, 1.51491004165028e-36,      "Polar",
                          "ARCH", "t_chla", 0.0528096415790542,  0.00237431411186973, 22.2420619559337, 9.38778083531695e-08, "Equatorial",
                          "ARCT", "t_chla", 0.0381489725623347, 0.000549351930679462, 69.4435942277484,  7.1661522966813e-84,      "Polar",
                          "BPLR", "t_chla", 0.0334314725309052, 0.000908084662707285, 36.8153696498248,   6.728272457306e-26,      "Polar",
                          "EMED", "t_chla",  0.048713647973686,  0.00179735526256328, 27.1029601038437, 1.37127584382531e-20,  "Temperate",
                          "SANT", "t_chla", 0.0311278181792805, 0.000594175450783383, 52.3882602996143, 4.93281235468381e-67,      "Polar",
                          "SPSG", "t_chla", 0.0676467149977894,  0.00461643829029263,  14.653442923744, 1.64755108560374e-06, "Equatorial",
                          "WMED", "t_chla", 0.0359293074812375, 0.000954627809780489, 37.6369796826883, 1.88418982949485e-42,  "Temperate"
                          )

data$code <- factor(data$code, levels = c("ANTA", "SANT", "ARCT", "BPLR", "EMED", "WMED", "SPSG", "ARCH"))


ggplot(data)+
  geom_bar(aes(y = estimate, x = code, fill = code), stat = "identity")+
  geom_errorbar(aes(ymin = estimate - std.error, ymax = estimate + std.error, x = code))+
  scale_fill_brewer(palette = "Set1", guide = "none")+
  theme_bw()+
  ylab("Specifc absorption")+
  xlab("Oceanic province")+
  ggtitle("Specific absorption")


因此,我们的想法是在 BPLR 和 EMED 之间以及 WMED 和 SPSG 之间建立一条垂直线,并将条形图分组在标签 Polar、Temperate 和 Equatorial 下。

提前感谢您的回答。

【问题讨论】:

【参考方案1】:

facet_wrappanel.spacing = unit(0, 'lines') 添加到您的情节中怎么样?

ggplot(data)+
  geom_bar(aes(y = estimate, x = code, fill = code), stat = "identity")+
  geom_errorbar(aes(ymin = estimate - std.error, ymax = estimate + std.error, x = code))+
  scale_fill_brewer(palette = "Set1", guide = "none")+
  theme_bw()+
  ylab("Specifc absorption")+
  xlab("Oceanic province")+
  ggtitle("Specific absorption") +
  facet_wrap(~region, scales = 'free_x') +
  theme(panel.spacing = unit(0, 'lines'))


编辑:更新为手动添加垂直线和标签

这是将分组添加到条形的另一个选项。可以对文本大小、位置、颜色、字体等进行大量自定义。

ggplot(data)+
  geom_bar(aes(y = estimate, x = code, fill = code), stat = "identity")+
  geom_errorbar(aes(ymin = estimate - std.error, ymax = estimate + std.error, x = code))+
  scale_fill_brewer(palette = "Set1", guide = "none")+
  theme_bw()+
  ylab("Specifc absorption")+
  xlab("Oceanic province")+
  ggtitle("Specific absorption") +
  geom_vline(xintercept = c(4.5, 6.5)) +
  annotate(geom = 'text', x = 2.5, y = .07, label = 'Polar') +
  annotate(geom = 'text', x = 5.5, y = .07, label = 'Temperate') +
  annotate(geom = 'text', x = 8, y = .07, label = 'Equitorial')

【讨论】:

是的,那是我的备份解决方案,我想尝试一些不同的东西。但我觉得使用 ggplot2 是不可能的。谢谢你的回答。 编辑添加另一个选项,我手动添加垂直线和标签。 非常感谢!不知道我们可以使用 xintercept = c(4.5) 来解决这个问题!

以上是关于如何使用 geom_bar 并在 x 轴上使用两个分类变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用plotly js在y轴上为单个x轴值(可能是日期)绘制两个点

pyqtgraph:如何绘制时间序列(x 轴上的日期和时间)?

如何绘制具有多个变量的图?

在一个图中根据不同的列制作两个geom_bar()图。

使用 Matplotlib 在 x 轴上的月份名称偏移

如何双重填充具有两个特征的 geom_bar