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

