Python 如何在matplotlib中为子地块设置快速十字光标?

Python 如何在matplotlib中为子地块设置快速十字光标?,python,matplotlib,Python,Matplotlib,在这段backtrader的matplotlib实现视频中,我可以看到matplotlib中似乎存在一个默认的、非常快速且节省CPU的十字光标 我希望在matplotlib中使用相同类型的鼠标光标进行简单的多子图绘制,如下所示: import numpy as np import matplotlib matplotlib.use('QT5Agg') matplotlib.rcParams['figure.figsize'] = (20.0, 22.0) import matplotlib.p

在这段
backtrader
matplotlib
实现视频中,我可以看到
matplotlib
中似乎存在一个默认的、非常快速且节省CPU的十字光标

我希望在
matplotlib
中使用相同类型的鼠标光标进行简单的多子图绘制,如下所示:

import numpy as np
import matplotlib

matplotlib.use('QT5Agg')
matplotlib.rcParams['figure.figsize'] = (20.0, 22.0)
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = plt.subplot(2, 1, 1)
ax2 = plt.subplot(2, 1, 2, sharex=ax1)

ax1.plot(np.array(np.random.rand(100)))
ax2.plot(np.array(np.random.rand(100)))

plt.show()
因此,如果我的鼠标在下部子图中,我想直接且非常精确地看到,下部图中的哪个x/y值对应于上部图中的哪个值对


我已经找到了其他解决方案,但与视频中的实现相比,它们似乎非常慢。

您可以通过创建十字光标
sel.extras.append()
注意在绘制新光标时删除旧光标。使用
sel.annotation.set_text
可以调整显示的弹出注释。要省去注释,请使用
sel.annotation.set\u visible(False)
。要在另一个子批次中找到相应的y值,可以使用从曲线中提取的数据进行
np.interp

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入MPLS游标
def十字线(sel):
x、 y2=选择目标
y1=np.interp(选择目标[0],plot1.get_-xdata(),plot1.get_-ydata())
sel.annotation.set_text(f'x:{x:.2f}\ny1:{y1:.2f}\ny2:{y2:.2f})
#sel.annotation.set_可见(False)
hline1=ax1.axhline(y1,color='k',ls=':')
vline1=ax1.axvline(x,color='k',ls=':')
vline2=ax2.axvline(x,color='k',ls=':')
hline2=ax2.axhline(y2,color='k',ls=':')
sel.extras.append(hline1)
附加选择(第1行)
sel.extras.append(hline2)
附加选择(第2行)
图=plt.图(图尺寸=(15,10))
ax1=plt.子批次(2,1,1)
ax2=plt.子批(2,1,2,sharex=ax1)
plot1,=ax1.plot(np.array(np.random.uniform(-1,1100.cumsum()))
plot2,=ax2.plot(np.array(np.random.uniform(-1,1100.cumsum()))
cursor=mplcursors.cursor(plot2,hover=True)
cursor.connect('add',十字线)
plt.show()

下面是一个替代实现,它将数据存储在全局变量中并移动行(而不是删除和重新创建行):

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入MPLS游标
def十字线(sel):
x=选择目标[0]
y1=np.INTP(x图,1X图,1Y图)
y2=np.INTP(x,绘图2X,绘图2Y)
sel.annotation.set_可见(False)
hline1.set_ydata([y1])
vline1.set_扩展数据([x])
hline2.set_ydata([y2])
vline2.set_扩展数据([x])
hline1.set_可见(True)
vline1.设置为可见(真)
hline2.set_可见(True)
vline2.set_可见(真)
图=plt.图(图尺寸=(15,10))
ax1=plt.子批次(2,1,1)
ax2=plt.子批(2,1,2,sharex=ax1)
plot1,=ax1.plot(np.array(np.random.uniform(-1,1100.cumsum()))
plot2,=ax2.plot(np.array(np.random.uniform(-1,1100.cumsum()))
plot1x=plot1.获取扩展数据()
plot1y=plot1.get_ydata()
plot2x=plot2.get_xdata()
plot2y=plot2.get_ydata()
hline1=ax1.axhline(plot1y[0],color='k',ls=':',visible=False)
vline1=ax1.axvline(plot1x[0],color='k',ls='':',visible=False)
hline2=ax2.axhline(plot2y[0],color='k',ls='':',visible=False)
vline2=ax2.axvline(plot2x[0],color='k',ls='':',visible=False)
cursor=mplcursors.cursor([plot1,plot2],hover=True)
cursor.connect('add',十字线)
plt.show()

感谢您的努力。但是这个解决方案和反向交易相比,我觉得不是很快,你确定吗?关闭注释时,is的工作速度似乎与视频中显示的速度相同。要稍微加快速度,可以将
plot1.get_xdata()
plot1.get_ydata()
的结果存储在全局变量中。您无法避免使用matplotlib功能。我现在意识到Backtrader使用matplotlib的
MultiCursor()
功能(尽管稍加修改)。我认为这应该是合适的解决方案。你的问题还有待解决吗?