R语言复杂直方图制作求助:无法使用ggplot_histogram
搞定你的特殊R直方图需求!
嘿,作为R新手碰到这种非常规的直方图要求确实容易头大,别慌,我一步步给你捋清楚怎么实现——毕竟咱们不能用ggplot_histogram,换个思路就好啦!
第一步:先把数据转换成我们需要的「频次的频次」格式
你的原始数据是一堆重复的数值,我们要先统计每个数值出现了多少次,再统计这些「出现次数」本身又出现了多少次——这才是你要的直方图的核心数据。
先把数据放进R里,然后跑这段代码:
# 把你的原始数据存成向量 data <- c(1,1,1,2,2,3,4,4,4,4,4,6,7,7,8,8,8,8,9,9,9,10,10) # 第一步:统计每个数值的出现次数 value_counts <- table(data) # 把结果转成纯数值向量,方便后续统计 freqs <- as.numeric(value_counts) # 第二步:统计不同频次的出现次数(这就是绘图要用的最终数据) freq_dist <- table(freqs) # 转成数据框,后续绘图更方便 freq_df <- as.data.frame(freq_dist) # 给列改个好懂的名字 colnames(freq_df) <- c("重复频次", "数值出现次数")
跑完之后,freq_df就是我们要的数据集,你可以打印看看:
重复频次 数值出现次数 1 1 2 2 2 3 3 3 2 4 4 1 5 5 1
完全对应你说的例子:2个数值只重复1次,3个数值重复2次,以此类推~
第二步:绘制直方图(两种方案,都避开ggplot_histogram)
方案1:用R基础绘图(简单直接)
基础绘图的barplot就能搞定,把条形宽度设为1、去掉空隙,就是你要的宽度为1的直方图效果:
barplot(freq_df$`数值出现次数`, names.arg = freq_df$`重复频次`, # X轴标签用重复频次 xlab = "重复频次", ylab = "对应重复频次的数值出现次数", main = "特殊频次直方图", width = 1, # 分箱宽度设为1 space = 0) # 去掉条形间的空隙,模拟直方图
运行后就能得到符合要求的图啦。
方案2:用ggplot2(但不用geom_histogram)
如果你习惯用ggplot2但不能用geom_histogram,那就用geom_col——因为我们已经提前算好了频次分布,直接画条形图就行,宽度设为1就和直方图一样:
library(ggplot2) ggplot(freq_df, aes(x = `重复频次`, y = `数值出现次数`)) + geom_col(width = 1) + # 宽度设为1,完美模拟分箱 labs(x = "重复频次", y = "对应重复频次的数值出现次数", title = "特殊频次直方图") + theme_minimal()
这个方案也完全符合你的要求,而且画风更美观。
最后再核对一遍
咱们的结果完全匹配你的需求:
- X轴是1到5的重复频次(正好5个分箱,每个宽度1)
- Y轴对应每个频次下有多少个数值:比如重复1次的数值有2个(3和6),所以X=1时Y=2,完全正确~
内容的提问来源于stack exchange,提问作者Ara Peterson
相关产品推荐
相关产品推荐

