Python Matplotlib-沿主方向指向点和从点指向点的箭头
问题: 我有一个形状为(N+2,N+2,4)的数组Python Matplotlib-沿主方向指向点和从点指向点的箭头,python,numpy,matplotlib,Python,Numpy,Matplotlib,问题: 我有一个形状为(N+2,N+2,4)的数组terrain。在最后一个维度中,如果该方向上的箭头指向所讨论的点,则为1或-1,-1,如果箭头指向该方向上的点,则为1。顺序是北、南、东、西。因此,1,-1,1,1将对应于: 我尝试使用的代码如下。但这不起作用,因为它们都是从点开始绘制的。根据地形[I,j]中对应于所述方向的位置值,我找不到一种方法来轻松绘制从或到所需方向上的点 import numpy as np import matplotlib.pyplot as plt N=3 te
terrain
。在最后一个维度中,如果该方向上的箭头指向所讨论的点,则为1或-1,-1,如果箭头指向该方向上的点,则为1。顺序是北、南、东、西。因此,1,-1,1,1
将对应于:
我尝试使用的代码如下。但这不起作用,因为它们都是从点开始绘制的。根据地形[I,j]
中对应于所述方向的位置值,我找不到一种方法来轻松绘制从或到所需方向上的点
import numpy as np
import matplotlib.pyplot as plt
N=3
terrain = np.zeros((N+2,N+2,4))
for i in range(1, N+1):
for j in range(1, N+1):
terrain[i,j] = np.random.choice([-1,1],4)
for i in range(N+2):
for j in range(N+2):
iterr.append([i,j])
iterr = np.array(iterr)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.quiver(iterr[:,0], iterr[:,1], terrain[:,:,0].reshape(((N+2)**2,1)), np.zeros(((N+2)**2,1)), color='k')
plt.quiver(iterr[:,0], iterr[:,1], terrain[:,:,1].reshape(((N+2)**2,1)), np.zeros(((N+2)**2,1)), color='yellow')
plt.quiver(iterr[:,0], iterr[:,1], np.zeros(((N+2)**2,1)), terrain[:,:,2].reshape(((N+2)**2,1)), color='blue')
plt.quiver(iterr[:,0], iterr[:,1], np.zeros(((N+2)**2,1)), terrain[:,:,3].reshape(((N+2)**2,1)), color='red')
在您的案例中,可能不是最容易使用的方法。箭袋法将始终从(x,y)绘制箭头向量(u,v)
迭代数据并使用它来绘制箭头可能更容易
使用您的数据结构和plt.arrow
我编写了这篇文章,其中跳过了terrain
中的所有0值:
import numpy as np
import matplotlib.pyplot as plt
N=3
terrain = np.zeros((N+2,N+2,4))
for i in range(1, N+1):
for j in range(1, N+1):
terrain[i,j] = np.random.choice([-1,1],4)
iterr = []
for i in range(N+2):
for j in range(N+2):
iterr.append([i,j])
iterr = np.array(iterr)
#-------------------------------------------------
fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
X = iterr[:,0]
Y = iterr[:,1]
cardinal_vectors = [(0,1), (0,-1), (1,0), (-1,0)] # north, south, east, west
cardinal_colors = ['black', 'green', 'blue', 'red']
# plot all points
plt.plot(X,Y,'k.')
for x, y, arrow_directions in zip(X, Y, terrain.reshape(((N+2)**2,4))):
for direction, vector, color in zip(arrow_directions,
cardinal_vectors,
cardinal_colors):
arrow_size = 0.5
head_size = 0.2
arrow_args = {'length_includes_head' : True,
'head_width' : head_size,
'head_length' : head_size,
'width' : 0.02,
'fc' : color,
'ec' : color}
dx = vector[0] * arrow_size
dy = vector[1] * arrow_size
if direction == 1:
# arrow FROM (x,y)
plt.arrow(x, y, dx, dy, **arrow_args)
if direction == -1:
# arrow TO (x,y)
plt.arrow(x + dx, y + dy, -dx, -dy, **arrow_args)
plt.show()
你能把代码改成a吗?我相信现在应该更清楚什么是
terrain
,我想这就是问题所在。希望很明显,问题在于它的绘图方面。代码仍然不是一个简单的问题。在调用plt.quiver
之前有几个问题。导入了哪些库?返回地形
在这种情况下没有意义。iterr=
行有问题itertools
可能是该库的一种方法,您希望使用该库的哪种方法?N
的值是多少?如果plt.quiver
之前的所有代码都按预期工作,那么从stackoverflow社区获得关于绘图方面的答案的机会会更好。对不起,我以为我已经理解了最小可复制示例的内容,但我遗漏了第二部分。