首页 > 解决方案 > 在ggplot中,如何在左对齐的同时将文本定位在最右端?

问题描述

我正在尝试使用ggplot()and创建一个绘图geom_text(),在绘图的最右端有一个文本注释,但仍然让文本左对齐。我尝试了许多x定位和的组合hjust,但到目前为止无济于事。

例子

让我们根据ToothGrowth内置数据集创建一个箱线图。在初始阶段,我希望对geom_hline()每个方面都有一个特定的含义,如下所示:

library(ggplot2)

mean_per_panel <- aggregate(len ~ supp, data = ToothGrowth, FUN = mean)

p <- 
  ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
  geom_boxplot() +
  geom_hline(data = mean_per_panel, 
             aes(yintercept = len, group = "supp"), 
             linetype = 2, 
             color = "red") +
  facet_wrap(~supp) +
  theme_bw()

p

reprex 包于 2021-09-11 创建 (v2.0.0 )


到现在为止还挺好。问题来了:我想添加一些注释来解释虚线。我希望这样的文字是:

因此所需的输出应如下所示: 期望输出


我的失败尝试

mean_per_panel首先,我用标签列补充我的数据摘要:

library(dplyr, warn.conflicts = FALSE)

mean_per_panel_with_label <-
  mean_per_panel %>%
  mutate(my_label = paste("mean for", supp, "is:", round(len, 2), sep = "\n"))

mean_per_panel_with_label
#>   supp      len                 my_label
#> 1   OJ 20.66333 mean for\nOJ\nis:\n20.66
#> 2   VC 16.96333 mean for\nVC\nis:\n16.96

以下是实现所需输出的一些尝试,但均未成功:

my_geom_text <- function(x_pos, ...) {
  geom_text(data = mean_per_panel_with_label, 
            aes(y = len, label = my_label),
            vjust = 1,
            x = x_pos,
            ...,
            color = "red") 
}

p +
  my_geom_text(x_pos = 2, hjust = 0)

p +
  my_geom_text(x_pos = 2.8, hjust = 0)

p +
  my_geom_text(x_pos = Inf, hjust = 1)

p +
  my_geom_text(x_pos = Inf, hjust = 1.2)

reprex 包于 2021-09-11 创建 (v2.0.0 )


有没有办法让文本始终显示在最右边(就像什么x = Inf一样),同时左对齐?

标签: rggplot2geom-text

解决方案


我相信 ggtext 可以满足geom_textbox()您的需求。In 引入了分离hjusthalign分别对齐框和文本。

library(ggtext)
library(ggplot2)
library(dplyr)

mean_per_panel <- ToothGrowth %>%
  group_by(supp) %>%
  summarise(mean = mean(len)) %>%
  mutate(my_label = paste("mean for", supp, "is:", round(mean, 2), sep = "<br>"))

ggplot(ToothGrowth, aes(as.factor(dose), len)) +
  geom_boxplot() +
  geom_hline(data = mean_per_panel, aes(yintercept = mean),
             colour = "red") +
  geom_textbox(
    data = mean_per_panel,
    aes(y = mean, x = Inf, label = my_label),
    hjust = 1, halign = 0, 
    box.colour = NA, fill = NA, # Hide the box fill and outline
    box.padding = unit(rep(2.75, 4), "pt"), colour = "red",
    vjust = 1, width = NULL
  ) +
  facet_grid(~ supp)

reprex 包于 2021-09-11 创建(v2.0.1)


推荐阅读