python 以0为中心的带有颜色栏的Seaborn图

s1ag04yj  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(217)

我试图通过添加一个色彩Map表(一个连续的调色板)来改变seaborn的默认行为,而不是使用hue参数,它从一个连续变量创建bin。我发现下面的代码可以工作,但是,我想再添加一个选项,将颜色条居中为0,即0得到白色,颜色从零发散到负/正。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

y=np.random.normal(30,30,100)
x=np.random.uniform(0,50,100)

s=sns.scatterplot(
    y=y,
    x=x,
    hue=y,
    size=y,
    palette='RdBu',
    sizes=(50,50)
)
norm=plt.Normalize(y.min(),y.max())
sm=plt.cm.ScalarMappable(cmap="RdBu",norm=norm)
sm.set_array([])
s.get_legend().remove()
s.figure.colorbar(sm)

从图像中可以看出,0的颜色略红,因为数据关于零不对称。如何将色彩Map表以0为中心?如果中心在0,我完全可以使用从-80到80的膨胀色图(因为不对称)。

s3fp2yjn

s3fp2yjn1#

使用cnormcmap关键字参数,这些参数从seaborn传递到matplotlib.axes.Axes.scatter(用于对点着色,而不是palette),并创建一个mcolors.TwoSlopeNorm来创建以零为中心的归一化,您可以生成如下图:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as mcolors

fig, ax = plt.subplots()

y=np.random.normal(30,30,100)
x=np.random.uniform(0,50,100)

vcenter = 0
vmin, vmax = y.min(), y.max()
normalize = mcolors.TwoSlopeNorm(vcenter=vcenter, vmin=vmin, vmax=vmax)
colormap = cm.RdBu

s=sns.scatterplot(
    y=y,
    x=x,
    c=y,
    norm=normalize,
    cmap=colormap,
    ax=ax,
)

scalarmappaple = cm.ScalarMappable(norm=normalize, cmap=colormap)
scalarmappaple.set_array(y)
fig.colorbar(scalarmappaple)

相关问题