python - matplotlib 对数曲面图的对数颜色图

标签 python numpy matplotlib

我正在使用 python 创建 3D 表面图,我有一个数据数组,我正在尝试将其绘制为 3D 表面,问题是我已经记录了 Z 轴(需要显示数据中的峰值)这意味着默认颜色图不起作用(显示一种连续颜色)。我尝试使用 LogNorm 来标准化颜色图,但这又会产生一种连续的颜色。我不确定是否应该使用记录的值来规范化 map ,但如果我这样做,最大值将为负并产生错误?

fig=plt.figure(figsize=(10,10))
ax=plt.axes(projection='3d')
def log_tick_formatter(val, pos=None):
    return "{:.2e}".format(10**val)
ax.zaxis.set_major_formatter(mticker.FuncFormatter(log_tick_formatter))
    
   
    
X=np.arange(0,2,1)
Y=np.arange(0,3,1)
X,Y=np.meshgrid(X,Y)
Z=[[1.2e-11,1.3e-11,-1.8e-11],[6e-13,1.3e-13,2e-15]]
    
Z_min=np.amin(Z)
Z_max=np.amax(Z)

norm = colors.LogNorm(vmin=1e-15,vmax=(Z_max),clip=False)

ax.plot_surface(X,Y,np.transpose(np.log10(Z)),norm=norm,cmap='rainbow') 

最佳答案

只是对数颜色和对数数据的示例:

#!/usr/bin/env ipython
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
import matplotlib.colors as colors
# ------------------
X=np.arange(0,401,1);nx= np.size(X)
Y=np.arange(40,200,1);ny = np.size(Y)
X,Y=np.meshgrid(X,Y)
Z = 10000*np.random.random((ny,nx))
Z=np.array(Z)
# ------------------------------------------------------------    
Z_min=np.amin(Z)
Z_max=np.amax(Z)
# ------------------------------------------------------------
norm = colors.LogNorm(vmin=np.nanmin(Z),vmax=np.nanmax(Z),clip=False)
# ------------------------------------------------------------
fig = plt.figure(figsize=(15,5));axs = [fig.add_subplot(131),fig.add_subplot(132),fig.add_subplot(133)]
p0 = axs[0].pcolormesh(X,Y,np.log10(Z),cmap='rainbow',norm=norm);plt.colorbar(p0,ax=axs[0]);
axs[0].set_title('Original method: NOT TO DO!')
p1 = axs[1].pcolormesh(X,Y,Z,cmap='rainbow',norm=norm);plt.colorbar(p1,ax=axs[1])
axs[1].set_title('Normalized colorbar, original data')
p2 = axs[2].pcolormesh(X,Y,np.log10(Z),cmap='rainbow');plt.colorbar(p2,ax=axs[2])
axs[2].set_title('Logarithmic data, original colormap')
plt.savefig('test.png',bbox_inches='tight') 
# --------------------------------------------------------------

所以结果是这样的:enter image description here

在第一种情况下,我们使用了对数颜色图,并取了数据的对数,因此颜色条不再起作用,因为 map 上的值很小,而且我们对颜色条使用了较大的限制。 在中间的图像中,我们使用标准化颜色条或对数颜色条,以便可以很自然地理解图像上的内容以及值是什么。第三种情况是,当我们从数据中取对数时,颜色条仅显示我们必须使用的 10 次幂,以便解释绘图上的颜色值。

所以,最后,我建议采用中间方法:使用对数颜色条和原始数据。

关于python - matplotlib 对数曲面图的对数颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74571588/

相关文章:

python - 无法在 google colab 中使用 "Times New Roman"字体

python - Numpy 子类属性切片

python - 当我尝试 reshape numpy 数组时,为什么 memmap 需要文件名?

python - 确定一个点是否位于 Matplotlib 子图中

python-2.7 - 向calmap图添加颜色条

python - 与 Python3 numpy.random.rand 计算的 C++ 中相同的随机数

python - 参数在发送到函数之前发生变化,python 2.7

python regex - 查找电话号码

python - 两个大型数据集的最快迭代合并

python - X 标签 matplotlib