二维散点图 - mcolors.Normalize 与 mcolors.LogNorm

问题描述 投票:0回答:1

我正在制作一个散点图,但是当我在

mcolors.Normalize
mcolors.LogNorm
之间切换时,两个数字之间的颜色条不一致 - 我认为标准化颜色条刻度与对数归一化刻度(例如,主要间隔为 10^1、10^2、10^3 等)。难道不是这样吗?换句话说 - 颜色条是否给了我相同的答案?预先感谢!

import matplotlib.pyplot as plt  # v3.5.2
import seaborn as sns            # v0.11.2
import numpy as np               # v1.22.1
import matplotlib.colors as mcolors

# generate data
x = np.random.normal(size=100000)
y = x * 3 + np.random.normal(size=100000)

def scatter2d(x, y, norm=mcolors.LogNorm):
    """Create a plt.2dhist with marginal histogram."""
    ax1 = sns.jointplot(x=x, y=y, marginal_kws={'bins' : 50})
    ax1.fig.set_size_inches(5, 4)
    ax1.ax_joint.cla()
    plt.sca(ax1.ax_joint)
    plt.hist2d(x, y, 50, norm=norm(), cmin=1,
               cmap='plasma', range=None )

    # set up scale bar legend
    cbar_ax = ax1.fig.add_axes([1, 0.1, 0.03, 0.7])
    cb = plt.colorbar(cax=cbar_ax)
    cb.set_label(f'Density of points ({norm.__name__})', fontsize=13)
    
    pass

scatter2d(x, y)


scatter2d(x, y, norm=mcolors.Normalize)

matplotlib histogram density-plot normalize
1个回答
0
投票

这是规范正在做什么的可视化。

我稍微简化了您的代码,因为 Seaborn 并未真正用于解决特定问题(并且您似乎正在运行非常旧的版本,尽管主要原理保持不变)。固定种子有助于提高再现性。

在颜色条上设置相同的刻度,显示对数范数如何分隔较低的值。底部的曲线显示了 y 轴上的这种变换作为输入值(在本例中为 2d bin 的高度)的函数。

请注意,这些规范是有点不寻常的函数,因为它们在第一次运行时会在内部更新最小值和最大值(vmin 和 vmax)。

import matplotlib.pyplot as plt  # v3.8.3
import numpy as np  # v1.25.2
import matplotlib.colors as mcolors
import matplotlib.ticker as mticker

# generate data
np.random.seed(123)
x = np.random.normal(size=100000)
y = x * 3 + np.random.normal(size=100000)

fig, axs = plt.subplots(2, 2, figsize=(18, 10))

for norm, ax0, ax1 in zip([mcolors.LogNorm, mcolors.Normalize], axs[0], axs[1]):
    norm_func = norm()
    hist_vals, _, _, hist_img = ax0.hist2d(x, y, 50, norm=norm_func, cmin=1, cmap='plasma')
    ax0.set_title("Color transformation via " + norm.__name__)
    cb = fig.colorbar(hist_img, ax=ax0)
    cb.ax.yaxis.set_major_locator(mticker.MultipleLocator(200))
    cb.ax.yaxis.set_major_formatter(mticker.ScalarFormatter())
    cb.ax.yaxis.set_minor_locator(mticker.NullLocator())
    cb.ax.set_ylabel("Norm: " + norm.__name__)

    nx = np.linspace(1, np.nanmax(hist_vals), 1000)
    ax1.set_title("Transformation via " + norm.__name__)
    ax1.plot(nx, norm_func(nx))
    ax1.scatter(nx[::20], norm_func(nx[::20]), c=nx[::20], norm=norm_func, cmap='plasma', s=20)
    ax1.set_ylabel(norm.__name__)
    ax1.set_xlabel("input value")

plt.tight_layout()
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.