Matplotlib: есть ли способ, чтобы мы могли видеть результат графика и работать с ним, пока процедуры после `.show()` обрабатываются Python?

Есть ли способ, чтобы мы могли видеть и работать с результатом графика (фигура и оси), пока процедуры после fig.show() обрабатываются Python?

Например, при выполнении приведенного ниже кода Python показывает окно рисунка, но не график (он показывает только белый фон, запаздывая) во время обработки цикла for. Только после завершения всего кода я могу увидеть сюжет и интерактивно работать с ним.

import matplotlib.pyplot as plt


fig, ax = plt.subplots()

ax.plot([1,2,3]); fig.show()

#I want the plot to be visible and explorable,
# while the for loop below is in process (or any other kind of routine)
for i in range(10000):
    print(i)

Скриншот результата (вы видите, что график отстает, только пустой белый):

Matplotlib: есть ли способ, чтобы мы могли видеть результат графика и работать с ним, пока процедуры после `.show()` обрабатываются Python?

plt.pause(0.001) может показать график, пока продолжаются расчеты. Сюжет не будет интерактивным (например, без масштабирования). Обратите внимание, что поведение зависит от среды, в которой вы используете Python.
JohanC 18.03.2022 10:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать комбинацию отдельного процесса Python (через многопроцессорность) и блокирующего поведения plt.show() для достижения желаемого результата:

import matplotlib.pyplot as plt
import time
from multiprocessing import Process

def show_plot(data):
    fig, ax = plt.subplots()
    ax.plot(data)
    plt.show()

def do_calculation():
    for i in range(100):
        print(i)
        time.sleep(0.1)

if __name__ == '__main__':
    p = Process(target=show_plot, args=([1,2,3],))
    p.start() # start parallel plotting process
    do_calculation()
    p.join() # the process will terminate once the plot has been closed

sleep и p.join на самом деле не нужны, я пробовал.

Arief 18.03.2022 15:13

Другие вопросы по теме