- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将快速傅里叶变换的结果显示为来自 2D 矩阵(形状:2048x1024)的 3D 表面,其侧面应与我的值匹配的颜色条。显示效果很好,但颜色条的“颜色”和图形的颜色不匹配。我应该如何配置颜色条和图表以匹配?
我已尝试根据我的 FFT 结果设置 vmin
和 vmax
值,但图表的颜色完全错误。我也试过函数 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()
这是我在没有为颜色条配置 vmin
和 vmax
值的情况下得到的。最大颜色(红色)与最大梭子鱼不匹配,颜色条最大值和最小值与图表中的最小值和最大值不匹配(注意:最小值=-24 和最大值=145)。
这是我在设置 vmin
和 vmax
时得到的结果。所有的图表都是大致相同的阴影,而我应该有两个红色的派克。
有什么想法吗?
最佳答案
我想你只是想在 Matplotlib 中使用 Mappable
东西,比如:
import matplotlib.pyplot as plt
mappable = plt.cm.ScalarMappable()
mappable.set_array(Z)
然后从那个可映射的cmap
和norm
调用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()
给我:
我发现第二个非 3D 图让我更容易看到发生了什么
关于python - 配置 matplotlib colorbar 以匹配 3D 表面值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112328/
我是一名优秀的程序员,十分优秀!