Вам нужно создать подкласс matplotlib.colors.Normalize
и передать экземпляр вашего нового norm
к imshow
/contourf
/все функции зарисовки вы используете.
Основная идея проиллюстрирована в первом варианте здесь: Shifted colorbar matplotlib (. Не зазывала один из моих вопросов слишком много, но я не могу придумать другой пример)
Однако, этот вопрос касается именно установив одно значение данных, соответствующее 0,5 в цветовой палитре. Это не слишком сложно, чтобы расширить идею «кусочно» нормализации, хотя:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
class PiecewiseNormalize(Normalize):
def __init__(self, xvalues, cvalues):
self.xvalues = xvalues
self.cvalues = cvalues
Normalize.__init__(self)
def __call__(self, value, clip=None):
# I'm ignoring masked values and all kinds of edge cases to make a
# simple example...
if self.xvalues is not None:
x, y = self.xvalues, self.cvalues
return np.ma.masked_array(np.interp(value, x, y))
else:
return Normalize.__call__(self, value, clip)
data = np.random.random((10,10))
data = 10 * (data - 0.8)
fig, ax = plt.subplots()
norm = PiecewiseNormalize([-8, -1, 0, 1.5, 2], [0, 0.1, 0.5, 0.7, 1])
im = ax.imshow(data, norm=norm, cmap=plt.cm.seismic, interpolation='none')
fig.colorbar(im)
plt.show()
Обратите внимание, что 0,5 в палитрой (белый) соответствует значению данных 0, а красный и синий области цветовой схемы являются асимметричными (обратите внимание на широкий «розовый» диапазон по сравнению с гораздо более узким переходом на темно-синий).
Это было полезно. Я пытаюсь завершить остаток класса PiecemealNormalize (бит, который вы оставили вне), чтобы у меня был полный класс. К сожалению, я все еще не уверен, почему массив масок в масках используется в исходном классе Normalize? – marcos