R - ggplot2 - 限制分类数据的条形图输出

Posted

技术标签:

【中文标题】R - ggplot2 - 限制分类数据的条形图输出【英文标题】:R - ggplot2 - limit bar chart output for categorical data 【发布时间】:2018-11-24 10:31:27 【问题描述】:

我正在尝试在 ggplot2 中创建一个条形图,将 x 轴上的输出限制为前 10% 最常见的分类变量。

我的数据框是一个包含个人贷款统计数据的数据集。我正在研究贷款状态和职业这两个类别之间的关系。

首先,我想将贷款状态限制为已“注销”的贷款。接下来,我想使用条形图绘制不同职业中已注销的贷款数量。 Occupation 有 67 个唯一值 - 我想将绘图限制为仅最常见的职业(按整数或百分比,即“7”或“10%”有效)。

在下面的代码中,我使用forcats 函数fct_infreq 按频率降序排列条形图。但是,我找不到限制 x 轴类别数量的函数。我已经尝试过quantilescale_x_discrete 等,但这些似乎不适用于分类数据。

感谢您的帮助!

df %>% filter(LoanStatus %in% c("Chargedoff")) %>% 
ggplot() +
  geom_bar(aes(fct_infreq(Occupation)), stat = 'count') +
  scale_x_discrete(limits = c(quantile(df$Occupation, 0.9), quantile(df$Occupation, 1)))

产生的错误:

(1 - h) * qs[i] 中的错误:二元运算符的非数字参数

更新: 使用以下 Yifu 的答案,我能够得到这样的期望输出:

pd_occupation <- pd %>% 
  dplyr::filter(LoanStatus == "Chargedoff") %>%
  group_by(Occupation) %>% 
  mutate(group_num = n())

table(pd_occupation$group_num)#to view the distribution

ggplot(subset(pd_occupation, group_num >= 361)) +
  geom_bar(aes(fct_infreq(Occupation)), stat = 'count') +
  ggtitle('Loan Charge-Offs by Occupation')

【问题讨论】:

请提供具有可重现数据的示例***.com/help/mcve 也许您可以通过forcats::fct_lump 将因子水平集中起来,然后在绘图之前将其子集到非“其他”类别? 【参考方案1】:

您可以改为在dplyr 中执行此操作:

#only use cars whose carb appears more than 7 times to create a plot
mtcars %>%
    group_by(carb) %>%
    mutate(group_num = n()) %>%
    # you can substitute the number with 10% percentitle or whatever you want
    dplyr::filter(group_num >= 7) #%>%
    #ggplot()
    #create your plot

这个想法是过滤观察结果并将其传递给ggplot,而不是过滤ggplot中的数据。

【讨论】:

以上是关于R - ggplot2 - 限制分类数据的条形图输出的主要内容,如果未能解决你的问题,请参考以下文章

在 r ggplot2 中为百分比值创建条形图

R语言ggplot2可视化:可视化离散(分类)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Categorical Variable)自定义轴标签旋转的角度

使用 ggplot2 在堆积条形图中排序分类数据

R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战

R语言之数据可视化

带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图