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可以帮助解决我的问题。这里有一些代码与所要求的代码类似
守则解释:
查找y轴的当前限制,ymin,ymax=plt.ylim()
用于定位文本ymax
arrowprops从行的顶部到文本本身绘制一个“箭头”。将'headwidth'设置为1将使其成为一条线而不是箭头。可以在没有重叠的位置绘制一个真正的箭头arrowprops={'width':1,'headwidth':1,'headlength':1,'shrink':0.05}
ax0.annotate('BigNews1',
垂直线的顶部xy=('2017-07-02 16:30:00',ymax),
文本相对于顶部的位置,以“点”为单位测量(与fontsize中的12点比较)xytext=(10,25),textcoords='offset points',
text旋转90度rotation=90,va='bottom',ha='center',
允许在绘图框外写入annotation\u clip=False,
设置“箭头”的属性arrowprops=arrowprops)
导入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有问题协调,因为这是日期…看起来不太难。根据具体要求,需要一些工作才能让它在您的案例中运行。没有真正的具体要求。只是一个算法,可以水平移动注释框,使它们不再重叠。它应该独立于显示大小或大小使用了绘图大小,所以基于数据坐标系我想是不错的。