Python 同一窗口中图形的matplotlib序列

Python 同一窗口中图形的matplotlib序列,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我正在测试一个算法,我想用matplotlib生成一系列显示中间结果的图形 我不需要动画,也不需要屏幕上的多个数字,也不需要子画面 我只想生成一系列图形(可能使用pyplot),完成后,将显示一个窗口。然后我想使用箭头在图形序列中导航 我怎么能做那样的事 我试图搜索,但我只能在屏幕上找到子图或多个数字 感谢最常用的方法是在同一图形中创建一系列轴,并且一次只显示一个轴 下面是一个示例(左右箭头键控制显示哪个绘图): 导入matplotlib.pyplot作为plt 将numpy作为np导入 def

我正在测试一个算法,我想用matplotlib生成一系列显示中间结果的图形

我不需要动画,也不需要屏幕上的多个数字,也不需要子画面

我只想生成一系列图形(可能使用pyplot),完成后,将显示一个窗口。然后我想使用箭头在图形序列中导航

我怎么能做那样的事

我试图搜索,但我只能在屏幕上找到子图或多个数字


感谢

最常用的方法是在同一图形中创建一系列轴,并且一次只显示一个轴

下面是一个示例(左右箭头键控制显示哪个绘图):

导入matplotlib.pyplot作为plt
将numpy作为np导入
def main():
x=np.linspace(0,10100)
轴=轴序列()
对于i,轴在拉链中(范围(3),轴):
轴图(x,np.sin(i*x))
ax.set_title('Line{}'。格式(i))
对于i,轴在拉链中(范围(5),轴):
ax.imshow(np.random.random((10,10)))
ax.set_title('Image{}'。格式(i))
axes.show()
类AxeSequence(对象):
“”“在图形中创建一系列轴,其中在任何位置都只显示一个轴。”
给定时间。显示的绘图由箭头键控制。”“”
定义初始化(自):
self.fig=plt.figure()
self.axes=[]
self._i=0#当前显示的轴索引
self._n=0#上次创建的轴索引
self.fig.canvas.mpl\u connect(“按键事件”,self.on\u按键)
定义(自我):
尽管如此:
屈服于自我
def新(自我):
#需要指定标签,以便创建新轴
#而不是“添加轴”只是返回原始轴。
ax=自身图添加轴([0.15,0.1,0.8,0.8],
可见=错误,标签=自身。\n)
自.\u n+=1
self.axes.append(ax)
返回斧头
按键上的def(自身,事件):
如果event.key=='right':
self.next_plot()
elif event.key==“左”:
self.prev_plot()
其他:
返回
self.fig.canvas.draw()
def next_绘图(自):
如果self.\u i0:
self.axes[self.\u i].设置\u可见(False)
self.axes[self.\u i-1]。设置\u可见(True)
自._i-=1
def显示(自我):
self.axes[0]。设置_可见(True)
plt.show()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

如果它们都是同一类型的绘图,你可以只更新相关艺术家的数据。如果在每个绘图中具有相同数量的项目,则此操作尤其容易。现在我将略去一个例子,但是如果上面的例子内存太大,那么只更新艺术家的数据就可以轻松得多。

有几种不同的方法,哪种方法最好取决于你在做什么。不同的图形是否具有相同的绘图类型?(例如,您是在绘制线条,然后是图像,还是仅绘制具有不同数据的线条)每个线条中的项目数是否不同?(例如,每个图形中是否有3条线具有不同的数据,或者线的数量是否不同?)适用于任何对象的方法也是最慢的。绘图都是相同的类型:我在二维平面中绘制点和线。谢谢!我一直在找这样的东西!
import matplotlib.pyplot as plt
import numpy as np

def main():
    x = np.linspace(0, 10, 100)
    axes = AxesSequence()
    for i, ax in zip(range(3), axes):
        ax.plot(x, np.sin(i * x))
        ax.set_title('Line {}'.format(i))
    for i, ax in zip(range(5), axes):
        ax.imshow(np.random.random((10,10)))
        ax.set_title('Image {}'.format(i))
    axes.show()

class AxesSequence(object):
    """Creates a series of axes in a figure where only one is displayed at any
    given time. Which plot is displayed is controlled by the arrow keys."""
    def __init__(self):
        self.fig = plt.figure()
        self.axes = []
        self._i = 0 # Currently displayed axes index
        self._n = 0 # Last created axes index
        self.fig.canvas.mpl_connect('key_press_event', self.on_keypress)

    def __iter__(self):
        while True:
            yield self.new()

    def new(self):
        # The label needs to be specified so that a new axes will be created
        # instead of "add_axes" just returning the original one.
        ax = self.fig.add_axes([0.15, 0.1, 0.8, 0.8], 
                               visible=False, label=self._n)
        self._n += 1
        self.axes.append(ax)
        return ax

    def on_keypress(self, event):
        if event.key == 'right':
            self.next_plot()
        elif event.key == 'left':
            self.prev_plot()
        else:
            return
        self.fig.canvas.draw()

    def next_plot(self):
        if self._i < len(self.axes):
            self.axes[self._i].set_visible(False)
            self.axes[self._i+1].set_visible(True)
            self._i += 1

    def prev_plot(self):
        if self._i > 0:
            self.axes[self._i].set_visible(False)
            self.axes[self._i-1].set_visible(True)
            self._i -= 1

    def show(self):
        self.axes[0].set_visible(True)
        plt.show()

if __name__ == '__main__':
    main()