我正在使用 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')
# --------------------------------------------------------------
在第一种情况下,我们使用了对数颜色图,并取了数据的对数,因此颜色条不再起作用,因为 map 上的值很小,而且我们对颜色条使用了较大的限制。 在中间的图像中,我们使用标准化颜色条或对数颜色条,以便可以很自然地理解图像上的内容以及值是什么。第三种情况是,当我们从数据中取对数时,颜色条仅显示我们必须使用的 10 次幂,以便解释绘图上的颜色值。
所以,最后,我建议采用中间方法:使用对数颜色条和原始数据。
关于python - matplotlib 对数曲面图的对数颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74571588/