R - ggplot2 - 限制分类数据的条形图输出
R - ggplot2 - limit bar chart output for categorical data
我正在尝试在 ggplot2 中创建一个条形图,将 x 轴上的输出限制为前 10% 最常见的分类变量。
我的数据框是一个包含个人贷款统计数据的数据集。我正在检查两个类别之间的关系,贷款状态和职业。
首先,我想将贷款状态限制为已被取消的贷款 "charged off." 接下来,我想使用条形图绘制各种职业已注销的贷款数量。职业有 67 个唯一值 - 我想将情节限制为仅最常见的职业(按整数或百分比,即“7”或“10%”有效)。
在下面的代码中,我使用 forcats 函数 fct_infreq
按频率降序排列条形图。但是,我找不到限制 x 轴类别数量的函数。我已经尝试过 quantile
、scale_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)))
产生的错误:
Error in (1 - h) * qs[i] : non-numeric argument to binary operator
更新:
使用下面 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')
您可以在 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
中的数据。
我正在尝试在 ggplot2 中创建一个条形图,将 x 轴上的输出限制为前 10% 最常见的分类变量。
我的数据框是一个包含个人贷款统计数据的数据集。我正在检查两个类别之间的关系,贷款状态和职业。
首先,我想将贷款状态限制为已被取消的贷款 "charged off." 接下来,我想使用条形图绘制各种职业已注销的贷款数量。职业有 67 个唯一值 - 我想将情节限制为仅最常见的职业(按整数或百分比,即“7”或“10%”有效)。
在下面的代码中,我使用 forcats 函数 fct_infreq
按频率降序排列条形图。但是,我找不到限制 x 轴类别数量的函数。我已经尝试过 quantile
、scale_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)))
产生的错误:
Error in (1 - h) * qs[i] : non-numeric argument to binary operator
更新: 使用下面 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')
您可以在 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
中的数据。