O gráfico Quiver é basicamente um tipo de gráfico 2D que mostra as linhas do vetor como setas. Este tipo de plotagem é útil em engenheiros elétricos para visualizar o potencial elétrico e mostrar gradientes de tensão em engenharia mecânica.

Criando uma Quiver Plot

Vamos começar a criar um gráfico de quiver simples contendo uma seta que irá explicar como a ax.quiver()função do Matplotlib funciona. A ax.quiver()função leva quatro argumentos:
Sintaxe:

ax.quiver (x_pos, y_pos, x_dir, y_dir, color) 

Aqui x_pose y_posestão as posições iniciais da seta enquanto x_dire y_dirsão as direções da seta.
O gráfico abaixo contém uma aljava começando em x_pos = 0e y_pos = 0. A direção da seta está apontando para cima e à direita em x_dir = 1e y_dir = 1.

Exemplo:

import numpy as np 
import matplotlib.pyplot as plt 
  
  
x_pos = 0
y_pos = 0
x_direct = 1
y_direct = 1
fig, ax = plt.subplots(figsize = (12, 7)) 
ax.quiver(x_pos, y_pos, x_direct, y_direct) 
ax.set_title('Quiver plot with one arrow') 
plt.show() 

Resultado :



Quiver Plot com duas setas

Vamos adicionar outra seta ao gráfico passando por dois pontos de partida e duas direções. Mantendo a seta original começando na origem (0, 0) e apontando para cima e para a direção certa (1, 1), e crie a segunda seta começando em (0, 0) apontando para baixo na direção (0, -1) .Para ver o ponto inicial e final claramente, definiremos os limites do eixo para [-1.5, 1.5] usando o método ax.axis()e passando os argumentos na forma de [x_min, x_max, y_max, y_min]. Adicionando um argumento adicional scale=valueao ax.quiver()método, podemos gerenciar o comprimento das setas para parecer mais longo e aparecer melhor no gráfico.

Exemplo:

import numpy as np 
import matplotlib.pyplot as plt 
  
  
x_pos = [0, 0] 
y_pos = [0, 0] 
x_direct = [1, 0] 
y_direct = [1, -1] 
fig, ax = plt.subplots(figsize = (12, 7)) 
ax.quiver(x_pos, y_pos, x_direct, y_direct, 
         scale = 5) 
  
ax.axis([-1.5, 1.5, -1.5, 1.5]) 
plt.show() 

Resultado :

Quiver Plot usando meshgrid

Um gráfico de aljava contendo duas setas é um bom começo, mas é muito lento e longo para adicionar setas ao gráfico de aljava uma por uma. Portanto, para criar uma superfície de flechas totalmente 2D, usaremos o meshgrid()método Numpy. Primeiro, crie um conjunto de matrizes denominado X e Y que representa as posições iniciais de xey respectivamente de cada seta no gráfico da aljava. As posições iniciais das setas x, y também podem ser usadas para definir os componentes xey de cada direção da seta. No gráfico a seguir, uev denotam a matriz de direções das setas da aljava e definiremos a direção da seta com base no ponto inicial da seta usando as equações abaixo:

x_ {direção} = cos (x_ {início \ ponto})
y_ {direção} = sin (y_ {início \ ponto})

Exemplo:

import numpy as np 
import matplotlib.pyplot as plt 
  
  
x = np.arange(0, 2.2, 0.2) 
y = np.arange(0, 2.2, 0.2) 
  
X, Y = np.meshgrid(x, y) 
u = np.cos(X)*Y 
v = np.sin(Y)*Y 
fig, ax = plt.subplots(figsize =(14, 8)) 
ax.quiver(X, Y, u, v) 
  
ax.xaxis.set_ticks([]) 
ax.yaxis.set_ticks([]) 
ax.axis([-0.3, 2.3, -0.3, 2.3]) 
ax.set_aspect('equal') 
plt.show() 

Resultado :

Quiver Plot usando gradiente

Vamos criar um gráfico de quiver que mostra a função gradiente. O np, gradient()método de Numpy pode ser usado para aplicar a função gradiente a cada posição inicial x, y de cada seta. A equação é usada para criar o seguinte gráfico:

z = xe ^ {- x ^ 2-y ^ 2}

Exemplo:



import numpy as np 
import matplotlib.pyplot as plt 
  
  
x = np.arange(-2, 2.2, 0.2) 
y = np.arange(-2, 2.2, 0.2) 
X, Y = np.meshgrid(x, y) 
z = X * np.exp(-X**2-Y**2) 
dx, dy = np.gradient(z) 
fig, ax = plt.subplots(figsize =(9, 9)) 
ax.quiver(X, Y, dx, dy) 
  
ax.xaxis.set_ticks([]) 
ax.yaxis.set_ticks([]) 
ax.set_aspect('equal') 
plt.show() 

Resultado :

Gráfico para colorir Quiver

O ax.quiver()método da biblioteca matplotlib do python fornece uma cor de atributo opcional que especifica a cor da seta. O atributo quiver color requer as mesmas dimensões das matrizes de posição e direção.
Abaixo está o código que modifica os gráficos de quiver que fizemos anteriormente:

Exemplo 1:

import numpy as np 
import matplotlib.pyplot as plt 
fig, (ax1, ax2) = plt.subplots(1, 2, figsize =(14, 8)) 
  
x = np.arange(0, 2.2, 0.2) 
y = np.arange(0, 2.2, 0.2) 
X, Y = np.meshgrid(x, y) 
u = np.cos(X)*Y 
v = np.sin(y)*Y 
n = -2
color = np.sqrt(((v-n)/2)*2 + ((u-n)/2)*2) 
ax1.quiver(X, Y, u, v, color, alpha = 0.8) 
ax1.xaxis.set_ticks([]) 
ax1.yaxis.set_ticks([]) 
ax1.axis([-0.2, 2.3, -0.2, 2.3]) 
ax1.set_aspect('equal') 
ax1.set_title('meshgrid function') 
x = np.arange(-2, 2.2, 0.2) 
y = np.arange(-2, 2.2, 0.2) 
X, Y = np.meshgrid(x, y) 
z = X * np.exp(-X**2 -Y**2) 
dx, dy = np.gradient(z) 
n = -2
color = np.sqrt(((dx-n)/2)*2 + ((dy-n)/2)*2
ax2.quiver(X, Y, dx, dy, color) 
ax2.xaxis.set_ticks([]) 
ax2.yaxis.set_ticks([]) 
ax2.set_aspect('equal') 
ax2.set_title('gradient') 
  
  
plt.tight_layout() 
plt.show() 

Resultado :

Exemplo 2: Construindo um gráfico de quiver de função \ vec {F}que define o campo 2D com quatro vértices, conforme mostrado no gráfico abaixo:

\ vec {F} = sin (x) cos (y) \ \ hat {i} -cos (x) sin (y) \ \ hat {j}

import numpy as np 
import matplotlib.pyplot as plt 
x = np.arange(0, 2 * np.pi + 2 * np.pi / 20
              2 * np.pi / 20) 
y = np.arange(0, 2 * np.pi + 2 * np.pi / 20, 
              2 * np.pi / 20) 
  
X, Y = np.meshgrid(x, y) 
  
u = np.sin(X)*np.cos(Y) 
v = -np.cos(X)*np.sin(Y) 
color = np.sqrt(((dx-n)/2)*2 + ((dy-n)/2)*2) 
fig, ax = plt.subplots(figsize =(14, 9)) 
ax.quiver(X, Y, u, v, color, alpha = 1) 
  
ax.xaxis.set_ticks([]) 
ax.yaxis.set_ticks([]) 
ax.axis([0, 2 * np.pi, 0, 2 * np.pi]) 
ax.set_aspect('equal') 
plt.show() 

Resultado :