Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib plot中不显示垂直线_Python_Numpy_Matplotlib_Plot - Fatal编程技术网

Python matplotlib plot中不显示垂直线

Python matplotlib plot中不显示垂直线,python,numpy,matplotlib,plot,Python,Numpy,Matplotlib,Plot,我有一个代码,它允许我绘制两个时间序列的数据。我还有许多事件,我在时间序列中将它们绘制为一系列垂直线。我有三年的时间序列:2015年、2016年和2017年。我的代码在2015年和2016年运行良好,我生成了这样一个图(这是2016年的): 然而,当我绘制2017年的数据时,我无法再现事件数据的垂直线,如下所示(很难看到,但在这张图中没有第一张图中的垂直虚线): 关于为什么我的代码在2017年不起作用,有什么想法吗?数据存储在.csv文件中,事件数据是从.csv文件中的一列数据打印出来的,我已

我有一个代码,它允许我绘制两个时间序列的数据。我还有许多事件,我在时间序列中将它们绘制为一系列垂直线。我有三年的时间序列:2015年、2016年和2017年。我的代码在2015年和2016年运行良好,我生成了这样一个图(这是2016年的):

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

关于为什么我的代码在2017年不起作用,有什么想法吗?数据存储在.csv文件中,事件数据是从.csv文件中的一列数据打印出来的,我已将该列数据转换为一系列datetime对象。我已经检查过了,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()

非常感谢任何帮助

在一条评论中,您说您从中获得了有关
ymin
ymax
的值的想法,但这里使用的示例并非如此<代码>虚拟线使用数据刻度
axvline
要求
ymin
ymax
的值介于0和1之间。也就是说,
y
值以y轴的分数(介于0和1之间)指定。如果指定,例如,
ymin=0
ymax=0.5
,则无论绘图的当前数据比例如何,都会得到一条从轴底部到轴中间的垂直线。如果放大或缩小,或向上或向下平移,则半高垂直线保持不变

ymin
ymax
的默认值分别为0和1,因此要得到从下到上的一行,只需省去参数即可

试试这个:

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

非常感谢所有做出贡献的人。Warren Weckesser给出了正确的解决方案:使用axvline可以理解,
ymin
ymax
是以y轴0到1之间的分数确定的。删除它们,并改用此行:

plt.axvline(x=value, color='k', linewidth=1.0, linestyle='--') 
解决了这个问题。我的输出图:


干杯

事件列表的值是多少?2017-01-01之后是否有日期?您是否测试了
ymin
ymax
是否为合理值?根据文档,它们必须分别介于0和1之间,才能绘制垂直线
ymax=ymax-1
似乎有点可疑。
event_list
是数据帧列中的值列表:其中有六个值,对应2017年的事件。有日期在2017-01-01之后,例如我的第一个事件是2017-01-25。我认为
ymin
ymax
是合理的。在绘制
axvline
之前,我有一行
ymin,ymax=ax1.get_ylim()
,因此我假设
ymin
ymax
对应于
ax1
的y值,分别为0和6000。我从这篇文章中得到了
ymax=ymax-1
的想法,我认为这是一个好主意。使用
ymax=ymax
不会更改我的输出。这是正确的!我从代码中删除了
ymin
ymax
,并能够生成所需的绘图。非常感谢大家。