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

如何缩放pandas绘制的直方图y轴以显示小时级计数?

实现方案

不需要修改原始数据,两种思路都可以实现y轴的小时级计数展示,plt.yticks确实能达成效果,但有更稳妥的实现方式:


方案1:直接缩放柱高与轴范围(推荐,无显示偏差)

这个方法会同步调整柱形实际高度和y轴范围,刻度和柱高完全匹配,不会出现静态显示正常、交互/加数据标签时数值错乱的问题:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv(r"D:/tmp/load.csv")
# 绘制直方图时捕获坐标轴对象,建议明确指定绘图列避免多子图问题
ax = df["tag"].hist(bins=range(20,80,5))
sns.set()
plt.xlabel("Value")

# 按1小时=4个15分钟采样点的比例缩放
scale_ratio = 1/4
# 调整y轴范围
ax.set_ylim(bottom=0, top=ax.get_ylim()[1] * scale_ratio)
# 逐个调整柱形高度
for bar in ax.patches:
    bar.set_height(bar.get_height() * scale_ratio)

plt.ylabel("Hourly count")
plt.show()

方案2:用plt.yticks自定义刻度文本(仅适合静态图快速出图)

你提到的plt.yticks可以实现需求,但本质是只修改刻度的显示文字,不会改变柱形的实际高度,如果后续需要给柱形加数值标注、做交互式图表,会出现显示值和实际值不匹配的问题,仅适合不需要后续调整的静态图场景:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv(r"D:/tmp/load.csv")
df["tag"].hist(bins=range(20,80,5))
sns.set()
plt.xlabel("Value")

# 读取当前y轴刻度位置,将刻度标签统一除以4
tick_positions, _ = plt.yticks()
plt.yticks(tick_positions, [round(t/4, 1) for t in tick_positions])

plt.ylabel("Hourly count")
plt.show()

方案3:从统计逻辑层面调整(最严谨)

如果不想做绘图后处理,可以在统计阶段就按小时粒度聚合:先给每条数据匹配对应的小时级时间戳,统计每个数值区间覆盖的不重复小时数,再用统计结果直接绘图,从根源上保证计数是小时维度,不需要额外缩放。这种方式逻辑最通顺,适合需要做数据校验的正式分析场景。


内容的提问来源于stack exchange,提问作者Cedric Zoppolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:51:25