You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib散点图中展示各X轴值对应最大最小值

如何在散点图X轴每个值处标注对应最大最小值?

问题描述

我当前绘制散点图的代码如下:

x['hour_min'] = x['hour'].astype(str) + '_' + x['minute'].astype(str)
plt.subplots(figsize=(48, 8))
sns.scatterplot(x.hour_min, x.label)
plt.title('{}th label'.format(i+1))
plt.xlabel('hour_min')
plt.ylabel('label')

我希望像红色标注部分那样,为每个X轴值展示对应的最大和最小值,但不知如何实现,恳请帮助。

解决方案

要实现这个需求,我们需要先对数据分组计算每个X轴值的极值,再在散点图上添加对应标注,具体步骤如下:

1. 预处理数据,计算每个hour_min的极值

首先通过分组聚合,得到每个时间点对应的label最大和最小值:

# 按hour_min分组,聚合label的最大值和最小值
extremes = x.groupby('hour_min')['label'].agg(['max', 'min']).reset_index()

2. 绘制散点图并添加极值标注

在你原有绘图代码的基础上,遍历每个时间点的极值,用plt.text()在对应X轴位置标注最大值和最小值:

# 原绘图代码(优化为面向对象式绘图,更便于后续操作)
x['hour_min'] = x['hour'].astype(str) + '_' + x['minute'].astype(str)
fig, ax = plt.subplots(figsize=(48, 8))
sns.scatterplot(data=x, x='hour_min', y='label', ax=ax)
plt.title('{}th label'.format(i+1))
plt.xlabel('hour_min')
plt.ylabel('label')

# 遍历每个hour_min,添加极值标注
for _, row in extremes.iterrows():
    # 找到当前hour_min在X轴上的坐标位置
    tick_index = next(idx for idx, tick in enumerate(ax.get_xticklabels()) if tick.get_text() == row['hour_min'])
    # 计算Y轴偏移量,避免标注与散点重叠
    y_offset = (ax.get_ylim()[1] - ax.get_ylim()[0]) * 0.01
    
    # 标注最大值(红色,位于散点上方)
    ax.text(tick_index, row['max'] + y_offset, 
            f'Max: {row["max"]}', color='red', ha='center', fontweight='bold')
    # 标注最小值(可根据需求改颜色,比如也用红色)
    ax.text(tick_index, row['min'] - y_offset, 
            f'Min: {row["min"]}', color='red', ha='center', fontweight='bold')

# 调整Y轴范围,防止标注被图框截断
plt.ylim(
    ax.get_ylim()[0] - y_offset*3,
    ax.get_ylim()[1] + y_offset*3
)

# 如果X轴标签太多重叠,可旋转标签提升可读性
plt.xticks(rotation=45)

plt.show()

小提示

  • 你可以根据需求修改标注的字体大小(添加fontsize参数)、偏移量或者样式,让标注更贴合你的可视化需求。
  • 如果X轴标签特别密集,除了旋转标签,还可以尝试缩小图的宽度或者调整标签间距。

内容的提问来源于stack exchange,提问作者Bowen Peng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:44:24