我试图找到一种将某些数据值与连续颜色图中的特定颜色相关联的方法。
我有一个特定的图像,其值范围为[min, max]
,我希望以下值[min, q1, q2, q3, max]
(指四分位数)与所选颜色图q'n'
中对应的颜色相关联。[0, 0.25. 0.5, 0.75. 1.0]
结果,颜色放大器的中点将对应于图像中的中值,依此类推......
我一直在环顾四周,但我无法找到一种方法来做到这一点。
我试图找到一种将某些数据值与连续颜色图中的特定颜色相关联的方法。
我有一个特定的图像,其值范围为[min, max]
,我希望以下值[min, q1, q2, q3, max]
(指四分位数)与所选颜色图q'n'
中对应的颜色相关联。[0, 0.25. 0.5, 0.75. 1.0]
结果,颜色放大器的中点将对应于图像中的中值,依此类推......
我一直在环顾四周,但我无法找到一种方法来做到这一点。
您需要子类化并传入您的 new to //无论您使用什么绘图功能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,并且颜色图中的红色和蓝色区域是不对称的(注意宽泛的“粉红色”范围与窄得多的深蓝色过渡)。