Python 重新绘制并清除部分独立绘图

Python 重新绘制并清除部分独立绘图,python,matplotlib,Python,Matplotlib,由于性能问题,我希望在不重新绘制完整绘图的情况下稍微更改绘图 当鼠标在上面的图上移动时,我想在光标x位置的所有图表上画一条垂直虚线。由于性能原因,我不想再画整个图,只画垂直线 我可以通过单击axvline()来显示线,但如果再次单击绘图,则会出现删除绘制线的问题 我想在每一个情节上都有第二层的那种,我可以独立画和清晰。稍后,我想在绘图和垂直线的交点上另外画一个点,并在其下打印y值 我发现如何绘制独立于标签和比例的绘图部分。但我想重画一部分图表。有没有其他方法可以得到一个额外的图层或以其他方式有

由于性能问题,我希望在不重新绘制完整绘图的情况下稍微更改绘图

当鼠标在上面的图上移动时,我想在光标x位置的所有图表上画一条垂直虚线。由于性能原因,我不想再画整个图,只画垂直线

我可以通过单击
axvline()
来显示线,但如果再次单击绘图,则会出现删除绘制线的问题

我想在每一个情节上都有第二层的那种,我可以独立画和清晰。稍后,我想在绘图和垂直线的交点上另外画一个点,并在其下打印y值

我发现如何绘制独立于标签和比例的绘图部分。但我想重画一部分图表。有没有其他方法可以得到一个额外的图层或以其他方式有效地绘制

该应用程序基于
PyQt4
matplotlib.backends.backend\u qt4agg

IPython笔记本电脑的最小布局代码

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(3, 2, wspace=0.1, height_ratios=[3,1,1])
main_plot = plt.subplot(gs[0, :])
sub_plots = [plt.subplot(gs[1, x]) for x in range(2)]
sub_plots.extend([plt.subplot(gs[2, x]) for x in range(2)])

main_plot.plot(np.arange(100), [np.random.randint(0, 100) for y in range(100)])
for sub_plot in sub_plots:
    sub_plot.plot(np.arange(100), [np.random.randint(0, 100) for y in range(100)])          
我的应用程序中减少的代码

def __init__(self):
    self.figure = Figure((20.0, 10.0), dpi=100)
    self.figure.patch.set_color('w')

    gs = gridspec.GridSpec(3, 2, wspace = 0.1, height_ratios=[3, 1, 1])
    self.main_plot = self.figure.add_subplot(gs[0, :])
    self.sub_plots = [self.figure.add_subplot(gs[1, x]) for x in range(2)]
    self.sub_plots.extend([self.figure.add_subplot(gs[2, x]) for x in range(2)])

    self.plotCanvas = FigureCanvas(self.figure)
    self.plotCanvas.mpl_connect('button_press_event', self._on_click)

def _on_click(self, event):
    if event.inaxes == self.main_plot:
        self.main_plot.axvline(event.xdata)
        for plot_area in self.sub_plots:
            plot_area.axvline(event.xdata)

        self.plotCanvas.draw()
        return

您是否尝试过使用
设置扩展数据
?尝试在
\uuu init\uuuu
中添加对axvline对象的引用,即
self.vline=ax.axvline(some_x)
(如果要在使用vline之前隐藏它,可以将其放在xlims之外)。现在在
\u中单击
调用
self.vline.set\u xdata(event.xdata)
,而不是创建新的axvline。由于艺术家已经出现在绘图中,mpl只应重新绘制
self.vline

请尝试以下示例以了解其工作原理:

import matplotlib as plt
fig, ax = plt.subplots(1, 1)
fig.show() #note that show will only "work" if you use ipython. use plt.show() otherwise.
vl = ax.axvline(0.3)
fig.canvas.draw()
vl.set_xdata(0.6)
fig.canvas.draw()
# plt.show()

在为截取绘制圆时,可以使用相同的技巧,即在
\uuuu init\uuuu
中引用它,然后使用
self.circle.set\u data(new\ux,new\uy)
如果我没有绘制任何数据,我会看到一条线改变它的位置。那很好。但性能仍然很低,如果我打印数据,则该行将被打印隐藏。我试着用“zorder”来调整,但它没有改变任何事情。