Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 配置matplotlib颜色栏以匹配三维曲面值_Python_Matplotlib_Colorbar - Fatal编程技术网

Python 配置matplotlib颜色栏以匹配三维曲面值

Python 配置matplotlib颜色栏以匹配三维曲面值,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我试图将快速傅里叶变换的结果显示为2D矩阵(形状:2048x1024)的3D曲面,侧面有一个颜色条,该颜色条应与我的值匹配。 显示器工作正常,但颜色栏的“颜色”和图形的颜色不匹配。我应该如何配置颜色栏和图形以匹配 我试图根据FFT结果设置vmin和vmax值,但是图形的颜色完全错误。 我也尝试过函数clim(vmin,vmax)或方法。set_clim(vmin,vmax),但问题仍然是一样的 这是我的密码: rp是一个2048x1024矩阵 将numpy导入为np 从派拉布进口* 从mpl_t

我试图将快速傅里叶变换的结果显示为2D矩阵(形状:2048x1024)的3D曲面,侧面有一个颜色条,该颜色条应与我的值匹配。 显示器工作正常,但颜色栏的“颜色”和图形的颜色不匹配。我应该如何配置颜色栏和图形以匹配

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

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

将numpy导入为np
从派拉布进口*
从mpl_toolkits.mplot3d导入Axes3D
图(2,figsize=(9.6,7.2))
ax1=gca(投影=3d')
X=np.arange(0,1024)
Y=np.arange(02048)
十、 Y=np.meshgrid(X,Y)
Z=20*np.log10(绝对值)
#绘制曲面。
surf1=ax1.plot_曲面(X,Y,Z,cmap='jet',抗锯齿=False,vmin=np.min(Z),vmax=np.max(Z))
#添加将值映射到颜色的颜色栏。
色条(surf1)
标题(“3D频率剖面”)
show()
以下是我在不为颜色栏配置
vmin
vmax
值的情况下得到的结果。“最大颜色”(红色)与“最大长矛”不匹配,“颜色栏最大值”和“最小值”与图表中的“我的最小值”和“最大值”不匹配(注意:最小值=-24,最大值=145)

下面是我设置
vmin
vmax
时得到的结果。所有图形的阴影大致相同,而我应该有两个红色的长矛


有什么想法吗?

我想你只需要在Matplotlib中使用一个可映射的
东西,比如:

import matplotlib.pyplot as plt

mappable = plt.cm.ScalarMappable()
mappable.set_array(Z)
然后使用
cmap
norm
从该映射调用
plot\u surface
,例如:

ax.plot_surface(X, Y, Z, cmap=mappable.cmap, norm=mappable.norm, linewidth=0, antialiased=False)
然后,您可以将此可映射项用于
颜色栏

plt.colorbar(mappable)
这应该使用默认颜色贴图,但可以手动指定为:

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绘图让我更容易看到发生了什么

我终于找到了问题的原因。问题是
colormap
对于图形的步幅(如果我理解得很好的话,这是它的分辨率)。更准确地说,它使用
cstride*rstride
的曲面来平均曲面上信号的能量,并使贴图的颜色对应于该平均值。我的长矛真的很薄,这就是为什么它们的树荫不好的原因。 我必须用较小的值指定参数
cstride
rstride
。因为它们的默认值是10

所以现在我有:

图(1,figsize=(12,6))
X=np.arange(0,1024)
Y=np.arange(02048)
十、 Y=np.meshgrid(X,Y)
Z=20*np.log10(绝对值)
mappable=cm.ScalarMappable()
可映射的集合数组(Z)
suptitle(“频率剖面的3D图和2D图”)
ax1=子地块(121,投影=3d')
ax1.绘制曲面(X,Y,Z,cmap=mappable.cmap,norm=mappable.norm,线宽=0,
抗锯齿=假,cstride=10,rstride=1)
ax2=子批次(122)
ax2.imshow(Z,cmap=mappable.cmap,norm=mappable.norm,
范围=(np.min(X)、np.max(X)、np.min(Y)、np.max(Y)),
插值=无)
颜色栏(可映射)
show()
注意:我可以保留cstride的默认值,因为我只需要更改
步幅。但这可能对其他人有所帮助

这是我得到的结果,它对应于我想要的。


NB2:小心减少步幅,输入数据越大,脚本速度越慢。

为什么不使用?3d绘图通常很难解释。此外,@SamMason imshow显示的2D图像可能足够了,但我的要求是使用3D绘图来显示信号的功率(Z轴)。我尝试过使用不同的
cmap
值,例如
bwr
PuOr
,但问题仍然存在。有没有关于彩色地图而不是喷气式飞机的建议?我完全同意你的意见,我只能使用
imshow
绘图。而且我没有任何问题。我真正的问题是关于颜色栏的配置,因为最大颜色是黄色,对吗?所以我在3D图上的“两个”长矛应该是黄色的,但不是。如果我没有指定
vmin
vmax
值,那么最大值似乎位于边缘,这是错误的。因此,要么我的配置被破坏,要么我这里的matplotlib有一个bug。顺便谢谢你的帮助!