从.dat文件制作箭袋图

时间:2016-10-19 14:46:34

标签: python matplotlib plot

您好我正在尝试根据存储在.dat文件中的数据制作一个箭头(矢量场)图。我有4个.dat文件是1D数组,一个用于x轴,y轴,f(x,y)沿x和f(x,y)沿y。

注意,我能够构建一个箭头图而不从.dat文件导入数据,我只是按照这个基本示例here

但是,我无法将此基本示例应用于我需要从.dat文件导入数据的示例。我的代码在下面,我没有得到任何错误消息,但我得到一个空白的箭袋情节。任何帮助/建议将不胜感激,谢谢!

import numpy as np
import matplotlib.pyplot as plt

n=12

data0 = np.genfromtxt('xaxis.dat')
data1 = np.genfromtxt('yaxis.dat')
data2 = np.genfromtxt('fx.dat')
data3 = np.genfromtxt('fy.dat')

x  = data0[0]
y  = data1[0]
fx = data2[0]
fy = data3[0]

plt.axes([0.025, 0.025, 0.95, 0.95])
plt.quiver(x,y,fx,fy, alpha=.5)
plt.quiver(x,y,fx,fy,edgecolor='k',facecolor='none', linewidth=.5)

plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1,n)
plt.yticks(())

plt.show()

1 个答案:

答案 0 :(得分:1)

example for the quiver plot中,您提供的所有XYUV都是2D数组,形状为(n,n)

在您的示例中,您要为xyfxfy导入值数组,然后仅选择{{1}的第一行}。

使用代码时:

[0]

我得到: only one point 在xaxis.dat和fx.dat中为import numpy as np import matplotlib.pyplot as plt n=3 # number of points, changed it data0 = np.genfromtxt('xaxis.dat') data1 = np.genfromtxt('yaxis.dat') data2 = np.genfromtxt('fx.dat') data3 = np.genfromtxt('fy.dat') x = data0[0] y = data1[0] fx = data2[0] fy = data3[0] plt.axes([0.025, 0.025, 0.95, 0.95]) # position of bottom left point of graph inside window and its size plt.quiver(x,y,fx,fy, alpha=.5) # draw inside of arrows, half transparent plt.quiver(x,y,fx,fy,edgecolor='k',facecolor='none', linewidth=.5) # draw contours of arrows plt.xlim(-1,n) # left and right most values in the x axis plt.xticks(()) # remove the numbers from the x axis plt.ylim(-1,n) # ... plt.yticks(()) # ... plt.show() ,在yaxis.dat中为0 1 2 0 1 2 0 1 2,在fy.dat中为0 0 0 1 1 1 2 2 2。 如果我只是从数组赋值中删除1 1 1 2 2 2 3 3 3,我得到: all points 显示所有点。

我要做的一个更改是使用[0]plt.xlim(min(x)-1,max(x)+1),以确保您可以查看图表的正确区域。例如,如果我使所有四个数组等于plt.ylim(min(y)-1,max(y)+1)(一个1D数组,其中10个随机元素介于0和1之间),我得到: random points

关于阵列形状的注释

np.random.rand(10)也将接受以下格式的数组:

plt.quiver

enter image description here 但如果所有数组都是1D,则不会自动进行网格划分(在这种情况下,如果没有正确的结构,它将重复x = [0, 1, 2] # 1D array (list, actually...) y = [0, 1, 2] fx = [[0, 1, 2], [0, 1, 2], [0, 1, 2]] # 2D array fy = [[0, 0, 0], [1, 1, 1], [2, 2, 2]] x

y

enter image description here

所以要么:

fx = np.array(fx).flatten()
fy = np.array(fy).flatten()

x = [0, 1, 2, 3] y = [4, 5, 6] fx = [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]] fy = [[4, 4, 4, 4], [5, 5, 5, 5], [6, 6, 6, 6]] 为你做网格,或让所有数组具有相同的形状,plt将获得每个箭头的位置和每个索引的组件:

plt.quiver

以前的答案(错误)

[前两段] ......

这意味着您可能已经注意到x = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] y = [4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6] fx = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] fy = [4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6] 返回一个2D数组(因为它能够从单个文件中导入多个列,因此如果没有其他内容,则返回的数组将模仿文件的2D结构),将genfromtxt放在文档xaxis.dat的第一行。

编辑:下面的句子是错误的,plt.quiver可以接收1D数组,只是形状正确。

然而data0[0]需要2D数组,从中检索每个点的值:对于点quiver,位置将为i,j,箭头将为{{1} }。

如果你在文件中有重复的x和y值,如下所示:

  • xaxis.dat:

    0,1,2,0,1,2,0,1,2

  • yaxix.dat:

    0,0,0,1,1,1,2,2,2

你可以只将reshape所有四个数组都放到(x中的#点,y中的#个点),它应该可以解决。

如果不这样做,则必须使用与np.mgrid(或np.meshgrid)类似的内容来制作(X[i,j], Y[i,j])(U[i,j], V[i,j])数组的有效组合,并格式化<{1}}和X相应的。{/ p>