Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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-如何向垂直线添加注释_Python_Matplotlib_Annotations_Time Series_Data Annotations - Fatal编程技术网

Python matplotlib-如何向垂直线添加注释

Python matplotlib-如何向垂直线添加注释,python,matplotlib,annotations,time-series,data-annotations,Python,Matplotlib,Annotations,Time Series,Data Annotations,我画了一个时间序列图,加了一条垂直线。 这条垂直线表示发生了一些事情,我想给这条垂直线添加一个注释。但我不知道怎么做:/ 以下是绘制数据和垂直线的代码: 我调整了现在包含数据的示例代码(虽然它们有点奇怪,但显示了问题:垂直线处的符号应该在绘图区域上方,其中两个文本框现在重叠。应通过不同的排列方式避免重叠,并使用虚线或其他东西指向文本所属的垂直线 %matplotlib inline %matplotlib inline import matplotlib.pyplot as plt import

我画了一个时间序列图,加了一条垂直线。 这条垂直线表示发生了一些事情,我想给这条垂直线添加一个注释。但我不知道怎么做:/

以下是绘制数据和垂直线的代码:

我调整了现在包含数据的示例代码(虽然它们有点奇怪,但显示了问题:垂直线处的符号应该在绘图区域上方,其中两个文本框现在重叠。应通过不同的排列方式避免重叠,并使用虚线或其他东西指向文本所属的垂直线

%matplotlib inline
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

data = np.array([['2017-07-01 16:30:00', '2017-07-02 16:30:00', '2017-07-03 16:30:00', '2017-07-04 16:30:00', '2017-07-05 16:30:00', '2017-07-06 16:30:00'],
                [1.4, 1.3, 2, 0.5, 0.002337, 3 ]])

fig2 = plt.figure(figsize=(16,9))

# TRAIN NORTH
ax0 = fig2.add_subplot(111)
ax0.scatter(x=data[0],y=data[1], color='green', marker='.')
#ax0.legend(df.iloc[0,0],loc='best')
#ax0.set_ylim(0,0.006)
# vertical lines when something happened
ax0.axvline('2017-07-02 16:30:00', color='green')
ax0.axvline('2017-07-02 16:30:00', color='green')
ax0.axvline('2017-07-05 16:30:00', color='green')
ax0.text('2017-07-02 16:30:00',0.005,'BigNews1',rotation=90,va='top')
ax0.text('2017-07-02 16:30:00',0.005,'BlaBlaBla2',rotation=90,va='top')
ax0.text('2017-07-05 16:30:00',0.005,'BigNews3',rotation=90,va='top')

他们使用了可以找到的包lineid_图

然而,这个包在某种程度上与datetime格式有问题。 对于这里显示的这个糟糕的示例代码,我真的很抱歉,但我真的是一个初学者,我希望一些baody可以帮助解决我的问题。

这里有一些代码与所要求的代码类似

守则解释:

  • ymin,ymax=plt.ylim()
    查找y轴的当前限制,
    ymax
    用于定位文本
  • arrowprops={'width':1,'headwidth':1,'headlength':1,'shrink':0.05}
    arrowprops从行的顶部到文本本身绘制一个“箭头”。将'headwidth'设置为1将使其成为一条线而不是箭头。可以在没有重叠的位置绘制一个真正的箭头
  • ax0.annotate('BigNews1',
    • xy=('2017-07-02 16:30:00',ymax),
      垂直线的顶部
    • xytext=(10,25),textcoords='offset points',
      文本相对于顶部的位置,以“点”为单位测量(与fontsize中的12点比较)
    • rotation=90,va='bottom',ha='center',
      text旋转90度
    • annotation\u clip=False,
      允许在绘图框外写入
    • arrowprops=arrowprops)
      设置“箭头”的属性
仍然缺少的是一个在有重叠时移动xytext的好算法

导入matplotlib.pyplot作为plt
将numpy作为np导入
数据=np.数组(['2017-07-01 16:30:00','2017-07-02 16:30:00','2017-07-03 16:30:00','2017-07-04 16:30:00','2017-07-05 16:30:00','2017-07-06 16:30:00'],
[1.4, 1.3, 2, 0.5, 0.002337, 3 ]])
图2=plt.图(图尺寸=(16,9))
ax0=图2.添加子批次(111)
ax0.scatter(x=data[0],y=data[1],color='green',marker='1'))
ymin,ymax=plt.ylim()
#事情发生时的垂直线
ax0.axvline('2017-07-02 16:30:00',颜色='绿色')
ax0.axvline('2017-07-02 16:30:00',颜色='绿色')
ax0.axvline('2017-07-05 16:30:00',颜色='绿色')
ymin,ymax=plt.ylim()
arrowprops={'width':1,'headwidth':1,'headlength':1,'shrink':0.05}
ax0.annotate('BigNews1',xy=('2017-07-02 16:30:00',ymax),xytext=(-10,25),textcoords='offset points',
旋转=90,va='底部',ha='中间',注释\U剪辑=False,ARROWSPROPS=ARROWSPROPS)
ax0.annotate('bla2',xy=('2017-07-02 16:30:00',ymax),xytext=(10,25),textcoords='offset points',
旋转=90,va='底部',ha='中间',注释\U剪辑=False,ARROWSPROPS=ARROWSPROPS)
ax0.annotate('BigNews3',xy=('2017-07-05 16:30:00',ymax),xytext=(0,25),textcoords='offset points',
旋转=90,va='底部',ha='中间',注释\U剪辑=False,ARROWSPROPS=ARROWSPROPS)
plt.紧_布局()
plt.show()
这是使用这些注释时顶部的外观:


可能?不太有用。注释重叠,看起来不太好。我发现了这一点,但它与日期格式有问题…在不知道数据外观的情况下,很难提供帮助。可能需要将日期数组转换为matplotlib格式,例如
date=[pd.to_datetime(t)for t in date]
。如果试图在内部打印区域之外写入文本,则需要类似于
txt=ax.text(…,clip\u on=False)的内容
@JohanC我用数据调整了示例代码,希望能更好地解释我的问题。非常感谢@JohanC!这正是我想要的。当有重叠时,这种移动xytext的算法是什么样子的?这很难吗?包中似乎包含了这个,但x轴c有问题协调,因为这是日期…看起来不太难。根据具体要求,需要一些工作才能让它在您的案例中运行。没有真正的具体要求。只是一个算法,可以水平移动注释框,使它们不再重叠。它应该独立于显示大小或大小使用了绘图大小,所以基于数据坐标系我想是不错的。