Использование виджета-слайдера matplotlib для изменения клима в изображении - PullRequest
6 голосов
/ 10 апреля 2011

У меня практически нет опыта работы с python, но я пытаюсь создать простой скрипт, который загружает изображение и использует виджет-слайдер для настройки минимума и максимума цветовой шкалы и соответственно перерисовывает данные изображения.

Я пытаюсь следовать этому примеру: http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html. Я пытался просто изменить команду plot на imshow и использовать значения ползунка, чтобы установить область моего изображения.Однако я получаю следующее сообщение об ошибке из вызова 'im1, = ax.imshow' (в строке 12 в коде ниже):

Объект 'AxesImage' не повторяется

Я неЯ не понимаю, что делает этот вызов, но, видимо, его нельзя использовать с imshow ().Если я удаляю запятую в этом вызове, я не получаю ошибок, но изображение не обновляется при смене ползунков.У кого-нибудь есть альтернативное решение или объяснение, почему это не работает?Буду признателен за любую помощь, спасибо.

Мой код выглядит следующим образом:

from pylab import *
from matplotlib.widgets import Slider, Button, RadioButtons
import matplotlib.pyplot as plt
import numpy as np

close('all')

ax = subplot(111)
subplots_adjust(left=0.25, bottom=0.25)
min0 = 0
max0 = 25000

im=np.loadtxt('im.txt')
im1,=ax.imshow(im)
colorbar()

axcolor = 'lightgoldenrodyellow'
axmin = axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axmax  = axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

smin = Slider(axmin, 'Min', 0, 30000, valinit=min0)
smax = Slider(axmax, 'Max', 0, 30000, valinit=max0)

def update(val):
    im1.set_clim=(smin.val,smax.val)
    draw()
smin.on_changed(update)
smax.on_changed(update)

show()

Ответы [ 2 ]

9 голосов
/ 10 апреля 2011

В основном у вас было много и много проблем с синтаксисом.

Например, вы пытались распаковать одно значение (im1,=ax.imshow(im)), давая вам TypeError, который вы упомянули в своем вопросе (как и должно быть). Вы также устанавливаете функцию в значение, когда хотите ее вызвать: (im1.set_clim=(smin.val,smax.val)).

Также я удалил from pylab import * из вашего примера. Это хорошо для интерактивного использования, но, пожалуйста, пожалуйста, не используйте его для реального кода. Из-за этого очень сложно определить, откуда поступают вызываемые вами функции (и, в частности, пространство имен pylab, по замыслу, огромное . Для интерактивного использования only использовать или быстрые одноразовые сценарии.)

Вот рабочий пример (с использованием случайных данных):

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider, Button, RadioButtons

fig = plt.figure()
ax = fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.25)
min0 = 0
max0 = 25000

im = max0 * np.random.random((10,10))
im1 = ax.imshow(im)
fig.colorbar(im1)

axcolor = 'lightgoldenrodyellow'
axmin = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axmax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

smin = Slider(axmin, 'Min', 0, 30000, valinit=min0)
smax = Slider(axmax, 'Max', 0, 30000, valinit=max0)

def update(val):
    im1.set_clim([smin.val,smax.val])
    fig.canvas.draw()
smin.on_changed(update)
smax.on_changed(update)

plt.show()
1 голос
/ 10 апреля 2011

Согласно документации, imshow возвращает объект `matplotlib.image.AxesImage '.Когда вы вводите эту запятую, Python предполагает, что возвращаемый тип функции будет чем-то итеративным (обычно это кортеж, когда вы будете использовать эту конструкцию, но не обязательно), потому что Python позволяет писать код, подобный этому:

a = my_function() # a = (c, d)
a, b = my_function() # a = c, b = d

но

a, = my_function() # you should get an error

Я не совсем уверен, что Python вставляет im1 без проверки (но из вашего вопроса у меня сложилось впечатление, что написание im1,=... работает, пока im1=... нет), но я подозреваю, что вы по какой-то причине не можете нарисовать изображение.update на самом деле вызывается?Если это так, возможно, попробуйте im1.draw().

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