Python Matplotlib-为非结构化数据绘制4D曲面图,facecolor输入存在问题

Python Matplotlib-为非结构化数据绘制4D曲面图,facecolor输入存在问题,python,matplotlib,colormap,Python,Matplotlib,Colormap,我正在尝试绘制一个3D曲面图,使用第四个变量作为色标。三个输入变量的分布不是规则间隔的,但我想我已经用griddata方法解决了这一部分。每个变量都是一个包含20个值的列表,其中一个变量是使用其他3个变量的数字代码的输出。其思想是使用两个输入变量加上曲面图的数字代码输出,并使用第三个输入变量作为色标。当我试图使用facecolor参数为颜色比例使用另一个变量的值时,我无法生成正确的绘图。我已经尝试过将这个变量的值标准化为0-1,以及其他几种方法,但是在大多数情况下,我只得到一个颜色一致或类型错误

我正在尝试绘制一个3D曲面图,使用第四个变量作为色标。三个输入变量的分布不是规则间隔的,但我想我已经用griddata方法解决了这一部分。每个变量都是一个包含20个值的列表,其中一个变量是使用其他3个变量的数字代码的输出。其思想是使用两个输入变量加上曲面图的数字代码输出,并使用第三个输入变量作为色标。当我试图使用facecolor参数为颜色比例使用另一个变量的值时,我无法生成正确的绘图。我已经尝试过将这个变量的值标准化为0-1,以及其他几种方法,但是在大多数情况下,我只得到一个颜色一致或类型错误的绘图。下面您可以找到我试图运行的代码

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
import matplotlib

#opening the files with the 4 variables
p1=open('par1log10.txt','r')
p2=open('par2log10.txt','r')
p3=open('par3log10.txt','r')
output=open('response.txt','r')

par1, par2, par3, output1 = ([] for i in range(4))

for a in p1:
    par1.append(float(a))

for b in p2:
    par2.append(float(b))

for c in p3:
    par3.append(float(c))

for d in output:
    output1.append(float(d))


p1.close()
p2.close()
p3.close()
output.close()

data1=np.array(par1)
data2=np.array(par2)
data3=np.array(par3)
output=np.array(output1)

fig = plt.figure()

xi = np.linspace(data1.min(),data1.max(),200)
yi = np.linspace(data2.min(),data2.max(),200)
wi = np.linspace(data3.min(),data3.max(),200)

# Interpoling unstructured data 
zi = griddata((data1, data2), output, (xi[None,:], yi[:,None]), method='cubic')
# removing NaNs from the array
zi = np.nan_to_num(zi)

ax = fig.add_subplot(1, 1, 1, projection='3d', azim=210)

xig, yig = np.meshgrid(xi, yi)

#normalizing variable to interval 0-1
data3col=data3/data3.max()

surf = ax.plot_surface(xig, yig, zi, rstride=1, cstride=1, facecolor=cm.jet(data3col), linewidth=0, antialiased=False, shade=False)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
#fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_zlim(0, 350000)

plt.show()
这个版本的代码只是显示了一个蓝色的表面,我也尝试过,但没有成功,根据列表的值构建我自己的colormap,然后使用该colormap,但没有结果。 这是我在这里的第一个问题,所以我希望我没有违反任何规则或犯任何错误。
任何帮助都是非常宝贵的

欢迎你,阿里尔。看看这个问题及其答案:。我想你想要的是plt.climminzi,maxzi或者norm=mpl.colors.Normalizevmin=-minzi,vmax=maxzi。如果这些建议对您没有帮助,请作出相应的评论。@Schorsch。嗨,谢谢你的帮助。您提到的示例用作第三个变量,也用于colormap,第三个变量是在使用改变原始数据维度的方法meshgrid后,从输入参数x,y的函数中导出的。我试图用作colormap的源的是第四个变量,它的形状与用于3d可视化的不同。@Schorsch主要的一点是,原始数据的大小在使用meshgrid方法后会发生变化,而第四个变量,我想要的colorscale,不通过meshgrid方法,所以我不知道如何使用这个数据列表的原始形状。你的建议对3d数据非常有效,但如果我是对的,那么如果我尝试包含第四个变量,则不起作用。你是否尝试过用第四个变量而不是第三个变量重复网格插值?这就是第三个和第四个变量与x/y坐标在同一位置的结果。然后,您可以轻松地在3D曲面上使用第四个作为颜色。@Schorsch是的,我尝试使用“griddata”插值第四个变量。它工作正常,它生成一个具有所需形状的数组,但获得的数组包含NaN值,在转换为num后生成一个不符合颜色贴图要求的数组,我猜是因为它上面有太多的零。