Показать несколько фигур Matplotlib, вызвав функцию несколько раз? - PullRequest
0 голосов
/ 16 декабря 2018

Следующий код не делает то, что я хочу: он показывает фигуру, ждет, когда пользователь закроет окно, а затем показывает вторую фигуру.

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?


РЕДАКТИРОВАТЬ:
Проблема решена.Настоящим я разделяю функцию, которую я написал благодаря ответу Незнани, который делает именно то, что я хочу.Конечно, это невозможно, но для большинства моих случаев использования это работает, и я могу с радостью забыть о 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 голосов
/ 16 декабря 2018

Вы можете использовать отдельный процесс, чтобы построить окно и показать его без блокировки основного процесса.
Пример решения:

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))

Ресурсы

0 голосов
/ 16 декабря 2018

Позвоните 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...