如何在 Matplotlib 的子图中独立绘制相同的图形? [复制]

Posted

技术标签:

【中文标题】如何在 Matplotlib 的子图中独立绘制相同的图形? [复制]【英文标题】:How can I plot the same figure standalone and in a subplot in Matplotlib? [duplicate] 【发布时间】:2013-08-12 08:19:25 【问题描述】:

我正在用 Python 编写一个生成许多图形的程序。其中一些是有趣的,无论是独立的,还是与其他图表相比。生成这些图很昂贵(就运行时间而言),我不想多次生成它们。有什么方法可以生成一次情节,并让它成为子情节的一部分?

我基本上是在寻找替代方案:

#generate standalone graphs
pylab.figure()
generate_plot0()
pylab.figure()
generate_plot1()

#generate subplot
pylab.figure()
subplot(121)
generate_plot0()
subplot(122)
generate_plot1()

但没有调用generate_plot0()generate_plot1() 两次。

有什么好的方法吗?

【问题讨论】:

有一个look at this answer,它可以帮助你... axes对象传递给generate_plot*并使用OO接口而不是pyplot接口。 【参考方案1】:

一般来说,matplotlib 艺术家不能超过一个坐标轴,坐标轴不能超过一个图形。 (在某些情况下,您可以打破其中的一些规则,但一般不会起作用。)

因此,简短的回答是否定的。

但是,您可能会考虑以下内容。您可以将有问题的图作为子图,然后绑定单击/按键/任何内容以隐藏所有其他子图并使选定的轴暂时填满整个图形。

举个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

def main():
    subplots = ZoomingSubplots(2, 2)
    colors = ['red', 'green', 'blue', 'cyan']
    for ax, color in zip(subplots.axes.flat, colors):
        data = (np.random.random(200) - 0.5).cumsum()
        ax.plot(data, color=color)
    subplots.fig.suptitle('Click on an axes to make it fill the figure.\n'
                 'Click again to restore it to its original position')
    plt.show()

class ZoomingSubplots(object):
    def __init__(self, *args, **kwargs):
        """All parameters passed on to 'subplots`."""
        self.fig, self.axes = plt.subplots(*args, **kwargs)
        self._zoomed = False
        self.fig.canvas.mpl_connect('button_press_event', self.on_click)

    def zoom(self, selected_ax):
        for ax in self.axes.flat:
            ax.set_visible(False)
        self._original_size = selected_ax.get_position()
        selected_ax.set_position([0.125, 0.1, 0.775, 0.8])
        selected_ax.set_visible(True)
        self._zoomed = True

    def unzoom(self, selected_ax):
        selected_ax.set_position(self._original_size)
        for ax in self.axes.flat:
            ax.set_visible(True)
        self._zoomed = False

    def on_click(self, event):
        if event.inaxes is None:
            return
        if self._zoomed:
            self.unzoom(event.inaxes)
        else:
            self.zoom(event.inaxes)
        self.fig.canvas.draw()

if __name__ == '__main__':
    main()

初始状态

点击子图后

【讨论】:

以上是关于如何在 Matplotlib 的子图中独立绘制相同的图形? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib - 在错误的子图中绘制的变量[重复]

python使用matplotlib可视化subplots绘制子图自定义几行几列子图,如果M行N列,那么最终包含M*N个子图在指定的子图中添加可视化结果

如何在 Python matplotlib 子图中显示图例

如何在 matplotlib pandas 的一张图中组合两个文件的两个条形图

matplotlib如何在子图中正确绘制文本[重复]

Matplotlib 不同大小的子图