如何基于 facet 聚合使用 ggplot 进行子集化?

How to subset with ggplot based on facet aggregates?

我有一个数据集,其中有 16 个组可用于分面 — 但是,这太多了,我想只保留最重要的组(由特定总数中属于该组的百分比确定)。例如,我只想保留占 Var1 总数 30% 或更多的组。

为了说明,如果我 运行 以下代码,R 会正确输出 Petal.length 总和占数据集中总 Petal.length 的 30% 以上的两个物种(忽略在这种情况下这是一个毫无意义的统计数据)。

library(tidyverse)

iris %>% 
  group_by(Species) %>% 
  summarise(t_length = sum(Petal.Length),
            p_length = round(100*t_length/sum(.$Petal.Length))) %>% 
  filter(p_length >=30)

所以,我想做的是让所有满足指定条件的组都有 ggplot facet。在我的数据集中,16 个组中只有 5 个组捕获了超过 90% 的有趣观察结果,因此,我不需要面网格中的其他 11 个组。

这是我的尝试,输出的都是3种,这里应该只有上面table中的2种:

iris.sub <- ggplot(subset(iris, round(100*sum(Petal.Length)/sum(iris$Petal.Length)) >= 30), aes(x = ' ', y = Petal.Length)) +
  geom_point(stat = 'summary', fun.y = 'mean') +
  geom_errorbar(stat = 'summary', fun.data = 'mean_se', 
                width=0, fun.args = list(mult = 1.96)) +
  facet_grid( . ~ Species ) +
  theme_bw()
iris.sub

filter 不会受到 group_by 的影响。例如,如果您有一个按列 var1 分组的数据框,并且您想要过滤列 x > 50 的行,则观察值在特定组中这一事实不会影响一个数字是否大于 50 的事实。

这里有两种使用某些 dplyr 函数的方法。第一个计算每个组对总花瓣长度的贡献,提取这些物种,并将其作为向量保存。然后,您过滤数据框以仅使用其中一种物种进行观察,然后绘图。

第二个在一个块中进行所有计算和绘图。这样做的好处是您不必为您保留的物种保存变量;缺点是在 mutate 调用而不是 summarise 中做汇总数学是混乱的,如果你不小心你需要加起来的东西(根据经验说这个),可能会导致错误。

library(tidyverse)

major_categories <- iris %>%
  group_by(Species) %>%
  summarise(group_Petal.Length = sum(Petal.Length)) %>%
  mutate(share_Petal.Length = group_Petal.Length / sum(group_Petal.Length)) %>%
  filter(share_Petal.Length >= 0.3) %>%
  pull(Species)

iris %>%
  filter(Species %in% major_categories) %>%
  ggplot(aes(x = 1, y = Petal.Length)) +
    geom_point(stat = "summary", fun.y = "mean") +
    geom_errorbar(stat = "summary", fun.data = "mean_se", width = 0, fun.args = list(mult = 1.96)) +
    facet_grid(. ~ Species) +
    theme_bw()

iris %>%
  group_by(Species) %>%
  mutate(group_Petal.Length = sum(Petal.Length)) %>%
  ungroup() %>%
  mutate(share_Petal.Length = group_Petal.Length / sum(unique(group_Petal.Length))) %>%
  filter(share_Petal.Length >= 0.3) %>%
  ggplot(aes(x = 1, y = Petal.Length)) +
    geom_point(stat = "summary", fun.y = "mean") +
    geom_errorbar(stat = "summary", fun.data = "mean_se", width = 0, fun.args = list(mult = 1.96)) +
    facet_grid(. ~ Species) +
    theme_bw()

还要注意,如果您在 x 轴上没有任何值——这里它只是一个虚拟值——您不妨跳过刻面并将 Species 放在 x-轴。不确定这是否仍适用于您的较大数据集。