matplotlib 3D图表面的颜色与数据不匹配

bakd9h0s  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(102)

我想使用plot_surface绘制球体上的强度。问题是,我不可能正常化颜色并正确设置colobar。我在互联网上找到的所有解决方案都不适用于我。
我写的代码使用球体表面到特定向量d的距离作为强度。下面是我的代码:

def FieldTranslation(N = 250, d = [-0.001, 0, 0], R = 1):
    d = np.array(d)
    t = np.linspace(0, np.pi, N)
    p = np.linspace(0, 2*np.pi, N)
    t, p = np.meshgrid(t, p)

    X = R * np.sin(t) * np.cos(p)
    Y = R * np.sin(t) * np.sin(p)
    Z = R * np.cos(t)

    C = np.sqrt((X - d[0])**2 + (Y - d[1])**2 + (Z - d[2])**2)

    CMax = np.maximum(C[..., 0], C[..., 1], C[..., 2])
    C = C / CMax

    if np.sum(d) == 0:
        print('round')
        C = np.round(C, 1)

    fig, ax = plt.subplots(subplot_kw={'projection': '3d'})

    scamap = plt.cm.ScalarMappable(cmap='inferno')
    fcolors = scamap.to_rgba(C)
    minn = -1 # fcolors.min()
    maxx = 1 # fcolors.max()
    s = ax.plot_surface(X, Y, Z, facecolors=fcolors, cmap='inferno', vmin = minn, vmax = maxx)
    fig.colorbar(s)
    plt.show()

这段代码创建了一个像这样的图像:

在这里,坐标轴不适合图的颜色,而且,在表面上只应该有幻灯片变化(当查看C中的数字时)。
如果我设置d = [0,0,0],整个球体变成黑色,但C值都是1。

我已经检查了论坛并从其他人那里复制了代码,但没有任何工作。

tcomlyy6

tcomlyy61#

s绘制的颜色条是从Z组件绘制的。
您应该将您创建的自定义scamap赋予给予fig.colorbar

X, Y, Z, C = field_translation()

fig = plt.figure(figsize=(12, 6))
ax_hist = fig.add_subplot(1, 2, 1)
ax_surf = fig.add_subplot(1, 2, 2, projection="3d")

ax_hist.hist(C.flat, bins=100)

# vmin, vmax = 0.6, 1.0
vmin, vmax = C.min(), C.max()

norm = mpl.colors.Normalize(vmin, vmax)
scamap = plt.cm.ScalarMappable(cmap="inferno", norm=norm)
fcolors = scamap.to_rgba(C)

ax_surf.plot_surface(X, Y, Z, facecolors=fcolors, cmap="inferno")
fig.colorbar(scamap, ax=ax_surf)

fig.tight_layout()
plt.show()

相关问题