gpt4 book ai didi

python - 配置 matplotlib colorbar 以匹配 3D 表面值

转载 作者:行者123 更新时间:2023-12-04 17:37:32 25 4
gpt4 key购买 nike

我正在尝试将快速傅里叶变换的结果显示为来自 2D 矩阵(形状:2048x1024)的 3D 表面,其侧面应与我的值匹配的颜色条。显示效果很好,但颜色条的“颜色”和图形的颜色不匹配。我应该如何配置颜色条和图表以匹配?

我已尝试根据我的 FFT 结果设置 vminvmax 值,但图表的颜色完全错误。我也试过函数 clim(vmin, vmax) 或方法 .set_clim(vmin, vmax) 但问题还是一样。

这是我的代码:rp 是一个 2048x1024 矩阵。

import numpy as np
from pylab import *
from mpl_toolkits.mplot3d import Axes3D


figure(2, figsize=(9.6, 7.2))
ax1 = gca(projection='3d')
X = np.arange(0, 1024)
Y = np.arange(0, 2048)
X, Y = np.meshgrid(X, Y)
Z = 20 * np.log10(abs(rp))
# Plot the surface.
surf1 = ax1.plot_surface(X, Y, Z, cmap='jet', antialiased=False, vmin=np.min(Z), vmax=np.max(Z))
# Add a color bar which maps values to colors.
colorbar(surf1)
title('3D frequency profile')

show()

这是我在没有为颜色条配置 vminvmax 值的情况下得到的。最大颜色(红色)与最大梭子鱼不匹配,颜色条最大值和最小值与图表中的最小值和最大值不匹配(注意:最小值=-24 和最大值=145)。

first_figure

这是我在设置 vminvmax 时得到的结果。所有的图表都是大致相同的阴影,而我应该有两个红色的派克。

second_figure

有什么想法吗?

最佳答案

我想你只是想在 Matplotlib 中使用 Mappable 东西,比如:

import matplotlib.pyplot as plt

mappable = plt.cm.ScalarMappable()
mappable.set_array(Z)

然后从那个可映射的cmapnorm调用plot_surface,例如:

ax.plot_surface(X, Y, Z, cmap=mappable.cmap, norm=mappable.norm, linewidth=0, antialiased=False)

然后您可以将此可映射对象用于 colorbar:

plt.colorbar(mappable)

这应该使用默认的 viridis colormap颜色图,但可以手动指定为:

mappable = plt.cm.ScalarMappable(cmap=plt.cm.viridis)

Viridis 是一个很好的“感知均匀”颜色图,请参阅上面的视频了解为什么 Matlab 的 jet 几乎总是一个糟糕的选择,以及为什么它甚至比更现代的默认 parula

这似乎只是将 Z 中的数据重复用于“垂直”高度和颜色,因此我建议使用 imshow,例如:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

X, Y = np.meshgrid(
np.linspace(-2, 2, 128),
np.linspace(-2, 2, 128),
)
Z = np.exp(-(X ** 2 + Y ** 2)) * 3 + 5

mappable = plt.cm.ScalarMappable(cmap=plt.cm.viridis)
mappable.set_array(Z)
mappable.set_clim(5, 8) # optional

fig = plt.figure(figsize=(10,4))

ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(X, Y, Z, cmap=mappable.cmap, norm=mappable.norm, linewidth=0, antialiased=False)

ax2 = fig.add_subplot(122)
ax2.imshow(Z, cmap=mappable.cmap, norm=mappable.norm, extent=(
np.min(X), np.max(X), np.min(Y), np.max(Y)), interpolation='none')

plt.colorbar(mappable)
plt.tight_layout()

给我:

plot_surface vs imshow

我发现第二个非 3D 图让我更容易看到发生了什么

关于python - 配置 matplotlib colorbar 以匹配 3D 表面值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com