非对称色条,具有公平的发散颜色贴图

2024-10-03 15:30:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在散点图中画出一个不对称的颜色范围。我想用diverging color map来表示强度。我很难改变颜色栏来代表这个。在

例如,我想在散点图中绘制范围为[-2,10]的x-y数据,这样颜色条只显示-2到10的范围,中性色为0,但是-2和2的“强度”是相同的。在

我试过使用ColorMap Normalizationtruncating the color map,但似乎我需要这两个的某种组合,我搞不懂。在

MCV示例

x = np.arange( 0, 1, 1e-1 )
xlen = x.shape[ 0 ]
z = np.random.random( xlen**2 )*12 - 2


splt = plt.scatter( 
    np.repeat( x, xlen ), 
    np.tile( x, xlen ), 
    c = z, cmap = 'seismic',
    s = 400
)

plt.colorbar( splt )

通过使用中点规格化

^{pr2}$
x = np.arange( 0, 1, 1e-1 )
xlen = x.shape[ 0 ]
z = np.random.random( xlen**2 )*12 - 2

norm = MidpointNormalize( midpoint = 0 )

splt = plt.scatter( 
    np.repeat( x, xlen ), 
    np.tile( x, xlen ), 
    c = z, cmap = 'seismic', s = 400,
    norm = norm
)

plt.colorbar( splt )

我可以把色块集中在0,但是强度不公平。i、 在-2处的强度比在+2处暗得多。在

我一直有一个问题,就是我不知道哪里是最合适的地方来截断它。在

下面是我要在颜色栏中进行更改的示例: exaple of colorbar change


Tags: norm示例map颜色nppltrandomcolor
2条回答

根据@Asmus的回答,我创建了一个MidpointNormalizeFair类,它根据数据进行缩放。在

class MidpointNormalizeFair(mpl.colors.Normalize):
    """ From: https://matplotlib.org/users/colormapnorms.html"""
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        mpl.colors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        # I'm ignoring masked values and all kinds of edge cases to make a
        # simple example...

        result, is_scalar = self.process_value(value)
        self.autoscale_None(result)

        vlargest = max( abs( self.vmax - self.midpoint ), abs( self.vmin - self.midpoint ) )
        x, y = [ self.midpoint - vlargest, self.midpoint, self.midpoint + vlargest], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))

如果我没弄错的话,现在的问题是,以中点为中心的地图将颜色从-2均匀地缩放到0(蓝色),同样地(红色)从0缩放到10。在

与其缩放[self.vmin, self.midpoint, self.vmax] = [-2, 0, 10],不如在[-v_ext, self.midpoint, v_ext] = [-10, 0, 10]之间重新缩放,其中:

v_ext = np.max( [ np.abs(self.vmin), np.abs(self.vmax) ] )  ## = np.max( [ 2, 10 ] )

完整的代码可能看起来像:

^{pr2}$

enter image description here

相关问题 更多 >