如何使用 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_wrap
和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") +
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轴值(可能是日期)绘制两个点