将 y 轴上的组名称以粗体添加到水平误差条图中,更改标签之间的空格并添加额外的文本列

Posted

技术标签:

【中文标题】将 y 轴上的组名称以粗体添加到水平误差条图中,更改标签之间的空格并添加额外的文本列【英文标题】:Adding the name of a group on the y axis in bold to a horizontal error bar plot, changing spaces in between labels ánd add an extra text column 【发布时间】:2022-01-08 07:14:14 【问题描述】:

我获得了 2 个回归模型的数据(两者都获得了相应的 CI 下限和上限的估计值)。两种模型都包含 3 个变量(年龄、性别和吸烟状况)。变量term(对应模型中的变量)是有序的,所以它按照我指定的顺序出现。

数据如下:

library(tidyverse)
library(ggplot2)

mydata <- structure(list(term = structure(c(1L, 1L, 2L, 2L, 3L, 4L, 4L, 
5L, 5L), .Label = c("Age (years)", "Sex (male)", "Never smoking (reference)", 
"Current smoking", "Former smoking", ">90 (reference)", "60-89", 
"<60"), class = c("ordered", "factor")), estimate = c(1.5, 2.2, 
0.7, 1.8, 1, 1.5, 2.2, 0.7, 1.6), conf_low = c(1.3, 1.8, 0.9, 
1, 1, 1.3, 1.8, 0.9, 1), conf_high = c(1.7, 2.6, 0.5, 2.6, 1, 
1.7, 2.6, 0.5, 2.4), model = structure(c(1L, 2L, 1L, 2L, NA, 
1L, 2L, 1L, 2L), .Label = c("Model 1", "Model 2"), class = c("ordered", 
"factor")), label = structure(c(3L, 6L, 1L, 5L, 2L, 3L, 6L, 1L, 
4L), .Label = c("0.7 (0.9-0.5)", "1.0 (1.0-1.0)", "1.5 (1.3-1.7)", 
"1.6 (1.0-2.4)", "1.8 (1.0-2.6)", "2.2 (1.8-2.6)"), class = "factor")), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

head(mydata)
# A tibble: 6 x 6
  term                      estimate conf_low conf_high model   label        
  <ord>                        <dbl>    <dbl>     <dbl> <ord>   <fct>        
1 Age (years)                    1.5      1.3       1.7 Model 1 1.5 (1.3-1.7)
2 Age (years)                    2.2      1.8       2.6 Model 2 2.2 (1.8-2.6)
3 Sex (male)                     0.7      0.9       0.5 Model 1 0.7 (0.9-0.5)
4 Sex (male)                     1.8      1         2.6 Model 2 1.8 (1.0-2.6)
5 Never smoking (reference)      1        1         1   NA      1.0 (1.0-1.0)
6 Current smoking                1.5      1.3       1.7 Model 1 1.5 (1.3-1.7)

我做了以下情节:

ggplot(data=mydata, 
       aes(x=estimate, 
           y=fct_rev(term), 
           color=model)) + 
  geom_point(position=position_dodge(width=0.3)) + 
  geom_errorbarh(aes(xmin=conf_low, xmax=conf_high, height=0.15), position=position_dodge(width=0.3))

现在我正在进一步尝试实现我无法工作的两件事:

    我想在 Y 轴绘图中的 Never smoking (reference) 上方添加一个标题/变量名称,以便在该标签上方显示 吸烟状态(粗体)。我可以在原始数据框中添加另一行,但是标题和“从不吸烟”之间的距离会有点大。有没有办法添加标题,或者调整 Y 轴上某些标签之间的特定距离? 数据集中还有一列label,对应估计值和95%CI。我想将其添加为绘图右侧的额外列,以便它们与对应的点/误差线处于同一高度。

谢谢!

【问题讨论】:

【参考方案1】:

实现所需结果的一个选项是使用annotation_custom 添加组标题并使用geom_text 添加错误栏的文本标签:

注意:要将注释放在情节之外,我使用coord_cartesian(clip = "off")

library(ggplot2)
library(forcats)

ggplot(
  data = mydata,
  aes(
    x = estimate,
    y = fct_rev(term),
    color = model
  )
) +
  geom_point(position = position_dodge(width = 0.3)) +
  geom_errorbarh(aes(xmin = conf_low, xmax = conf_high, height = 0.15), position = position_dodge(width = 0.3)) +
  annotation_custom(grob = grid::textGrob(label = "Smoking status", gp = grid::gpar(fontface = "bold"), hjust = 1), xmin = -Inf, xmax = -Inf, ymin = 3.2, ymax = 3.2) +
  geom_text(aes(x = max(conf_high) * 1.05, label = label, group = model), position = position_dodge(width = 0.3), hjust = 0, show.legend = FALSE, color = "black") +
  scale_x_continuous(expand = expansion(mult = c(.05, .3))) +
  coord_cartesian(clip = "off")
#> Warning: Removed 1 rows containing missing values (geom_point).

【讨论】:

嗨@stefan,非常感谢您的回答,它解决了我的问题。作为后续问题,您是否知道如何删除与模型变量相关的 NA 因子水平(我的意思是在图例中)?谢谢。 快速选项:设置休息时间:+ scale_color_viridis_d(breaks = c("Model 1", "Model 2")) 如果可能的话,我还有另一个后续问题。当文本 gro 变得比 y 轴更宽时(例如输入“患者的吸烟状况”),则它不再部分可见。有没有办法调整这个?我想我可以用 hjust 更改 textGrob 的位置,但随后它与情节重叠。 您可以使用theme(axis.text.y = element_text(margin = margin(r = 2.2, l = 88, "pt"))) 增加绘图边距或轴文本的左边距(右边的2.2 是theme_grey 的默认值) 再次感谢,就像一个魅力。

以上是关于将 y 轴上的组名称以粗体添加到水平误差条图中,更改标签之间的空格并添加额外的文本列的主要内容,如果未能解决你的问题,请参考以下文章

重新排列 X 轴的顺序会导致误差条在 y 轴上不再匹配

R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar)

无论如何要删除Plotly R图中y轴上的0?

Plotly:在散点图分类轴上躲避重叠点

R语言plotly可视化:plotly可视化在对比条形图中添加误差条散点图中添加误差条线图中添加误差条(Error Bars with plotly in R)

如何在折线图中的 X 轴和 Y 轴上给出点?