【问题标题】:Matplotlib scatterplot with standardized colormap across subplotsMatplotlib 散点图,带有跨子图的标准化颜色图
【发布时间】:2021-04-24 01:54:49
【问题描述】:

我有两组数据要比较。每组数据都有 x 和 y 值以及每个 x,y 点的一些 z 值。两个数据集之间的 z 值分布可能会相互重叠,但通常会有不重叠的部分。在这种情况下 [1,4] 和 [2,6]。我希望配色方案考虑到这一点,以便在比较两组时可以看到这些差异。我最终也想使用添加到该图中的颜色条。 一些示例代码:

# Fake Values
vals1 = np.array([[1,1,1],[2,2,4]])
vals2 = np.array([[1,1,2],[2,2,6]])

fig, ax = plt.subplots(1,2, constrained_layout=True)
g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], cmap='RdBu')
g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], cmap='RdBu')
fig.colorbar(g2)

这给了我以下信息:

如您所见,子图之间的 z (c?) 值未标准化。 任何帮助将不胜感激。

【问题讨论】:

    标签: python matplotlib heatmap colorbar scatter


    【解决方案1】:

    您可以将两个图的vmin/vmax 设置为数据的全局最小值/最大值。

    单独设置vmin/vmax 参数:

    vmin = np.vstack([vals1,vals2]).min()
    vmax = np.vstack([vals1,vals2]).max()
    
    fig, ax = plt.subplots(1,2, constrained_layout=True)
    g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], vmin=vmin, vmax=vmax, cmap='RdBu')
    g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], vmin=vmin, vmax=vmax, cmap='RdBu')
    fig.colorbar(g2)
    

    或者创建一个matplotlib.colors.Normalize() 实例并将其用于norm 参数:

    norm = mcolors.Normalize(
        vmin=np.vstack([vals1,vals2]).min(),
        vmax=np.vstack([vals1,vals2]).max(),
    )
    
    fig, ax = plt.subplots(1,2, constrained_layout=True)
    g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], norm=norm, cmap='RdBu')
    g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], norm=norm, cmap='RdBu')
    fig.colorbar(g2)
    

    【讨论】:

    • 你也可以在调用外创建Norm scatter 并将其传递给他们。
    • 嗨@tdy,感谢您的回复!看起来我的原始代码中有错字,您的回复中对此进行了概括。如果将 g2 行中的 c 值更改为:c=vals2[:,2] 将是正确的!
    猜你喜欢
    • 2017-08-25
    • 2016-12-30
    • 1970-01-01
    • 2021-12-28
    • 2011-07-26
    • 2012-02-12
    • 2014-09-10
    • 2017-09-17
    • 2011-08-29
    相关资源
    最近更新 更多