垂直线不会出现在matplotlib图中

时间:2017-07-31 14:43:52

标签: python numpy matplotlib plot

我有一个代码,可以让我绘制两个时间序列的数据。我还有许多事件,我在时间序列中绘制了一系列垂直线。我有三年的时间序列:2015年,2016年和2017年。我的代码适用于2015年和2016年,我生成了这样的图表(这是2016年):Timeseries data (red and blue) and event data (dotted vertical lines) plotted.

然而,当我绘制2017年的数据时,我无法重现事件数据的垂直线,如下所示(很难看到,但在此图中没有与第一个相同的垂直虚线):

Timeseries data (red and blue) but no event data plotted.

为什么我的代码在2017年无效?数据存储在.csv文件中,事件数据是从我已转换为一系列日期时间对象的.csv文件中的一列数据中绘制的。我已经检查过了,2015年,2016年和2017年.csv文件的格式保持不变。

仅供参考,这是我用来绘制的代码:

#Change format of "dates" column from string to datetime object    
FMT = '%d/%m/%Y'
dtlist = []
for i in range(0, len(dates)):
    dtlist.append(datetime.datetime.strptime(dates[i], FMT))  


##EVENT:
#Remove all values where there is no event
df2 = df_17[pd.notnull(df_17['event'])]

#Convert event values to datetime objects
df2['event'] = pd.to_datetime(df2['event'], format="%d/%m/%Y")
event_list = df2['event'].tolist()

#Plot timeseries on graph
fig, ax1 = plt.subplots(figsize=(18, 6))
plt.plot(dtlist, series_1, color='b', label='Series 1')
ymin, ymax = ax1.get_ylim()
for value in event_list:
    plt.axvline(x=value, ymin=ymin, ymax=ymax-1, color='k', linewidth=1.0, linestyle='--')    
ax1.set_xlabel('Time')
ax1.set_ylabel('Series 1')

ax2=ax1.twinx()
ax2.plot(dtlist, series_2, color='r', label='Series_2')
ax2.set_ylabel('Series 2')

plt.legend
plt.show()

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

在评论中,您说您从Pandas graphing a timeseries, with vertical lines at selected dates了解了yminymax的值,但示例中使用了vlines,而不是{{3 }}。 vlines使用数据比例。 axvline期望yminymax的值介于0和1之间。也就是说,y值在y轴的分数(0和1之间)中指定。如果您指定ymin=0ymax=0.5,则无论图表的当前数据比例如何,您都将得到一条从轴底部到轴中间的垂直线。如果放大或缩小,或向上或向下平移,半高垂直线仍然存在。

yminymax的默认值分别为0和1,因此要获得从底部到顶部的行,您可以简单地省略参数。

试试这个:

    plt.axvline(x=value, color='k', linewidth=1.0, linestyle='--') 

答案 1 :(得分:0)

非常感谢所有贡献者。 Warren Weckesser提供了正确的解决方案:使用axvline了解yminymax是在y轴的0到1之间的分数中确定的。删除它们,并改为使用此行:

plt.axvline(x=value, color='k', linewidth=1.0, linestyle='--') 

解决了这个问题。我的输出图:2017 Events plotted.

干杯!