根据已知值在Python中绘制三维曲面

根据已知值在Python中绘制三维曲面,python,arrays,numpy,matplotlib,multidimensional-array,Python,Arrays,Numpy,Matplotlib,Multidimensional Array,我有一组大约2000个文件,看起来像:10_20.txt,10_21.txt,10_21.txt10_50.txt11.20.txt11.50.txt20_50.txt 文件名中的第一个值,我们将调用x,从10到20分为1步,文件名中的第二个值,我们将调用y,从20到50分为1步 在这些文件中,有一堆值和我想提取的另一个值,我们称之为z 我已经编写了一个程序来循环浏览这些文件,并从每个文件中提取z,然后将其添加到列表中 我现在的问题是,如果我有2个numpy数组,它们看起来像: x=np.ara

我有一组大约2000个文件,看起来像:
10_20.txt
10_21.txt
10_21.txt
<代码>10_50.txt<代码>11.20.txt<代码>11.50.txt<代码>20_50.txt

文件名中的第一个值,我们将调用
x
,从10到20分为1步,文件名中的第二个值,我们将调用
y
,从20到50分为1步

在这些文件中,有一堆值和我想提取的另一个值,我们称之为
z

我已经编写了一个程序来循环浏览这些文件,并从每个文件中提取
z
,然后将其添加到列表中

我现在的问题是,如果我有2个
numpy
数组,它们看起来像:

x=np.arange(10,20,1)
y=np.arange(20,50,1)

z
列表中有~2000个
浮动
,绘制
z
如何依赖
x
y
的最佳方法是什么?有没有标准的方法可以做到这一点


我一直在想,最好从文件中提取
x
y
z
,并将它们添加到多维数组中。如果是这种情况,有人能告诉我如何从文件名中提取
x
y
值的正确方向吗

假设您有一个ready函数,比如
read_z_from_file(filename)
,它返回文件中包含的
z
-值,您可以这样操作:

import numpy as np

x = np.arange(10,20,1, dtype = np.int)
y = np.arange(20,50,1, dtype = np.int)
z = np.zeros((x.shape[0],y.shape[0]))

for i,x0 in enum(x):
   for j,y0 in enum(y):
      filename = '{}_{}.txt'.format(x0,y0)
      z[i,j] = read_z_from_file(filename)
然后可以使用
imshow
matshow
matplotlib
可视化
z
。例如:

from matplotlib import pyplot as plt
fix,ax = plt.subplots()
ax.imshow(z)
plt.show()
编辑

为了回答OP的问题,有多种方法可以可视化您的数据
imshow
matshow
的功能相同,但显示细节不同。此外,除其他外,还可以生成等高线图或三维曲面。这在很大程度上取决于你想看什么。无论如何,假设上面的代码符合您的要求,我将在下面展示一些使用四种不同方法来显示相同示例数据的代码。您可以通过内置的pythons
help()
函数,当然还有和文档页面,了解更多关于这些不同方法的信息

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D ##for the 3d surface plot
from matplotlib import cm

#non-integer spacing of the coordinates
x = np.linspace (10, 20, 15)
y = np.linspace (20, 50, 70)

#gridding the coordinates
xm, ym = np.meshgrid(x,y)

#example data
z = np.exp(-( 0.1*(xm-12)**2 + 0.05*(ym-40)**2 ) )

#opening a figure
fig = plt.figure(figsize=(6,6))

#matshow:
ax1 = fig.add_subplot(221)
res = ax1.matshow(
    z,
    origin = 'lower',
    aspect = 'auto',
    extent=[x[0],x[-1],y[0],y[-1]],
    )
fig.colorbar(res)
ax1.set_title('matshow', y=1.1)

#imshow
ax2 = fig.add_subplot(222)
res = ax2.imshow(
    z,
    origin = 'lower',
    aspect = 'auto',
    extent=[x[0],x[-1],y[0],y[-1]],
    )
fig.colorbar(res)
ax2.set_title('imshow')


#contourf
ax3 = fig.add_subplot(223)
res = ax3.contourf(xm,ym,z)
fig.colorbar(res)
ax3.set_title('contourf')

#3d surface
ax4 = fig.add_subplot(224, projection='3d')
res = ax4.plot_surface(
    xm,ym,z,
    cmap = cm.viridis,
    antialiased=False
)
fig.colorbar(res, pad = 0.1)
ax4.set_title('3d surface')

fig.tight_layout()
plt.show()
最终的绘图如下所示:

import numpy as np

x = np.arange(10,20,1, dtype = np.int)
y = np.arange(20,50,1, dtype = np.int)
z = np.zeros((x.shape[0],y.shape[0]))

for i,x0 in enum(x):
   for j,y0 in enum(y):
      filename = '{}_{}.txt'.format(x0,y0)
      z[i,j] = read_z_from_file(filename)

假设您有一个ready函数,比如
read_z_from_file(filename)
,该函数返回文件中包含的
z
-值,您可以如下操作:

import numpy as np

x = np.arange(10,20,1, dtype = np.int)
y = np.arange(20,50,1, dtype = np.int)
z = np.zeros((x.shape[0],y.shape[0]))

for i,x0 in enum(x):
   for j,y0 in enum(y):
      filename = '{}_{}.txt'.format(x0,y0)
      z[i,j] = read_z_from_file(filename)
然后可以使用
imshow
matshow
matplotlib
可视化
z
。例如:

from matplotlib import pyplot as plt
fix,ax = plt.subplots()
ax.imshow(z)
plt.show()
编辑

为了回答OP的问题,有多种方法可以可视化您的数据
imshow
matshow
的功能相同,但显示细节不同。此外,除其他外,还可以生成等高线图或三维曲面。这在很大程度上取决于你想看什么。无论如何,假设上面的代码符合您的要求,我将在下面展示一些使用四种不同方法来显示相同示例数据的代码。您可以通过内置的pythons
help()
函数,当然还有和文档页面,了解更多关于这些不同方法的信息

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D ##for the 3d surface plot
from matplotlib import cm

#non-integer spacing of the coordinates
x = np.linspace (10, 20, 15)
y = np.linspace (20, 50, 70)

#gridding the coordinates
xm, ym = np.meshgrid(x,y)

#example data
z = np.exp(-( 0.1*(xm-12)**2 + 0.05*(ym-40)**2 ) )

#opening a figure
fig = plt.figure(figsize=(6,6))

#matshow:
ax1 = fig.add_subplot(221)
res = ax1.matshow(
    z,
    origin = 'lower',
    aspect = 'auto',
    extent=[x[0],x[-1],y[0],y[-1]],
    )
fig.colorbar(res)
ax1.set_title('matshow', y=1.1)

#imshow
ax2 = fig.add_subplot(222)
res = ax2.imshow(
    z,
    origin = 'lower',
    aspect = 'auto',
    extent=[x[0],x[-1],y[0],y[-1]],
    )
fig.colorbar(res)
ax2.set_title('imshow')


#contourf
ax3 = fig.add_subplot(223)
res = ax3.contourf(xm,ym,z)
fig.colorbar(res)
ax3.set_title('contourf')

#3d surface
ax4 = fig.add_subplot(224, projection='3d')
res = ax4.plot_surface(
    xm,ym,z,
    cmap = cm.viridis,
    antialiased=False
)
fig.colorbar(res, pad = 0.1)
ax4.set_title('3d surface')

fig.tight_layout()
plt.show()
最终的绘图如下所示:

import numpy as np

x = np.arange(10,20,1, dtype = np.int)
y = np.arange(20,50,1, dtype = np.int)
z = np.zeros((x.shape[0],y.shape[0]))

for i,x0 in enum(x):
   for j,y0 in enum(y):
      filename = '{}_{}.txt'.format(x0,y0)
      z[i,j] = read_z_from_file(filename)

使用x和y作为坐标,并为能量z放置一个大小为的点


表格也可以,因为您没有说明x和y几何图形除了作为标签外还有任何数字用途。

使用x和y作为坐标,并为能量z设置一个大小为的点


表格也可以,因为您没有说明x和y几何图形除了作为标签之外还有任何数字用途。

我不明白您在想什么
x
y
z
具有不同的长度,因此您到底想要绘制什么?如何定义“依赖”?似乎x和y连接到文件名,并且这些文件包含要打印的内容。你能展示一下内容吗?每个文件是否有多个z值?每个z值都包含在标题名中具有x和y值的文件中。文件中唯一需要绘制的是z值,我已将其全部提取到一个大列表中。这导致了不同大小的数组,但实际上x和y的每个值都有一个特定的z值,因此所有数组长度都应该相同。我问的是如何最好地接近this@ShpielMeister,这些文件是包含分子轨道计算的大文本文件,其中唯一相关的值是能量,我已将每个文件提取到一个列表中。更具体地说,x和y指定了分子的几何结构,z给出了能量。我想看看当我们经过x时能量是如何变化的,我不明白你在想什么
x
y
z
具有不同的长度,因此您到底想要绘制什么?如何定义“依赖”?似乎x和y连接到文件名,并且这些文件包含要打印的内容。你能展示一下内容吗?每个文件是否有多个z值?每个z值都包含在标题名中具有x和y值的文件中。文件中唯一需要绘制的是z值,我已将其全部提取到一个大列表中。这导致了不同大小的数组,但实际上x和y的每个值都有一个特定的z值,因此所有数组长度都应该相同。我问的是如何最好地接近this@ShpielMeister,这些文件是包含分子轨道计算的大文本文件,其中唯一相关的值是能量,我已将每个文件提取到一个列表中。更具体地说,x和y指定了分子的几何结构,z给出了能量。我想看看能量随w的变化