ggplot2密度图的分类轴是否需按频率降序排列?
ggplot2分类变量x轴按频率排序问题解答
核心问题:你只对数据框的行做了排序,但ggplot2绘制分类变量时,是按照因子水平的固有顺序排列x轴,和数据框的行顺序无关。你的cos是字符型,默认按字典序(0→2→3→5)排列,所以没达到按频率排序的效果。
修正步骤
1. 先修复数据集错误
你提供的mag列长度和cos不匹配,会直接报错,这里调整为合理的随机生成:
data = data.frame( cos = c(rep('5', 308), rep('3', 199), rep('0', 184), rep('2', 9)), mag = sample(c('Yes', 'No'), length(cos), replace = TRUE) )
2. 正确设置分类变量顺序
需要将cos转换为因子,并把因子水平按频率从高到低指定,两种方法可选:
方法一:用forcats包(简洁高效)
library(ggplot2) library(forcats) # 自动按频率从高到低设置因子水平 data$cos <- fct_infreq(data$cos)
方法二:手动计算排序(无需额外包)
# 计算每个cos水平的频率并降序排序 freq_levels <- names(sort(table(data$cos), decreasing = TRUE)) # 转换为因子并指定水平顺序 data$cos <- factor(data$cos, levels = freq_levels)
3. 修改后的绘图代码
ggplot(data) + geom_density(aes(x = cos, fill = mag), alpha = 0.4) + labs(title = "Density curve", x = "cos", y = "Density") + # 修正y轴标签(原标签错误) theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.ticks.y = element_blank(), axis.ticks.x = element_blank() )
额外建议
分类变量用密度图并非常规可视化选择,若想展示cos各水平下mag的分布,geom_bar(position = "dodge")或geom_freqpoly()会更直观。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

