使用已知值在Python中绘制3d表面

时间:2017-12-15 19:30:59

标签: python arrays numpy matplotlib multidimensional-array

我有一组约2000个文件,如:// let's clean things up for malformed input with RemoveEmptyEntries String[] terms = terms_list.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); Boolean found = terms.All(term => exampleTitle.Contains(term)); 10_20.txt10_21.txt,...,10_21.txt,...,{{1 },...,10_50.txt,...,11.20.txt

文件名中的第一个值,我们称之为11.50.txt,从10到20步为1,第二个值在文件名中,我们称之为20_50.txt,从步骤1的20-50开始。

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

我编写了一个循环文件​​的程序,并从每个文件中提取y并将其添加到列表中。

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

z

numpy列表中包含〜x = np.arange(10,20,1) y = np.arange(20,50,1)z取决于floatsz的最佳方式是什么?有标准的方法吗?

我一直认为最好从文件中提取xyx,然后将它们添加到多维数组中。如果是这种情况,任何人都可以指出我如何从文件名中提取yz值的正确方向。

2 个答案:

答案 0 :(得分:2)

假设你有一个准备好的函数,比如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)

然后,您可以使用zimshow matshowmatplotlib显示from matplotlib import pyplot as plt fix,ax = plt.subplots() ax.imshow(z) plt.show() 。例如:

imshow

修改

要回答OP的问题,有多种方法可视化您的数据。 matshowhelp()同时执行相同的操作,但显示详细信息不同。此外,您还可以生成等高线图或三维表面。这很大程度上取决于你想看到什么。无论如何,假设上面的代码完成了你想要的,我在下面展示一些使用四种不同方法来显示相同​​示例数据的代码。您可以使用pythons内置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() 函数找到有关这些不同方法的更多信息,当然还有matplotlibnumpy文档页面。

return "index.html";

最终情节如下:

the result of the above given code

答案 1 :(得分:0)

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

表格也可以使用,因为你没有声明x和y几何有任何数字用途而不是标签。