5.11. Quiver - поле векторов

Стрелки очень удобны тем, что позволяет изображать функцию от двух переменных z = f(x, y) в виде плоскости с множеством векторов, каждый из которых указывает значение и направление некоторой величины.

Несколько примеров

В самом простом случае, метод quiver принимает всего два аргумента - значениями которых являются два двумерных массива одинакового размера:

  • U - массив длин стрелок по оси x;
  • V - массив длин стрелок по оси y.

Посмотрите на три следующих примера и вы сразу поймете как строятся стрелки:

import matplotlib.pyplot as plt

U = [[1, 1, 1, 1], [-2, -2, -2, -2],
     [3, 3, 3, 3], [-3, -3, -3, -3]]

V = [[0, 0, 0, 0], [0, 0, 0, 0],
     [0, 0, 0, 0], [0, 0, 0, 0]]

fig, ax = plt.subplots()

ax.quiver(U, V)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"

plt.show()

Matplotlib quiver стрелки направлены горизонтально

import matplotlib.pyplot as plt

U = [[0, 0, 0, 0], [0, 0, 0, 0],
     [0, 0, 0, 0], [0, 0, 0, 0]]

V = [[1, 1, 1, 1], [-2, -2, -2, -2],
     [3, 3, 3, 3], [-3, -3, -3, -3]]

fig, ax = plt.subplots()

ax.quiver(U, V)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"

plt.show()

Matplotlib quiver стрелки направлены вертикально

import matplotlib.pyplot as plt

U = [[1, 1, 1, 1],
     [0, 2, 2, 2],
     [0, 0, 3, 3],
     [0, 0, 0, 4]]

V = [[1, 0, 0, 0],
     [1, 2, 0, 0],
     [1, 2, 3, 0],
     [1, 2, 3, 4]]

fig, ax = plt.subplots()

ax.quiver(U, V)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
ax.set_xticks(np.arange(4.5))
ax.set_yticks(np.arange(4.5))

plt.show()

Matplotlib quiver произвольное направление стрелок


Координаты стрелок

На предыдущих примерах видно, что каждая стрелка начинается в узлах целочисленной регулярной решетки, которую matplotlib создает автоматически. Но мы можем и сами управлять положением каждой стрелки с помощью параметров X и Y. Как нетрудно догадаться, это два двумерных массива с x и y координатами начала стрелок. Причем размеры X и Y совпадают с размерами U и V, т.е. размеры X, Y, U и V должны совпадать:

import matplotlib.pyplot as plt

X = [0, 0, 1, 1, 2, 2]
Y = [0, 0, 1, 1, 0, 0]

U = [2, 4, -2, 2, -4, -2]
V = [3, 0, -3, -3, 0, 3]

fig, ax = plt.subplots()

ax.quiver(X, Y, U, V)

plt.show()

Matplotlib quiver: координаты начала стрелок

В этом примере мы использовали одномерные массивы, но это только для наглядности. Учитывая, что мы работаем с двумерной сеткой, лучше (хотя вовсе не обязательно) использовать двумерные массивы:

import numpy as np
import matplotlib.pyplot as plt


X, Y = np.mgrid[-2*np.pi:2*np.pi:20j,
                -2*np.pi:2*np.pi:20j]

U = np.sin(X) + np.cos(Y)
V = np.cos(X) + np.cos(Y)

fig, ax = plt.subplots()

ax.quiver(X, Y, U, V)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(12)    #  высота "Figure"

plt.show()

Matplotlib quiver: координаты начала стрелок заданы двумерным массивом


Цвет стрелок

Параметр C позволяет с помощью массива определить цвет каждой стрелки:

import matplotlib.pyplot as plt

X = [0, 0, 1, 1, 2, 2]
Y = [0, 0, 1, 1, 0, 0]

U = [2, 4, -2, 2, -4, -2]
V = [3, 0, -3, -3, 0, 3]

C = [0, 2, 0, 1, 2, 1]

fig, ax = plt.subplots()

ax.quiver(X, Y, U, V, C)

plt.show()

Matplotlib quiver: цвет каждой стрелки

Стрелки могут быть как одноцветными так и разноцветными, причем цвет стрелок так же как их длина и направление может отражать некоторую закономерность:

import numpy as np
import matplotlib.pyplot as plt


X, Y = np.mgrid[-2*np.pi:2*np.pi:20j,
                -2*np.pi:2*np.pi:20j]

U = np.sin(X) + np.cos(Y)
V = np.cos(X) + np.cos(Y)

fig, axes = plt.subplots(1, 2)

C = np.full_like(X, 5)
axes[0].quiver(X, Y, U, V, C)
axes[0].set_title('Стрелки одного цвета')

C = U + V
axes[1].quiver(X, Y, U, V, C)
axes[1].set_title('Цвет задан функцией: C = U + V')


fig.set_figwidth(16)    #  ширина и
fig.set_figheight(7)    #  высота "Figure"

plt.show()

Matplotlib quiver: цвет каждой стрелки может определяться функцией

Однако, параметр C не позволяет задавать цвет строк с помощью строк или управлять прозрачностью стрелок. Поэтому, если параметр C не дает нужного результата то можно вместо него указать параметр color:

import numpy as np
import matplotlib.pyplot as plt

X, Y = np.mgrid[-2*np.pi:2*np.pi:20j,
                -2*np.pi:2*np.pi:20j]

U = np.sin(X) + np.cos(Y)
V = np.cos(X) + np.cos(Y)

fig, ax = plt.subplots()

ax.quiver(X, Y, U, V, 
          color = 'r')

X, Y = np.mgrid[-2*np.pi:2*np.pi:40j,
                -2*np.pi:2*np.pi:40j]

U = np.sin(X) + np.cos(Y)
V = np.cos(X) + np.cos(Y)

ax.quiver(X, Y, U + 1, V + 1, 
          color = '#dd113360')    #  RGBA

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(12)    #  высота "Figure"

plt.show()

Matplotlib quiver: цвет каждой стрелки заданный параметром color