R语言hist()函数绘制等级变量直方图的分箱异常问题求助
解决pairs()对角线直方图匹配整数评分等级的问题
问题根源
说白了就是hist()默认的分箱算法(Sturges/FD/Scott)是给连续数据设计的,你的变量是离散的整数评分,自动分箱会把相邻等级合并,再加上内部的pretty()函数调整断点,自然就没法让每个等级对应一个柱子。
两种实用解决方案
方案1:手动指定精确断点
给每个整数等级设置专属的区间断点,从min(x)-0.5到max(x)+0.5,间隔设为1,这样每个整数刚好对应一个独立柱子。
修改后的测试代码:
n <- 128 set.seed(42) x1 <- sample(c(1:5), size = n, replace = TRUE) x2 <- sample(c(1:7), size = n, replace = TRUE) x3 <- sample(c(1:9), size = n, replace = TRUE) # 自定义适配整数等级的直方图函数 int_hist <- function(x) { # 生成断点:每个整数前后各扩0.5 breaks_seq <- seq(min(x)-0.5, max(x)+0.5, by = 1) hist(x, breaks = breaks_seq, right = FALSE, main = deparse(substitute(x))) } # 单独测试每个直方图 int_hist(x1) int_hist(x2) int_hist(x3) # 直接用到pairs图的对角线 pairs(data.frame(x1, x2, x3), diag.panel = int_hist)
方案2:用条形图替代直方图(更适合离散数据)
既然是离散的评分等级,用条形图展示频率比直方图更直观,直接统计每个等级的频数再绘制:
# 对角线绘制条形图的函数 diag_barplot <- function(x) { freq_table <- table(x) barplot(freq_table, axes = FALSE, main = deparse(substitute(x))) # 手动添加坐标轴标签,保证对应每个等级 axis(1, at = seq_along(freq_table), labels = names(freq_table)) axis(2) } # 生成带条形图对角线的pairs图 pairs(data.frame(x1, x2, x3), diag.panel = diag_barplot)
注意点
- 手动断点时设
right = FALSE,确保区间是[k-0.5, k+0.5),刚好把整数k包含进去; - 条形图直接基于频数统计,完全不会有分箱的问题,展示离散等级更合理;
- 两个函数都能直接替换
pairs()的diag.panel参数,轻松实现你要的效果。
内容的提问来源于stack exchange,提问作者WinzarH
相关产品推荐
相关产品推荐

