Рисование графиков на экране с помощью API Matplotlib - PullRequest
5 голосов
/ 21 ноября 2011

Я понимаю, как отображать графики matplotlib на экране, используя интерфейс pyplot (я думаю!). Я начал рисовать в многопоточной программе, и это стало вызывать ошибки, поэтому я пытаюсь переключиться на объектно-ориентированный интерфейс. Я могу сделать простой график и сохранить в файл, используя

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

fig = Figure()
can = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot((1,2,3))
can.print_figure('test')

Но как мне отобразить этот график на экране? Я видел другой код, который использует can.draw(), но это не имеет никакого эффекта.

Кроме того, пожалуйста, дайте мне знать, если в моем коде есть что-то неоптимальное - я еще не дошел до того, что делают все эти объекты figure, canvas и axes.

1 Ответ

4 голосов
/ 21 ноября 2011

Ваша проблема в том, что вы используете неинтерактивный бэкэнд (Agg вместо TkAgg, GtkAgg, QtAgg и т. Д.).По определению, он не поддерживает отображение на экране.

Однако работа с многопоточным кодом с любой библиотекой графического интерфейса потребует запуска главного цикла графического интерфейса в своем собственном потоке.

В другихДругими словами, переключение на бэкэнд, который может отображаться на экране, потребует более сложной сложности в многопоточном коде.

Существует несколько различных способов сделать это, но любой универсальный метод будет очень неэффективным.(Простое решение состоит в том, чтобы использовать pyplot.ion и затем рисовать холст каждые x миллисекунд в одном потоке, а другие - в другом. Это ужасно неэффективно.)

Можете ли вы датьнемного подробнее о том, что вы делаете?Почему вы используете многопоточность вместо многопоточности?(т.е. вы просто делаете много ввода-вывода?) Какую библиотеку графического интерфейса вы используете?(Если вы не знаете, то это, вероятно, Tk, так как это бэкэнд по умолчанию для matplotlib.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...