show () больше не перерисовывает - PullRequest
2 голосов
/ 07 мая 2010

Я работаю в Linux и не знаю, почему использование команд python и matplotlib рисует меня только один раз, когда я хочу график В первый раз, когда я вызываю show (), график прорисовывается без каких-либо проблем, но не во второй раз и не в следующем.

Я закрываю окно с графиком между двумя вызовами. Знаете почему и горячо это исправить?

Спасибо, AFG

from numpy import *
from pylab import *

data = array( [ 1,2,3,4,5] )
plot(data)
[<matplotlib.lines.Line2D object at 0x90c98ac>]
show() # this call shows me a plot

#..now I close the window...

data = array( [ 1,2,3,4,5,6] )
plot(data)
[<matplotlib.lines.Line2D object at 0x92dafec>]
show()  # this one doesn't shows me anything

Ответы [ 4 ]

1 голос
/ 08 мая 2010

Вероятно, у вас есть конфликты между вашей оконной системой редактора / IDE и вашими окнами графиков.

Очень хорошим способом для этого является использование IPython .IPython - это отличная интерактивная среда, в которой решены эти проблемы, плюс у нее много других преимуществ.Сначала запустите IPython с помощью команды (из окна терминала) ipython -pylab, чтобы перевести его в интерактивный режим Pylab.

1 голос
/ 07 мая 2010

в окнах это прекрасно работает:

from pylab import *
plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x03442C10>]
#close window here
plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x035BC570>]

Вы пробовали с:

from matplotlib import interactive
interactive(True)

иногда matplotlib вызывает некоторые головные боли, потому что мы должны помнить, что некоторые параметры установлены в matplotlibrc (например, бэкэнд или интерактивные параметры). Если вы используете matplotlib из разных редакторов (IDLE-tk, pycrust-wxpython) или чередуете интерактив со сценариями, то вы должны учитывать, что конфигурация, которая работает в одном режиме, может вызвать проблемы в другом режиме и должна быть изменена программно или используя специальный файл конфигурации.

Пример, который я привожу, работает напрямую (и без show ()), потому что в matplotlibrc у меня установлен интерактивный параметр True по умолчанию

0 голосов
/ 08 мая 2010

show() предназначен для использования только один раз в программе, в самом конце: это бесконечный цикл, который проверяет события в графических окнах.

Обычный способ сделать то, что вы хотите:

# … plot …
draw()  # Draws for real
raw_input()  # Or anything that waits for user input

# … 2nd plot …
draw()
raw_input()

# Last plot
show()  # or, again, draw(); raw_input()

Вы можете попытаться выяснить, работает ли это для вас.

В качестве альтернативы, вы можете попробовать изменить бэкэнд, так как некоторые бэкэнды работают лучше, чем другие:

import matplotlib
matplotlib.use('TkAgg')  # For other backends, do matplotlib.use('') in a shell
0 голосов
/ 07 мая 2010

Я предполагаю, что вы делаете это в IDLE на Windows, потому что именно там я заметил эту же проблему.

Из того, что я вывел, есть проблема с использованием бэкенда TkAgg, который поставляется с базовым дистрибутивом Python и, по-видимому, используется по умолчанию для matplotlib при использовании matplotlib с IDLE. Это как-то связано с тем, как IDLE использует подпроцессы, потому что, если я запускаю IDLE с опцией -n, которая отключает подпроцессы, у меня нет этой проблемы. Самый простой способ запустить его IDLE с параметром -n в Windows - щелкнуть правой кнопкой мыши по файлу и выбрать «Открыть с IDLE». Если вы сделаете это, вы должны получить оболочку IDLE, которая говорит === Нет подпроцесса ===

чуть выше приглашения. Например, заимствуя код из решения Хоакина, вы можете попробовать этот простой код:

from matplotlib import interactive
interactive(True)
from pylab import *
plot([1,2,3,4])

затем закройте окно и снова введите последнюю строку в консоли. У меня работает в IDLE с параметром -n.

Так что вы можете сделать? Вы всегда можете запустить IDLE в режиме без подпроцессов, но в этом есть опасность. Вы можете использовать другую IDE. Многие люди предлагают IPython, хотя я сам еще не продал его. Вы также можете попробовать другой бэкэнд для matplotlib. Я собираюсь попробовать это через некоторое время, потому что мне было интересно, будет ли это работать.

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