如何在带datetime刻度的seaborn pointplot中添加位置正确的垂直竖线
问题原因
seaborn的pointplot属于分类可视化函数,不管x轴输入的是否为时间类型,都会将x轴数据当作离散分类处理,内部x轴的坐标值为从0开始的整数索引,和时间戳的实际数值没有映射关系,因此直接传递Timestamp对象给axvline的x参数会出现定位偏移。
解决方法
方案1:保留pointplot,手动计算竖线坐标
首先获取x轴分类对应的时间序列,计算目标日期在相邻分类之间的相对位置,用计算后的整数坐标绘制竖线:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df['year'] = pd.to_datetime(df['year']) fig,ax = plt.subplots() # 绘制pointplot sns.pointplot(x='year', y='PM', data=df, ax=ax, color='black', scale=0.5, capsize=0.2, errwidth=0.8 ) # 计算目标日期的x轴坐标 target_date = pd.Timestamp('2012-09-01') # 获取x轴所有分类对应的时间 x_time = pd.to_datetime(ax.get_xticklabels()) for idx in range(len(x_time)-1): if x_time[idx] <= target_date < x_time[idx+1]: # 计算相对位置 pos = idx + (target_date - x_time[idx])/(x_time[idx+1] - x_time[idx]) break # 绘制竖线 ax.axvline(x=pos, ymin=0,ymax=1, ls='--', linewidth=0.8,zorder=0, clip_on=False) plt.show()
方案2:改用lineplot使用连续时间轴
如果需要x轴为真实的连续时间刻度,可以替换为lineplot,此时直接传递时间戳即可正常定位:
df['year'] = pd.to_datetime(df['year']) fig,ax = plt.subplots() # 用lineplot实现类似pointplot的效果 sns.lineplot(x='year', y='PM', data=df, ax=ax, color='black', marker='o', err_style='bars', err_kws={'capsize':4}, linewidth=0.8 ) # 直接传递时间戳即可定位 ax.axvline(x=pd.Timestamp('2012-09-01'), ymin=0,ymax=1, ls='--', linewidth=0.8,zorder=0, clip_on=False) plt.show()
内容的提问来源于stack exchange,提问作者apple apple
相关产品推荐
相关产品推荐

