Quiver Plot em Matplotlib
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_pos
e y_pos
estão as posições iniciais da seta enquanto x_dir
e y_dir
são as direções da seta.
O gráfico abaixo contém uma aljava começando em x_pos = 0
e y_pos = 0
. A direção da seta está apontando para cima e à direita em x_dir = 1
e 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=value
ao 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 que define o campo 2D com quatro vértices, conforme mostrado no gráfico abaixo:
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 :
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva