如何修改matplotlib折线图xtick标签以适配19:00-次日7:00时间区间
问题原因
你当前遇到的刻度挤在两端、中间留空的问题,核心原因是matplotlib默认将小时值作为连续数值坐标轴处理:7-18这12个小时的数值区间在坐标轴上是真实存在的,你只是通过plt.xticks()隐藏了这部分的刻度显示,并没有删除对应的坐标轴区间,因此会出现6和19之间的大片空白。
解决方案
方案1:使用分类坐标轴(推荐,最适配你的需求)
直接将需要展示的12个时段作为分类值均匀排列在x轴上,完全去掉7-18的空白区间,适合仅对比夜间时段流量的场景:
plt.subplot(2,1,1) # 定义你需要展示的夜间时段顺序 night_hours = [0,1,2,3,4,5,6,19,20,21,22,23] # 提取对应时段的流量数据,保证顺序和上面的时段一一对应 traffic_data = by_hour_business_night['traffic_volume'].reindex(night_hours).values # 用0-11作为x轴的位置坐标,保证每个时段均匀分布 plt.plot(range(len(traffic_data)), traffic_data) # 替换x轴标签为对应的时段值 plt.xticks(range(len(traffic_data)), night_hours) plt.title('Business Nights Traffic Volume by Hours') plt.ylabel('Traffic Volume') plt.ylim(0,6500) plt.show()
方案2:保留连续数值轴,添加x轴断轴
如果你需要和日间的24小时连续坐标轴做对齐对比,可以用断轴功能将7-18的区间折叠隐藏:
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(10,4)) fig.subplots_adjust(wspace=0.05) night_hours = [0,1,2,3,4,5,6,19,20,21,22,23] traffic_data = by_hour_business_night['traffic_volume'].reindex(night_hours).values # 左侧坐标轴展示0-6时段 ax1.plot(night_hours[:7], traffic_data[:7]) ax1.set_xlim(-0.5, 6.5) # 右侧坐标轴展示19-23时段 ax2.plot(night_hours[7:], traffic_data[7:]) ax2.set_xlim(18.5, 23.5) # 隐藏中间的边框,添加断轴标记 ax1.spines.right.set_visible(False) ax2.spines.left.set_visible(False) ax1.tick_params(labelright=False) ax2.tick_params(labelleft=False) d = 0.015 kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False) ax1.plot((1-d,1+d), (-d,+d), **kwargs) ax1.plot((1-d,1+d),(1-d,1+d), **kwargs) kwargs.update(transform=ax2.transAxes) ax2.plot((-d,+d), (1-d,1+d), **kwargs) ax2.plot((-d,+d), (-d,+d), **kwargs) plt.suptitle('Business Nights Traffic Volume by Hours') ax1.set_ylabel('Traffic Volume') plt.ylim(0,6500) plt.show()
内容的提问来源于stack exchange,提问作者Jimmy Lyu
相关产品推荐
相关产品推荐

