R语言如何使用ggplot将第二个直方图绘制在y轴负方向
ggplot2 双向直方图实现方案
核心逻辑:无需修改原始数据,仅需在绘制negvalues对应的直方图时,将统计得到的柱高(计数/密度)取负值,即可让柱子朝向y轴负方向绘制,微调坐标轴标签后就能达到预期效果。
修正后可直接运行的代码
library(ggplot2) p_change <- ggplot(dx, aes(fill=Group)) + # 正向序列:柱子朝上,使用原始统计计数 geom_histogram(aes(x=posvalues, y = after_stat(count)), binwidth=1, position = "identity") + # 负向序列:计数取反,柱子朝下落到y轴负区域 geom_histogram(aes(x=negvalues, y = after_stat(-count)), binwidth=1, position = "identity") + # 坐标轴配置,保持原有范围,优化y轴刻度显示 scale_x_continuous(name = "Number of tokens", limits = c(0, 15)) + scale_y_continuous( name = "Count", limits = c(-25, 25), # 负半轴刻度显示为正数值,避免阅读误解 labels = ~abs(.) ) + # 可选:添加y=0基准分隔线,视觉层次更清晰 geom_hline(yintercept = 0, linewidth = 0.5) + theme( legend.position = "right", text=element_text(size = 19) ) p_change
关键调整说明
- 两个直方图层均显式指定y轴映射,避免默认统计值的方向错误
- 新增
position = "identity"参数,关闭直方图默认的堆叠位置调整,防止柱子错位 - 替换原有的
xlim()/ylim()为scale_*_continuous函数,支持自定义刻度标签:将负半轴刻度取绝对值显示,不会出现不符合计数逻辑的负号标签 - 保留了你原有的所有主题、坐标轴范围、填充色映射配置,输出风格和原有绘图保持一致
版本适配提示
- 如果你使用的ggplot2版本低于3.3.0(不支持
after_stat语法),将代码中after_stat(count)替换为..count..、after_stat(-count)替换为-..count..即可正常运行 - 如果需要绘制密度直方图而非计数直方图,只需将映射中的
count替换为density,负向组同样对密度值取反即可
内容的提问来源于stack exchange,提问作者reggie
相关产品推荐
相关产品推荐

