Интерактивный matplotlib через Eclipse PyDev

Это продолжение потока интерактивного matplolib через eclipse, которому около 2 лет, я интересно, есть ли за это время какой-нибудь прогресс.

Я запускаю консоль IPython в окне консоли в Eclipse PyDev, но я не могу получить те же интерактивные функции построения графиков с помощью matplotlib, как если бы я запускал IPython в командной строке (Windows) вне Eclipse PyDev. Вот как они сравниваются:

A) Запуск IPython в оболочке вне Eclipse PyDev

  1. Запустите IPython в командной строке Windows с помощью «ipython --pylab»
  2. В консоли IPython введите «plot ([1,2,3])». Это откроет окно графика рисунка, и консоль IPython будет готова для дальнейших команд (без необходимости закрывать окно графика рисунка).
  3. Например, я могу ввести «xlabel ('years')», и это обновит мое окно графика рисунка.

Б) Запуск IPython в интерактивной консоли в Eclipse PyDev. Введите в интерактивную консоль IPython в Eclipse PyDev следующее:

  1. "из импорта pylab *"
  2. "plot ([1,2,3])" -> Окно графика графика не отображается.
  3. Мне нужно ввести "show ()", чтобы открыть окно построения рисунка. Но теперь проблема в том, что пока я держу окно графика фигуры открытым, консоль IPython не принимает никаких новых команд.
  4. Поэтому я закрываю окно графика рисунка, ввожу «xlabel ('years')», а затем снова «show ()». Это повторно откроет окно графика рисунка с «годами» в качестве метки оси, но сам график пуст и больше не отображает данные [1,2,3].

С таким поведением A) явно превосходит B), но я хотел бы продолжать работать в Eclipse PyDev, потому что мне нравится всегда иметь список переменных на моем экране (без необходимости запускать команду для отображения всех переменных, например, при запуске формы IPython оболочка Windows). Использование Wicked Shell, как предлагается в другом потоке, не работает (IPython не работает должным образом в Wicked Shell).

Как мне настроить IPython в Eclipse PyDev, чтобы он демонстрировал такое же интерактивное поведение, как если бы я запускал его в командной строке Windows?


person Michael    schedule 18.11.2012    source источник
comment
Попробуйте вызвать ion() - это функция из matplotlib, которая означает «интерактивный режим включен».   -  person Thomas K    schedule 19.11.2012
comment
Спасибо, Томас. Я боюсь, что ion () не решит эту проблему. По крайней мере, на моем ПК с Windows ion () показывает цифры, которые не отвечают, и их необходимо прекратить с помощью диспетчера задач.   -  person Michael    schedule 21.11.2012


Ответы (4)


Вы можете решить эту проблему, выбрав графический интерфейс для интерактивной консоли в PyDev Preference.

Eclipse -> Window -> Preferences -> Pydev -> Interactive Console -> Включить интеграцию цикла событий GUI.

В моем случае я выбрал PyQt (qt / qt4)

person Andy    schedule 13.05.2014

Приносим извинения за потенциально неполный ответ, но, надеюсь, я смогу пролить свет на проблему.

Я считаю, что тот, который описывает ОП, является нормальным поведением. Фактически, начиная с командной строки ipython, импорт pylab и выдача команды plot производит точно описанное поведение блокировки, поэтому это не связано с pydev или eclipse. Дело в том, что шоу в matplotlib блокируется в интерактивном режиме; когда вы используете matplotlib в сеансе ipython, запущенном как «ipython --pylab», вы пользуетесь некоторыми «хитростями», которые разработчики ipython сделали для вас вокруг matplotlib, позволяя иметь как интерактивный режим, так и неблокирующие вызовы. Однако для применения этих «хитростей» импорта pylab недостаточно. PyDev, похоже, не позволяет использовать флаги для вызова интерпретатора, поэтому нельзя напрямую вызывать «ipython --pylab».

К счастью, в ipython есть специальная команда «pylab», которая применяет хаки и импортирует pylab, даже если интерпретатор не был запущен с флагом pylab. Таким образом, вы можете просто попробовать ввести «pylab» внутри консоли (на самом деле, вы даже можете настроить консоль pydev так, чтобы это выполнялось автоматически), и вы должны получить желаемое поведение. Однако я должен сообщить, что, хотя у меня это нормально работает из сеанса ipython, запущенного из командной строки, что-то идет не так, когда я пытаюсь сделать то же самое из Eclipse. Команда не блокируется, я получаю значок python, но окно matplotlib не отображается. Для справки, у меня Mac работает под управлением Snow Leopard. Я не могу сказать, возникает ли такая же проблема и в Windows, которую, похоже, использует OP.

person Spock    schedule 25.01.2013
comment
Обновление: в Eclipse 4.4 в Ubuntu 14.04 64-битный ввод pylab делает полностью интерактивные и неблокирующие графики, как и ожидалось. - person Adam Ryczkowski; 12.08.2014

Я добиваюсь аналогичного поведения в Eclipse PyDev, выполняя функцию построения графика в другом потоке:

import threading
from pylab import *
import matplotlib.animation as animation
import time

x = array(range(0,1000))/100
y = sin(x)

def updateData(self):
    ax.set_data(x,y)

def MyThread():
    global ax
    fig, axarr = subplots(1)
    ax, = axarr.plot(x,y)
    simulation = animation.FuncAnimation(fig, updateData)
    show()


t = threading.Thread(target=MyThread)
t.start()

# console stay active, user can interactively control figure
time.sleep(1)
y = sin(2*x)
time.sleep(2)
ax.get_axes().grid()
ax.get_axes().set_xlabel("time")

Протестировано с помощью инструментария Eclipse 4.3, PyDev 2.7.1, Python 3.2, IPython 0.13.

person Liteon    schedule 29.03.2013
comment
К сожалению, у меня это не работает. Я получаю ValueError: сигнал работает только в основном потоке - person Zah; 29.03.2013
comment
По какой-то причине строка import matplotlib.animation as animation убивает мой интерпретатор IPython3 под Ubuntu 14.04 64bit Eclipse - person Adam Ryczkowski; 12.08.2014

Просто используйте %matplotlib magic-command, чтобы активировать интерактивное построение (именно то, что вы описали).

Команда pylab импортирует numpy.* и pylab.*, серьезно загрязняя ваше глобальное пространство имен.

person ankostis    schedule 16.02.2014