我正在使用Python创建3D表面贴图,我有一组数据我正试图绘制为3D曲面,问题是我已经记录了Z轴(显示数据峰值所必需的),这意味着默认的色彩贴图不起作用(显示一个连续的 colored颜色 ).我曾try 使用LogNorm来规格化色彩映射,但这再次产生了一个连续的 colored颜色 .我不确定是否应该使用记录的值来归一化 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') 

推荐答案

这只是对数 colored颜色 和对数数据的一个例子:

#!/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') 
# --------------------------------------------------------------

So the result is like this:enter image description here

在第一种情况下,我们使用了对数色彩映射表,并且还获取了数据的对数,因此色彩条不再起作用,因为贴图上的值很小,而我们对色彩条使用了较大的限制. 在中间的图像中,我们使用归一化 colored颜色 条或对数 colored颜色 条,以便很自然地理解图像上是什么以及值是什么.第三种情况是,当我们从数据中提取对数时, colored颜色 条只是显示了我们必须使用的第10次方的力量,以便解释曲线图上的 colored颜色 值.

因此,最后,我建议使用中间方法:使用对数色带和原始数据.

Python相关问答推荐

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

沿着数组中的轴计算真实条目

如何访问所有文件,例如环境变量

将tdqm与cx.Oracle查询集成

不允许访问非IPM文件夹

启动带有参数的Python NTFS会导致文件路径混乱

lityter不让我输入左边的方括号,'

如何在达到end_time时自动将状态字段从1更改为0

为什么if2/if3会提供两种不同的输出?

Geopandas未返回正确的缓冲区(单位:米)

python—telegraph—bot send_voice发送空文件

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

Polars map_使用多处理对UDF进行批处理

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

numpy数组和数组标量之间的不同行为

Regex用于匹配Python中逗号分隔的AWS区域

将时间序列附加到数据帧

使用元组扩展字典的产品挑战