Matplotlib绘图中不出现垂直线

3
我有一段代码,可以绘制两个时间序列的数据。我还有一些事件,我将它们作为一系列垂直线绘制在时间序列中。我有三年的时间序列: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()

非常感谢您的帮助!


event_list 的值是多少?在 2017-01-01 之后是否有日期? - unutbu
你测试过yminymax的值是否合理吗?根据文档,它们必须在0和1之间才能绘制垂直线。ymax=ymax-1看起来可能有点可疑。 - marcushobson
event_list是一个包含数据框列中的数值的列表:它有六个值,对应于2017年的事件。在2017-01-01之后有日期,例如我的第一个事件是2017-01-25 - ailsa_naismith
看着这些图表,我怀疑这两个图表不是由同一段代码生成的。因此,我们很难猜测您在其中做了什么修改。请注意,像这样的问题应该始终包含一个 [mcve]。 - ImportanceOfBeingErnest
这些图表是由相同的代码生成的,但我应该指出,我已经改变了2017年图表的长度,以反映我只有截至7月份的数据。我认为唯一的其他区别是2017年图表中存在水平/垂直网格线。 - ailsa_naismith
显示剩余3条评论
2个回答

7
在评论中,您说您的yminymax值的想法来自于Pandas graphing a timeseries, with vertical lines at selected dates,但那里的示例使用了vlines而不是axvlinevlines使用数据比例。 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='--') 

这是正确的!我从代码中删除了yminymax,并成功生成了所需的图表。非常感谢大家。 - ailsa_naismith

0
非常感谢所有做出贡献的人。Warren Weckesser提供了正确的解决方案:使用axvline可以理解yminymax是在y轴上以0到1之间的分数确定的。将它们移除,并使用以下代码替代:
plt.axvline(x=value, color='k', linewidth=1.0, linestyle='--') 

解决了问题。我的输出图表:2017年事件绘制 干杯!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接