Как я могу нарисовать нормированный log-график imshow с цветовой панелью, представляющей необработанные данные в matplotlib

Я использую matplotlib для построения изображений с нормированным логом, но мне хотелось бы, чтобы исходные данные необработанного изображения были представлены в цветовой панели, а не в интервале [0-1]. Я чувствую, что есть более матплотблийный способ сделать это, используя какой-то объект нормализации и не преобразовывая данные заранее... во всяком случае, в исходном изображении могут быть отрицательные значения.

import matplotlib.pyplot as plt
import numpy as np

def log_transform(im):
    '''returns log(image) scaled to the interval [0,1]'''
    try:
        (min, max) = (im[im > 0].min(), im.max())
        if (max > min) and (max > 0):
            return (np.log(im.clip(min, max)) - np.log(min)) / (np.log(max) - np.log(min))
    except:
        pass
    return im

a = np.ones((100,100))
for i in range(100): a[i] = i
f = plt.figure()
ax = f.add_subplot(111)
res = ax.imshow(log_transform(a))
# the colorbar drawn shows [0-1], but I want to see [0-99]
cb = f.colorbar(res)

Я пробовал использовать cb.set_array, но это ничего не делало, и cb.set_clim, но это полностью изменяет цвета.

Ответы

Ответ 1

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

from pylab import figure, cm
from matplotlib.colors import LogNorm
# C = some matrix
f = figure(figsize=(6.2,5.6))
ax = f.add_axes([0.17, 0.02, 0.72, 0.79])
axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79])
im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1))
t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0]
f.colorbar(im, cax=axcolor, ticks=t, format='$%.2f$')
f.show()

Ответ 2

Если вы хотите, чтобы изображение было нормализовано для журнала (для улучшения деталей), но не для данных (для сохранения физических значений), вам необходимо применить преобразование в самой цветовой карте. Вы можете сделать это с помощью функции cmap_map(), указанной в поваренной книге: http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations