2015-05-26 3 views
2

Я пытаюсь найти способ связать определенные значения данных с конкретными цветами в непрерывной цветовой палитре.Связать цвета из непрерывной цветовой схемы с определенными значениями в matplotlib

У меня есть определенный образ со значениями в пределах от [min, max], и я хотел бы следующие значения [min, q1, q2, q3, max], где q'n' относится к квартили, чтобы быть связано с цветами, которые соответствуют [0, 0.25. 0.5, 0.75. 1.0] в палитрой выбора. В результате средняя точка цвета будет соответствовать медианному значению в изображении и т. Д.

Я искал вокруг, но я не смог найти способ сделать это.

ответ

2

Вам нужно создать подкласс 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() 

enter image description here

Обратите внимание, что 0,5 в палитрой (белый) соответствует значению данных 0, а красный и синий области цветовой схемы являются асимметричными (обратите внимание на широкий «розовый» диапазон по сравнению с гораздо более узким переходом на темно-синий).

+0

Это было полезно. Я пытаюсь завершить остаток класса PiecemealNormalize (бит, который вы оставили вне), чтобы у меня был полный класс. К сожалению, я все еще не уверен, почему массив масок в масках используется в исходном классе Normalize? – marcos