5.12. Streamplot - поток векторов

Говоря о векторном пространстве, можно ввести такое понятие как векторный поток - там где векторы длиннее там и сильнее их поток. Если векторы мы изображаем прямыми стрелками, то поток изображается стрелками, которые могут иметь самую разную кривизну, в зависимости от неоднородности векторного пространства. Взгляните на этот график и вы легко догадаетесь как связано векторное пространство и его векторный поток:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

Y, X = 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)

#  Строим поток векторов:
ax.streamplot(X, Y, U, V, 
              color = 'b')

X, Y = np.mgrid[-2*np.pi:2*np.pi:25j,
                -2*np.pi:2*np.pi:25j]
U = np.sin(X) + np.cos(Y)
V = np.cos(X) + np.cos(Y)

#  Поверх потока строим векторное поле:
ax.quiver(X, Y, U, V, 
          color = '#2011af60')    #  RGBA

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

plt.show()

Matplotlib streamplot


Простой пример

Метод streamplot всегда принимает четыре обязательных параметра:

  • X, y - одномерные координатные массивы.
  • U, V - массивы длин векторов (под которыми сейчас понимаются векторы скоростей потоков). Количество строк в этих массивах должно соответствовать длине Y, а количество столбцов длине X
  • ;

И еще один важный момент - все массивы должны быть массивами NumPy:

import numpy as np
import matplotlib.pyplot as plt

#  X = np.arange(7)
X = np.array([0, 1, 2, 3, 4, 5, 6])

#  Y = np.arange(7)
Y = np.array([0, 1, 2, 3, 4, 5, 6])

#  U = np.repeat([4,3,2,1,2,3,4], 7).reshape(7, 7)
U = np.array([[4, 4, 4, 4, 4, 4, 4],
              [3, 3, 3, 3, 3, 3, 3],
              [2, 2, 2, 2, 2, 2, 2],
              [1, 1, 1, 1, 1, 1, 1],
              [2, 2, 2, 2, 2, 2, 2],
              [3, 3, 3, 3, 3, 3, 3],
              [4, 4, 4, 4, 4, 4, 4]])

#  V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)
V = np.array([[1, 1, 1, 1, 1, 1, 1],
              [2, 2, 2, 2, 2, 2, 2],
              [3, 3, 3, 3, 3, 3, 3],
              [4, 4, 4, 4, 4, 4, 4],
              [3, 3, 3, 3, 3, 3, 3],
              [2, 2, 2, 2, 2, 2, 2],
              [1, 1, 1, 1, 1, 1, 1]])

fig, ax = plt.subplots()

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

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

plt.show()

Matplotlib streamplot используются только массивы numpy


Цвет линий

Цвет линий задается с помощью параметра color или cmap:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(7)
Y = np.arange(7)

U = np.repeat([4,3,2,-4,2,3,4], 7).reshape(7, 7)
V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)

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

axes[0][0].streamplot(X, Y, U, V,
                      color = 'r')
axes[0][0].set_title('Один цвет')

axes[0][1].streamplot(X, Y, U + 1, V,
                      color = '#9a3030ad')
axes[0][1].streamplot(X, Y, U, V,
                      color = '#309a30ad')
axes[0][1].set_title('RGBA')

axes[1][0].streamplot(X, Y, U, V,
                      color = U + V)
axes[1][0].set_title('Цвет задан массивом U + V')

axes[1][1].streamplot(X, Y, U, V,
                      color = U + V,
                      cmap = 'winter')
axes[1][1].set_title('Массив цветов и цветовая карта "winter"')

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

plt.show()

Matplotlib streamplot: цвет линий

Параметр cmap указывается вместо color только в случае если цвет задан массивом.


Плотность линий

Плотность линий задается параметром density:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(7)
Y = np.arange(7)

U = np.repeat([4,3,2,-4,2,3,4], 7).reshape(7, 7)
V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)

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

axes[0].streamplot(X, Y, U, V,
              density = 1)
axes[0].set_title('density = 1 (по умолчанию)')

axes[1].streamplot(X, Y, U, V,
              density = 3)
axes[1].set_title('density = 3')

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

plt.show()

Matplotlib streamplot: плотность линий


Толщина линий

Толщина линий задается параметром linewidth:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(7)
Y = np.arange(7)

U = np.repeat([4,3,2,-4,2,3,4], 7).reshape(7, 7)
V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)

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

axes[0].streamplot(X, Y, U, V,
              linewidth = 3)
axes[0].set_title('linewidth = 3')

axes[1].streamplot(X, Y, U, V,
              linewidth =  4 - U/V )
axes[1].set_title('linewidth = 4 - U/V')

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

plt.show()

Matplotlib streamplot: толщина линий


Величина стрелок

Иногда стрелки могут оказаться слишком маленькими, а их начертание неподходящим. Изменить их размер позволяет параметр arrowsize, а начертание arrowstyle:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(7)
Y = np.arange(7)

U = np.repeat([4,3,2,-4,2,3,4], 7).reshape(7, 7)
V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)

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

axes[0].streamplot(X, Y, U, V,
                   linewidth = 2,
                   arrowsize = 2,
                   arrowstyle = '->')
axes[0].set_title('arrowsize = 2, arrowstyle = "->"')

axes[1].streamplot(X, Y, U, V,
                   linewidth = 1,
                   arrowsize = 1,
                   arrowstyle = '-[')
axes[1].set_title('arrowsize = 1, arrowstyle = "-["')

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

plt.show()

Matplotlib streamplot: величина стрелок на линиях


Длина линий

Задать максимальную и минимальную длину линий можно с помощью параметров minlength и maxlength:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(7)
Y = np.arange(7)

U = np.repeat([4,3,2,-4,2,3,4], 7).reshape(7, 7)
V = np.repeat([1,2,3,4,3,2,1], 7).reshape(7, 7)

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

axes[0].streamplot(X, Y, U, V,
                   minlength = 0.1,
                   maxlength = 0.2)
axes[0].set_title('minlength = 0.1,  maxlength = 0.2')

axes[1].streamplot(X, Y, U, V,
                   minlength = 0.8,
                   maxlength = 1.2)
axes[1].set_title('minlength = 0.8,  maxlength = 1.2')

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

plt.show()

Matplotlib streamplot: длинна линий