【问题标题】:How to subset with ggplot based on facet aggregates?如何基于 facet 聚合使用 ggplot 进行子集化?
【发布时间】:2018-05-24 00:24:26
【问题描述】:

我有一个数据集,其中包含 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 方面。在我的数据集中,16 个组中只有 5 个组捕获了超过 90% 的有趣观察,因此,我不需要分面网格中的其他 11 个组。

这是我的尝试,输出都是3种,应该只有上表中的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

【问题讨论】:

  • 在绘图之前是否使用dplyr::filter 进行子集化不是一个选项?
  • 问题(除非我遗漏了什么)是第一个代码块中的filter() 应用于group_by 创建的行;在第二个代码块中,我想应用相同的过滤器,但适用于个人观察。也就是说,我想绘制属于 2 个所需组的所有观察值,并在构面网格中仅显示这两个。
  • 一种可能的解决方法是使用mutate 创建一个新列,并以此过滤,但我想知道在ggplot 中是否有更直接的方法。
  • 我不知道是否可以使用stat_summaryggplot 中的某些东西来完成,但我只能说适合这项工作的工具。而且你申请filter的方式不会受到group_by的影响。

标签: r ggplot2 subset facet


【解决方案1】:

filter 不会受到group_by 的影响。例如,如果您有一个按列 var1 分组的数据框,并且您想过滤列 x > 50 的行,则观察位于某个组中的事实不会影响以下事实: number 是否大于 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 轴上。不确定这是否仍适用于您更大的数据集。

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2021-08-17
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多