matplotlib 如何为垂直线添加注解

svdrlsy4  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(240)

我做了一个时间序列图,并添加了一条垂直线。这条垂直线表示发生了一些事情,我想给这条垂直线添加一个注解。但我不知道如何做到这一点:
下面是绘制数据和垂直线的代码:

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

%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')

I would like to have something like shown in this picture
他们使用了软件包lineid_plot,可以在here中找到
但是,这个包在日期时间格式上有问题。我真的很抱歉这里显示的这个糟糕的示例代码,但我真的是一个初学者,我希望somebaody可以帮助解决我的问题。

tkclm6bt

tkclm6bt1#

下面是一些显示annotation的代码,类似于请求的代码。
代码解释:

  • ymin, ymax = plt.ylim()查找y轴的当前限制,ymax用于定位文本
  • arrowprops = {'width': 1, 'headwidth': 1, 'headlength': 1, 'shrink':0.05}一个“箭头”从行的顶部画到文本本身。将'headwidth'设置为1会使其成为一条线而不是一个箭头。人们可以在没有重叠的地方画一个真实的的箭头。
  • ax0.annotate('BigNews1',
  • xy=('2017-07-02 16:30:00', ymax),垂直线的顶部
  • xytext=(10, 25), textcoords='offset points',文本相对于顶部的位置,以“磅”为单位(与12磅的字体大小相比)
  • rotation=90, va='bottom', ha='center',文本旋转90度
  • annotation_clip=False,允许在图的框外写入
  • arrowprops=arrowprops)设置“箭头”的属性

仍然缺少的是一个好的算法,当有重叠时移动xytext。

import matplotlib.pyplot as plt
import numpy as np

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))
ax0 = fig2.add_subplot(111)
ax0.scatter(x=data[0],y=data[1], color='green', marker='.')
ymin, ymax = plt.ylim()
# 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')

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',
             rotation=90, va='bottom', ha='center', annotation_clip=False, arrowprops=arrowprops)
ax0.annotate('BlaBlaBla2', xy=('2017-07-02 16:30:00', ymax), xytext=(10, 25), textcoords='offset points',
             rotation=90, va='bottom', ha='center', annotation_clip=False, arrowprops=arrowprops)
ax0.annotate('BigNews3', xy=('2017-07-05 16:30:00', ymax), xytext=(0, 25), textcoords='offset points',
             rotation=90, va='bottom', ha='center', annotation_clip=False, arrowprops=arrowprops)
plt.tight_layout()
plt.show()

下面是带有这些注解的顶部的外观:

相关问题