Pandas DataFrame绘图如何调整x/y轴缩放展示离群值
离群点场景下的坐标轴适配方案
针对大值离群点导致常规数据被压缩的问题,有三类成熟的调整方案,可按需选择:
- 坐标轴截断(断轴,完全匹配刻度跳级需求)
这是最贴合需求的方案:不需要修改原始数据,将存在大值离群点的坐标轴拆为两段,下段用90%左右的画布空间适配0-100的常规数据区间,保持正常刻度间距;上段仅预留10%左右的画布空间放置100000量级的离群点,两段衔接处用双斜杠截断标记明确提示刻度跳变,读者既能清晰分辨常规数据的分布,也能看到离群点的准确取值。
以Python的matplotlib库为例,核心实现代码如下:import matplotlib.pyplot as plt # 按1:9的高度比例拆分上下两个共享x轴的绘图区 fig, (ax_top, ax_bottom) = plt.subplots(2, 1, sharex=True, gridspec_kw={'height_ratios': [1, 9]}) # 上段坐标轴范围适配离群点 ax_top.set_ylim(99000, 101000) # 下段坐标轴范围适配常规数据 ax_bottom.set_ylim(0, 110) # 隐藏两段衔接处的多余边框 ax_top.spines['bottom'].set_visible(False) ax_bottom.spines['top'].set_visible(False) # 绘制截断标识 mark_len = 0.015 draw_params = dict(transform=ax_top.transAxes, color='black', clip_on=False) ax_top.plot((-mark_len, mark_len), (-mark_len, mark_len), **draw_params) ax_top.plot((1-mark_len, 1+mark_len), (-mark_len, mark_len), **draw_params) draw_params['transform'] = ax_bottom.transAxes ax_bottom.plot((-mark_len, mark_len), (1-mark_len, 1+mark_len), **draw_params) ax_bottom.plot((1-mark_len, 1+mark_len), (1-mark_len, 1+mark_len), **draw_params) - 非线性刻度适配
如果不想拆分绘图区,可以直接对坐标轴做非线性变换:- 对数刻度:直接将对应轴切换为log尺度,可自动压缩大值区间的占比,注意零值需要加极小偏移量避免计算错误,调用方式为
plt.yscale('log');缺点是会改变常规数据的视觉间距,对不熟悉对数轴的读者存在误读风险 - 自定义分档刻度:0-100区间保持正常线性刻度,100以上单独设置「>100 离群值」的特殊刻度位,所有超阈值离群点统一绘制在该位置,适合不需要展示离群点精确取值、仅需标注离群点存在的场景
- 对数刻度:直接将对应轴切换为log尺度,可自动压缩大值区间的占比,注意零值需要加极小偏移量避免计算错误,调用方式为
- 主图+缩略图组合
主图完全按0-100的常规数据范围设置坐标轴,保证99%的常规数据展示清晰;在图表边角位置添加一个缩小的全范围缩略子图,缩略图适配包含离群点的全量数据范围,用来提示离群点的存在和取值,不会干扰主图的阅读体验。
未做调整时受离群点影响的异常图表效果:
- 箱线图:
- 散点图:
注意:所有涉及刻度截断、非线性变换的调整,必须在图表上添加明确标识,避免读者误判数据比例关系。
内容的提问来源于stack exchange,提问作者newuser11111
相关产品推荐
相关产品推荐



