您好我正在尝试根据存储在.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()
答案 0 :(得分:1)
在example for the quiver plot中,您提供的所有X
,Y
,U
和V
都是2D数组,形状为(n,n)
。
在您的示例中,您要为x
,y
,fx
和fy
导入值数组,然后仅选择{{1}的第一行}。
使用代码时:
[0]
我得到:
在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
,我得到:
显示所有点。
我要做的一个更改是使用[0]
和plt.xlim(min(x)-1,max(x)+1)
,以确保您可以查看图表的正确区域。例如,如果我使所有四个数组等于plt.ylim(min(y)-1,max(y)+1)
(一个1D数组,其中10个随机元素介于0和1之间),我得到:
np.random.rand(10)
也将接受以下格式的数组:
plt.quiver
但如果所有数组都是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
所以要么:
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>