如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图

Posted

技术标签:

【中文标题】如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图【英文标题】:How to add marginal totals to a ggplot2 facet_grid plot using a different geom 【发布时间】:2021-12-23 11:30:39 【问题描述】:

假设我们有一个简单的facet_grid 情节:

library(ggplot2)

ggplot(mtcars, aes(hp, mpg)) +
  geom_point() +
  facet_grid(cyl ~ am, switch = "y")

我想将cylam 的边际总数(即每行和每列的记录计数)添加到绘图中。但是,我想更改底层的 geom。理想情况下,我希望这些是 text。这可能看起来类似于:

这可能吗?我用facet_grid(..., margins = TRUE) 尝试了一些东西,但还没有成功。使用预先计算的总数然后将图形与grid 结合起来可能会更容易?

【问题讨论】:

【参考方案1】:

我不知道有什么简单的方法可以做到这一点。有一个困难的方法,其中包括大量的数据重塑。

基本上,您为右边距、下边距和总计创建单独的数据框,然后将它们逐行绑定到主数据框。在途中,您还必须添加一个指示列来说明该行是否是边距,另一个来提供带有计数的标签。最后,必须将分面变量转换为因子:

library(ggplot2)
library(dplyr)

data <- mtcars %>% 
          mutate(label = "",
                 plot = TRUE,
                 cyl   = as.character(cyl), 
                 am    = as.character(am)) %>% 
          select(cyl, am, hp, mpg, label, plot)

mar1 <- data %>% 
  group_by(cyl) %>% 
  summarize(am = "(All)", hp = mean(range(data$hp)),
            mpg = mean(range(data$mpg)), 
            label = as.character(n()), plot = FALSE)

mar2 <- data %>% 
  group_by(am) %>% 
  summarize(cyl = "(All)", hp = mean(range(data$hp)), 
            mpg = mean(range(data$mpg)), 
            label = as.character(n()), plot = FALSE)

mar3 <- data %>% 
  summarize(cyl = "(All)", am = "(All)", 
            hp = mean(range(data$hp)), 
            mpg = mean(range(data$mpg)),
            label = as.character(n()), plot = FALSE)


big_data <- bind_rows(data, mar1, mar2, mar3) %>%
  mutate(cyl = factor(cyl, levels = c("4", "6", "8", "(All)")),
         am = factor(am, levels = c("0", "1", "(All)")))

完成后,您可以使用大的geom_labels(具有有效的无限填充)为您的边距绘制结果。

ggplot(big_data[big_data$plot,], aes(hp, mpg, label = label)) +
  geom_point() +
  geom_label(data = big_data[!big_data$plot,], size = 15, 
             label.padding = unit(1, "npc")) +
  facet_grid(cyl ~ am, switch = "y", drop = FALSE)

【讨论】:

我喜欢这个。这很复杂,但并不复杂。我将暂时不回答这个问题,看看其他人是否会加入。

以上是关于如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列的运行总计添加到 Access 查询?

如何生成具有不同边际分布的多元随机数?

如何生成具有不同边际分布的多元随机数?

将组总计添加到 s-s-rS 报告的不同部分

将组总计添加到SSRS报告的不同部分

在 OBIEE 中将总计添加到数据透视表行的末尾