是否可以将 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 = .)
我正在使用 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?
绘制的 tibblelibrary(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 = .)