使用axvline结合DatetimeIndex绘制竖线异常问题求助
用Matplotlib的axvline绘制日期竖线时显示在1970-01-01的问题解决
我尝试用axvline函数绘制竖线,直接传入日期字符串,但竖线总是显示在1970-01-01。我的DataFrame信息如下:
CPISXS CPIX WTI UMCSI Dates 2022-08-31 387.748 263.732 93.67 44.0 2022-09-30 390.555 264.370 84.26 42.0 2022-10-31 390.582 264.442 87.55 42.0 2022-11-30 390.523 263.771 84.37 46.0 2022-12-31 NaN NaN NaN NaN <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 756 entries, 1960-01-31 to 2022-12-31 Freq: M Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 CPISXS 480 non-null float64 1 CPIX 671 non-null float64 2 WTI 755 non-null float64 3 UMCSI 670 non-null float64 dtypes: float64(4) memory usage: 45.7 KB
我的代码如下:
fig2, m1 = plt.subplots(figsize=(12,6)) m2=m1.twinx() m1.axvline(x='1990-01-30') m1.plot(df0['UMCSI'],'r--',linewidth=1) m2.plot(df0['WTI'],'b')
问题原因与解决方法
问题出在先调用axvline,后绘制折线图。Matplotlib在你先传入日期字符串时,还未识别到x轴是Datetime类型,会把字符串默认转成时间戳起始点(1970-01-01)。
方法1:调整代码顺序(无需额外转换)
先绘制折线图,让Matplotlib自动识别x轴为日期类型,再调用axvline传入日期字符串即可:
fig2, m1 = plt.subplots(figsize=(12,6)) m2=m1.twinx() # 先绘制折线图,让x轴被识别为日期类型 m1.plot(df0['UMCSI'],'r--',linewidth=1) m2.plot(df0['WTI'],'b') # 再绘制竖线,此时直接传日期字符串正常生效 m1.axvline(x='1990-01-30')
方法2:直接传入Timestamp对象(不受代码顺序影响)
把日期字符串转成pandas.Timestamp对象传入,不管代码顺序如何都能准确定位:
import pandas as pd fig2, m1 = plt.subplots(figsize=(12,6)) m2=m1.twinx() m1.axvline(x=pd.Timestamp('1990-01-30')) m1.plot(df0['UMCSI'],'r--',linewidth=1) m2.plot(df0['WTI'],'b')
内容的提问来源于stack exchange,提问作者user20856754
相关产品推荐
相关产品推荐

