Python 非对称颜色条,具有公平发散颜色映射

Python 非对称颜色条,具有公平发散颜色映射,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我试图在散点图中绘制一个不对称的颜色范围。我希望颜色是一个公平的代表性的强度使用一个简单的。我无法更改颜色栏来表示此内容 例如,我想在散点图中绘制范围为[-2,10]的x-y数据,以便颜色栏仅显示中性色为0的范围为-2到10,但-2和2的“强度”相同 我试过使用and,但似乎我需要将两者结合起来,但我想不出来 MCV示例 x=np.arange(0,1,1e-1) xlen=x.shape[0] z=np.随机.随机(xlen**2)*12-2 splt=plt.散射( np.重复(x,xlen

我试图在散点图中绘制一个不对称的颜色范围。我希望颜色是一个公平的代表性的强度使用一个简单的。我无法更改颜色栏来表示此内容

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

我试过使用and,但似乎我需要将两者结合起来,但我想不出来

MCV示例

x=np.arange(0,1,1e-1)
xlen=x.shape[0]
z=np.随机.随机(xlen**2)*12-2
splt=plt.散射(
np.重复(x,xlen),
np.瓷砖(x,xlen),
c=z,cmap=地震,
s=400
)
打印颜色条(splt)
通过使用中点规格化

类中点规格化(颜色.规格化):
定义初始值(self,vmin=None,vmax=None,middpoint=None,clip=False):
self.midpoint=中点
颜色.规格化._初始化__(self,vmin,vmax,clip)
定义调用(self、value、clip=None):
#我忽略了遮罩值和所有类型的边缘情况,以创建一个
#简单的例子。。。
x、 y=[self.vmin,self.middpoint,self.vmax],[0,0.5,1]
返回np.ma.masked_数组(np.interp(值,x,y))
x=np.arange(0,1,1e-1)
xlen=x.shape[0]
z=np.随机.随机(xlen**2)*12-2
标准=中点规格化(中点=0)
splt=plt.散射(
np.重复(x,xlen),
np.瓷砖(x,xlen),
c=z,cmap=地震波,s=400,
范数=范数
)
打印颜色条(splt)
我可以将颜色条的中心设置为0,但强度不公平。i、 e.-2处的强度比+2处暗得多

我在截取颜色贴图时遇到的问题是,我不知道截取它的合适位置

下面是我想在颜色栏中进行更改的示例:

如果我没记错的话,当前的问题是,以中点为中心的贴图正在将颜色从-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 ] )
完整的代码可能如下所示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

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

class MidpointNormalize(mcolors.Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        mcolors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        v_ext = np.max( [ np.abs(self.vmin), np.abs(self.vmax) ] )
        x, y = [-v_ext, self.midpoint, v_ext], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))

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 )
plt.show()

如果我没记错的话,当前的问题是,以中点为中心的贴图正在将颜色从-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 ] )
完整的代码可能如下所示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

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

class MidpointNormalize(mcolors.Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        mcolors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        v_ext = np.max( [ np.abs(self.vmin), np.abs(self.vmax) ] )
        x, y = [-v_ext, self.midpoint, v_ext], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))

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 )
plt.show()

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

类中点规格化(mpl.colors.Normalize):
“”“发件人:https://matplotlib.org/users/colormapnorms.html"""
定义初始值(self,vmin=None,vmax=None,middpoint=None,clip=False):
self.midpoint=中点
mpl.colors.Normalize._______(self、vmin、vmax、clip)
定义调用(self、value、clip=None):
#我忽略了遮罩值和所有类型的边缘情况,以创建一个
#简单的例子。。。
结果,is_scalar=self.process_值(value)
自动缩放\u无(结果)
vlargest=max(abs(self.vmax-self.middpoint)、abs(self.vmin-self.middpoint))
x、 y=[self.middpoint-vlargest,self.middpoint,self.middpoint+vlargest],[0,0.5,1]
返回np.ma.masked_数组(np.interp(值,x,y))

根据@Asmus的回答,我创建了一个
中点规范化air
类,它根据数据进行缩放

类中点规格化(mpl.colors.Normalize):
“”“发件人:https://matplotlib.org/users/colormapnorms.html"""
定义初始值(self,vmin=None,vmax=None,middpoint=None,clip=False):
self.midpoint=中点
mpl.colors.Normalize._______(self、vmin、vmax、clip)
定义调用(self、value、clip=None):
#我忽略了遮罩值和所有类型的边缘情况,以创建一个
#简单的例子。。。
结果,is_scalar=self.process_值(value)
自动缩放\u无(结果)
vlargest=max(abs(self.vmax-self.middpoint)、abs(self.vmin-self.middpoint))
x、 y=[self.middpoint-vlargest,self.middpoint,self.middpoint+vlargest],[0,0.5,1]
返回np.ma.masked_数组(np.interp(值,x,y))

啊!太好了,这是我错过的一点理解。我创建了一个对
Normalize
r的修改,它根据我将在另一个答案中发布的数据进行缩放。啊!太好了,这是我错过的一点理解。我创建了一个对
Normalize
r的修改,它根据我将在另一个答案中发布的数据进行缩放。我打开了它。我打开了它。