2017-02-06 6 views
1

Я прочитал много вопросов переполнения стека по этим темам, но после большого эксперимента я не могу понять свою проблему.PyCharm matplotlib интерактивные фигуры без блокировки исполнения

Я использую PyCharm 2016.3.2 для Windows 7 (но у меня такая же проблема на OSX), мой интерпретатор - это последняя версия Anaconda с Python 3.6 и matplotlib 2.0.0.

Вот что я пытаюсь достичь (и, возможно, я не использую правильный подход, потому что я пытаюсь воссоздать поведение я использовать в Octave/Matlab):

  1. земля одна фигура в всплывающие окна
  2. Pause мой сценарий (вход («нажмите клавишу для продолжения»))
  3. Обратите внимание на цифру, а затем нажмите клавишу, чтобы продолжить сценарий
  4. Compute что-то другое
  5. Plot новые данные по тем же цифра
  6. Pause мой сценарий (вход («нажмите клавишу для продолжения»))
  7. Обратите внимание на цифру, а затем нажмите клавишу, чтобы продолжить сценарий

Вот мой тестовый код:

import matplotlib 
matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 

print('Plotting Data...') 

plt.ion() 
plt.figure(1) 
plt.plot([1, 5, 10, 20], [1, 5, 10, 20]) 
plt.xlabel('x label') 
plt.ylabel('y label') 
plt.show() 
plt.pause(0.0001) 

input('Plotting Data done..., Press a key to continue') 

plt.figure(1) 
plt.plot([1, 5, 10, 20], [2, 10, 20, 40]) 
plt.show() 
plt.pause(0.0001) 

input('Program paused. Press enter to end.\n') 

Это самая близкая версия того, что я хочу, графики правильные, но не реагирующие, когда я курю над ними (plt.pause (0.0001) генерирует предупреждение, но работает код).

Я много играл с параметрами (plt.ion(); plt.pause(); plt.show (block = False)). В большинстве случаев это приводило к пустым окнам окна или мне нужно было закрыть окно, чтобы продолжить выполнение.

Благодарим за помощь!

+0

Вы не можете работать в двух разных циклах событий одновременно. Почему вы не можете просто построить все обычным способом и использовать закрытие окна в качестве триггера для продолжения программы? – ImportanceOfBeingErnest

+0

Обычный способ? Если я использую закрытие окон в качестве триггера для продолжения, даже когда я помню цифру (1), я не могу найти способ построить второй элемент поверх 1-го (без повтора plt.plot с первый набор данных). Но иногда я просто хочу сделать несколько сюжетов и дать им все открыть до конца исполнения. Спасибо! – Capy

+0

@ImportanceOfBeingErnest Этот пост просматривает ту же проблему [аналогичный вопрос] (http://stackoverflow.com/questions/28269157/plotting-in-a-non-blocking-way-with-matplotlib), и он в основном использует тот же обходной путь с паузой (цифры правильно построены, но не отвечают) – Capy

ответ

0

После того, как plt.show() называется основной петлей, принимается Окном. Поэтому, как только вызывается input, главный цикл становится неактуальным.

Вы можете попробовать остановиться в цикле GUI и обрабатывать нажатие клавиши там.

import matplotlib 
matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 

print('Plotting Data...') 

fig, ax = plt.subplots() 
ax.set_xlabel('x label') 
ax.set_ylabel('y label') 
i=[0] 

def f1(): 
    ax.plot([1, 5, 10, 20], [1, 5, 10, 20]) 

def f2(): 
    ax.plot([1, 5, 10, 20], [2, 10, 20, 40]) 

def f3(): 
    ax.plot([1, 5, 10, 20], [5, 9, 17, 28]) 


def update(event=None): 
    if i[0]==0: f1() 
    if i[0]==1: f2() 
    if i[0]==2: f3() 
    fig.canvas.draw_idle() 
    i[0]+=1 
    print('Step {} done..., Press a key to continue'.format(i[0])) 

fig.canvas.mpl_connect("key_press_event", update)  

update() 
plt.show() 
+0

Спасибо за этот ответ. Я знакомлюсь с pythot OO synthax и вам придется немного понять darw_idle.
Другим способом сделать это будет вызов снова закрытого сюжета (либо для отображения его снова, как изначально, либо для добавления данных для отображения новых данных в дополнение к первоначальному), но я пока не понимаю, как это сделать – Capy

 Смежные вопросы

  • Нет связанных вопросов^_^