我有一组约2000个文件,看起来像:10_20.txt
,10_21.txt
,10_21.txt
,...,10_50.txt
,...,11.20.txt
,...,11.50.txt
,...,20_50.txt
文件名中的第一个值,我们称之为x
,从1到10的10到20,文件名中的第二个值,我们将调用y
,并以1到20的步长从20到50。
在这些文件中,有一堆值和我要提取的另一个值,我们称之为z
。
我编写了一个循环文件的程序,并从每个文件中提取z
并将其添加到列表中。
我现在的问题是,如果我有2个numpy
数组看起来像:
x = np.arange(10,20,1)
y = np.arange(20,50,1)
和z
列表中有〜2000 floats
,绘制z
如何依赖x
和y
的最佳方式是什么?有没有标准的方法来做到这一点?
我一直认为最好从文件中提取x
,y
和z
,并将它们添加到多维数组中。如果是这种情况,任何人都可以指出我如何从文件名中提取x
和y
值的正确方向。
假设你有一个准备好的函数,比如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)
然后你可以用来自z
的imshow
或matshow
来形象化matplotlib
。例如:
from matplotlib import pyplot as plt
fix,ax = plt.subplots()
ax.imshow(z)
plt.show()
编辑:
为了回答OP的问题,有多种方法可视化您的数据。 imshow
和matshow
都做同样的事情,但显示细节不同。此外,您还可以生成等高线图或三维表面。这很大程度上取决于你想看到什么。无论如何,假设上面的代码完成了你想要的,我在下面展示一些使用四种不同方法来显示相同示例数据的代码。您可以使用pythons内置help()
函数,当然还有matplotlib和numpy文档页面,了解有关这些不同方法的更多信息。
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()
最终的情节看起来像这样:
使用x和y作为坐标,并为能量z设置一个大小。
一个表也可以工作,因为你没有声明x和y几何有任何数字目的而不是lablels。