是否可以将 ggiraph 交互函数与使用 stat_summary 生成的 ggplots 一起使用

Is it possible to use ggiraph interactive functions with ggplots generated using stat_summary

我正在使用 stat_summary 从数据框生成柱状图。我想使用来自 ggiraph 的 geom_col_interactive 通过工具提示向用户报告这些值。

我可以使用 ggplot_build 从 ggplot 中获取值并构建一个工具提示,如下所示。但是,我不知道如何将 ggiraph 与使用 stat_summary 生成的绘图一起使用以交互方式呈现工具提示。我当然可以使用 summary_values tibble 并使用 geom_col_interactive 生成不同的 ggplot,但这会破坏使用 stat_summary 的目的(这很适合分面)。有什么办法吗?或者我必须使用 Rmisc 中的 summarySE 来生成要使用 geom_col_interactive?

绘制的 tibble
library(tidyverse)

mpg_histogram <- ggplot(mpg, aes(x=as.factor(cyl), fill = as.factor(cyl))) +
  stat_summary(aes(y = hwy), fun = "mean", geom = "bar") +
  stat_summary(aes(y = hwy), fun.data = mean_se,  
               geom = "errorbar", width = 0.2, size = 0.2)

summary_values <- ggplot_build(mpg_histogram)$data[[2]]
summary_values <- summary_values %>%
  mutate(mean = round(y,1), sem = round(ymax-y,1)) %>%
  mutate(tooltip = paste("Mean mpg:",mean,"+/-",sem)) %>%
  select(c(mean,sem,tooltip))

通过 stat_summary 实现所需结果的一种方法是将 ggiraph:::GeomInteractiveCol 传递给 geom 参数。但是,请注意 GeomInteractiveCol 不是由 ggiraph 导出的,因此需要使用 :::。此外,要在工具提示中同时显示均值和标准误差,需要切换到 fun.data="mean_se"。为了方便起见,我使用了一个简单的自定义函数来创建工具提示:

library(ggplot2)
library(ggiraph)

tooltip <- function(y, ymax, accuracy = .01) {
  mean <- scales::number(y, accuracy = accuracy)
  sem <- scales::number(ymax - y, accuracy = accuracy)
  paste("Mean mpg:", mean, "+/-", sem)
}

gg_point <- ggplot(mpg, aes(x = as.factor(cyl), fill = as.factor(cyl))) +
  stat_summary(aes(y = hwy, tooltip = after_stat(tooltip(y, ymax))),
    fun.data = "mean_se", geom = ggiraph:::GeomInteractiveCol
  ) +
  stat_summary(aes(y = hwy),
    fun.data = mean_se,
    geom = "errorbar", width = 0.2, size = 0.2
  )

girafe(ggobj = gg_point)

这是不使用 GeomInteractiveCol() 和 alternative/shortcut 到 after_stat() 的解决方法:

library(ggplot2)
library(ggiraph)

tooltip <- function(y, ymax, accuracy = .01) {
  mean <- scales::number(y, accuracy = accuracy)
  sem <- scales::number(ymax - y, accuracy = accuracy)
  paste("Mean mpg:", mean, "+/-", sem)
}

gg_point <- ggplot(mpg) +
  aes(x = as.factor(cyl), fill = as.factor(cyl), y = hwy, 
    tooltip = tooltip(..y.., ..ymax..)
  ) +
  geom_bar_interactive(fun.data = "mean_se", stat = "summary") +
  geom_errorbar_interactive(fun.data = "mean_se", stat = "summary", 
    width = 0.2, size = 0.2
  )

girafe(ggobj = gg_point)

我个人更喜欢使用 geom_ 语法而不是 stat_ 语法,因为它与其余的 ggplot 代码更一致。

这是一种使用 glue() 在一个命令中执行此操作的方法,但由于未知原因,它仍然需要 after_stat():

{ggplot(mpg) +
  aes(x = as.factor(cyl), fill = as.factor(cyl), y = hwy, 
    tooltip = glue("Mean mpg: {round(y, 2)} +/- {round(ymax, 2)}") %>% after_stat()
  ) +
  geom_bar_interactive(fun.data = "mean_se", stat = "summary") +
  geom_errorbar_interactive(fun.data = "mean_se", 
    stat = "summary", width = 0.2, size = 0.2)
  } %>% 
  girafe(ggobj = .)