我如何(在 Python 中)通过使用 blitting 从绘图中删除 matplotlib 艺术家?

Posted

技术标签:

【中文标题】我如何(在 Python 中)通过使用 blitting 从绘图中删除 matplotlib 艺术家?【英文标题】:How can I (in Python) remove a matplotlib Artist from a plot by using blitting? 【发布时间】:2018-08-20 13:51:58 【问题描述】:

我可以使用 blitting 删除 matplotlib 艺术家,例如补丁吗?

    """Some background code:"""

    from matplotlib.figure import Figure
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas

    self.figure = Figure()
    self.axes = self.figure.add_subplot(111)
    self.canvas = FigureCanvas(self, -1, self.figure)

要使用 blit 将补丁添加到 matplotlib 图,您可以执行以下操作:

    """square is some matplotlib patch"""

    self.axes.add_patch(square)
    self.axes.draw_artist(square)
    self.canvas.blit(self.axes.bbox)

这行得通。但是,我可以使用 blit 将同一位艺术家从情节中移除吗? 我设法用square.remove() 删除它,我可以用self.canvas.draw() 函数更新绘图。但当然这很慢,我想改用 blitting

    """square is some matplotlib patch"""

    square.remove()
    self.canvas.draw()

以下不起作用:

    square.remove()
    self.canvas.blit(self.axes.bbox)

【问题讨论】:

不确定我是否正确理解了这个问题,但为什么不再次对画布进行blit,只是没有正方形? square.remove() 之后self.canvas.blit(self.axes.bbox) 似乎不起作用。艺术家留在情节中。 【参考方案1】:

删除blitted 对象的想法是再次blit 相同区域,而不是事先绘制对象。您也可以删除它,这样如果由于任何其他原因重新绘制画布,它也不会被看到。

问题的代码中似乎您忘记调用restore_region。有关 blitting 所需的完整命令集,请参见例如this question。

一个例子如下,如果你点击鼠标左键,矩形会显示,如果你点击右键,矩形会被移除。

import matplotlib.pyplot as plt
import numpy as np

class Test:
    def __init__(self):
        self.fig, self.ax = plt.subplots()
        # Axis with large plot
        self.ax.imshow(np.random.random((5000,5000)))
        # Draw the canvas once
        self.fig.canvas.draw()
        # Store the background for later
        self.background = self.fig.canvas.copy_from_bbox(self.ax.bbox)
        # create square
        self.square = plt.Rectangle([2000,2000],900,900, zorder=3, color="crimson")
        # Create callback to mouse movement
        self.cid = self.fig.canvas.callbacks.connect('button_press_event', 
                                                     self.callback)
        plt.show()

    def callback(self, event):
        if event.inaxes == self.ax:
            if event.button == 1:
                # Update point's location            
                self.square.set_xy((event.xdata-450, event.ydata-450))
                # Restore the background
                self.fig.canvas.restore_region(self.background)
                # draw the square on the screen
                self.ax.add_patch(self.square)
                self.ax.draw_artist(self.square)
                # blit the axes
                self.fig.canvas.blit(self.ax.bbox)
            else:
                self.square.remove()
                self.fig.canvas.restore_region(self.background)
                self.fig.canvas.blit(self.ax.bbox)

tt = Test()

【讨论】:

谢谢!只是在没有正方形的情况下重新调整画布。

以上是关于我如何(在 Python 中)通过使用 blitting 从绘图中删除 matplotlib 艺术家?的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用python通过https下载pdf文件

如何通过python将数据存储在MySQL数据库中

如何通过 python 中的 pandas 合并重现 R 中 foverlaps 的相同输出?

python - 如何通过python中的键在循环中命名熊猫数据框?

如何使用 python 通过特定协议过滤 pcap 文件?

如何通过 virtualenv 在 Amazon 的 Elastic Beanstalk 上使用最新版本的 python (3.6)