通过多次调用一个函数来显示多个Matplotlib图形?

时间:2018-12-16 00:16:05

标签: python python-3.x matplotlib

以下代码无法满足我的要求:它显示一个图形,等待用户关闭窗口,然后显示第二个图形。

def my_plot(arr_x, arr_y):
    import matplotlib.pyplot as plt
    plt.plot(arr_x, arr_y)
    plt.show()

if __name__ == '__main__':
    my_plot((1, 2, 3), (10, 20, 90))
    my_plot((101, 102, 103), (1, 5, 4))

我想同时显示两个数字,所以我可以在视觉上比较它们,例如选择一个,然后关闭另一个。 我的要求是将所有Matplotlib调用存储在一个用户定义的函数中,例如my_plot

我了解到在定义所有图后必须调用show,这不符合上述要求。

实际上,我几乎不再希望Matplotlib能够自己做到这一点,也许唯一的解决方案是像对my_plot的每次调用都使用一个新线程?


编辑:
问题解决了。我下面分享了我感谢Nieznany的回答而编写的一个函数,该函数正是我想要的。当然这是可以改进的,但是对于我的大多数用例来说,它都是可行的,我可以很高兴地忘记Matplotlib。

#!/usr/bin/env python
import matplotlib.pyplot as plt
from os.path import splitext

def plot_XY(arr_x, arr_y, graph_file_name=None, graph_title="", x_label="", y_label=""):
    """Plot a series of (x, y) points.

    If graph_file_name is not provided, the graph is
    plotted in a temporary window; else, the file
    format is deduced from the extension contained
    in graph_file_name.
    """

    def create_figure():
        plt.figure()
        plt.plot(arr_x, arr_y)
        plt.title(graph_title)
        plt.xlabel(x_label)
        plt.ylabel(y_label)

    if graph_file_name is None:
        def my_show():
            create_figure()
            plt.show()
        from multiprocessing import Process
        Process(target=my_show, args=[]).start()
    else:
        extension = splitext(graph_file_name)[1][1:] # Get extension, without dot
        if extension not in ("eps", "pdf", "pgf", "png", "ps", "raw", "rgba", "svg", "svgz"):
            print(f"\"{extension}\" is not a file extension recognized by savefig. Assuming png.")
            extension = "png"
            graph_file_name += "." + extension
        create_figure()
        plt.savefig(graph_file_name, format=extension)
        plt.close()

if __name__ == '__main__':
    # Test: calling the function multiple times:
    x = (1, 2, 3)
    plot_XY(x, (1, 4, 2), graph_title="Example")
    plot_XY(x, (2, 3, 1), graph_file_name="output.abc")
    plot_XY(x, (1, 4, 9), x_label="x", y_label="x^2")

2 个答案:

答案 0 :(得分:3)

您可以使用单个过程来绘制窗口并显示它,而不会阻塞主过程。
解决方案示例:

def my_plot(arr_x, arr_y):
    import matplotlib.pyplot as plt
    from multiprocessing import Process
    def _my_plot(arr_x, arr_y):

        plt.figure()
        plt.plot(arr_x, arr_y)
        plt.show()

    Process(target=_my_plot, args=[arr_x,arr_y]).start()

if __name__ == '__main__':
    my_plot((1, 2, 3), (10, 20, 90))
    my_plot((101, 102, 103), (1, 5, 4))

Resources

答案 1 :(得分:0)

创建所有图形后,致电plt.show()

import matplotlib.pyplot as plt

def my_plot(arr_x, arr_y):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(arr_x, arr_y)
    return fig

if __name__ == '__main__':
    f1 = my_plot((1, 2, 3), (10, 20, 90))
    f2 = my_plot((101, 102, 103), (1, 5, 4))
    plt.show()