Подтвердить что ты не робот

Как получить экземпляр colorbar из рисунка в matplotlib

все. Я хочу обновить цветную рамку фигуры при изменении изображений. Так что-то вроде:

img = misc.lena()
fig = plt.figure()
ax = plt.imshow(im)
plt.colorbar(ax)
newimg = img+10*np.randn(512,512)

def update_colorbar(fig,ax,newimg):
    cbar = fig.axes[1]
    ax.set_data(newimg)
    cbar.update_normal(ax)
    plt.draw()

но кажется, что возвращенные результаты из fig.axes() не имеют экземпляра colorbar, как я ожидал. Возможно, я могу просто передать экземпляр colorbar в качестве аргумента функции обновления, но я думал, что просто один параметр fig может быть достаточно хорошим. Может ли кто-нибудь объяснить немного о том, как извлечь цветную цифру из рисунка? Или почему 'fig.axes()' не возвращает экземпляр AxesImage или Colobar, а только оси или AxesSubplot? Я думаю, мне просто нужно больше понимать вещи Axes/Figure.Спасибо!

4b9b3361

Ответ 1

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

figure - это окно, в котором находится сюжет. Это контейнер верхнего уровня.

Каждая фигура обычно имеет один или несколько axes. Это графики/подзаголовки.

Колодки также находятся внутри фигуры. Добавление цветовой панели создает новые оси (если не указано иное) для отображаемой цветной панели. (Обычно ее нельзя отображать в тех же осях, что и изображение, потому что цветная панель должна иметь свои собственные пределы x и y, и др.)

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

fig.axes[1] не является экземпляром colorbar. Это оси, на которых нанесена цветная панель. (Кроме того, fig.axes[1] - это только вторая ось на рисунке. Это, как правило, оси, в которых используется цветная панель для фигуры с одним подзаголовком и одним цветным баром, t обычно имеет место.)

Если вы хотите обновить цветную панель, вам нужно удержать экземпляр colorbar, который возвращает colorbar.

Вот пример того, как вы обычно подходите к вещам:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random((10,10)) # Generate some random data to plot

fig, ax = plt.subplots() # Create a figure with a single axes.
im = ax.imshow(data)     # Display the image data
cbar = fig.colorbar(im)  # Add a colorbar to the figure based on the image

Если вы собираетесь использовать update_normal для обновления цветной панели, она ожидает ScalarMappable (например, изображение, созданное imshow, коллекция, созданная scatter, ContourSet, которая contour создает и т.д.), которые должны быть переданы. (Есть и другие способы сделать это. Часто вы просто хотите обновить лимиты, а не все это.) В случае с кодом выше вы должны позвонить cbar.update_normal(im).

Однако вы не создали новый AxesImage, вы только что изменили его данные. Поэтому вы, вероятно, просто хотите сделать:

cbar.set_clim(newimg.min(), newimg.max())

Ответ 2

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

В этом случае можно получить цветовую шкалу из графика с помощью:

# Create an example image and colourbar
img = np.arange(20).reshape(5,4)
plt.imshow(img)
plt.colorbar()

# Get the current axis 
ax = plt.gca()        

# Get the images on an axis
im = ax.images        

# Assume colorbar was plotted last one plotted last
cb = im[-1].colorbar   

# Do any actions on the colorbar object (e.g. remove it)
cb.remove()

Теперь вы можете работать с cb, как если бы он был сохранен с помощью команд, описанных в API-интерфейсе цветовой панели. Например, вы можете изменить xlim или вызвать обновление, как описано в других комментариях. Вы можете удалить его с помощью cb.remove() и воссоздать его с помощью plt.colorbar().

plt.draw() или show должны вызываться после обновления графика.

Поскольку изображение сопоставляется с цветовой шкалой и может быть получено с помощью cb.mappable.