如何在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
相关产品推荐
相关产品推荐

