Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib-沿主方向指向点和从点指向点的箭头_Python_Numpy_Matplotlib - Fatal编程技术网

Python Matplotlib-沿主方向指向点和从点指向点的箭头

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

问题: 我有一个形状为(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
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社区获得关于绘图方面的答案的机会会更好。对不起,我以为我已经理解了最小可复制示例的内容,但我遗漏了第二部分。