Stream plot is basically a type of 2D plot used majorly by physicists to show fluid flow and 2D field gradients .The basic function to create a stream plot in Matplotlib is:
ax.streamplot(x_grid, y_grid, x_vec, y_vec, density=spacing)
Here x_grid and y_grid are arrays of the x and y points.The x_vec and y_vec represent the stream velocity of each point present on the grid.The attribute #density=spacing# specify that how much close the streamlines are to be drawn together.
Creating stream plot –
Let’s start by creating a simple stream plot that contains streamlines on a 10 by 10 grid.All the streamlines are parallel and pointing towards the right.The code below creates the stream plot containing horizontal parallel lines pointing to the right:
Python3
import numpy as np
import matplotlib.pyplot as plt
x = np.arange( 0 , 10 )
y = np.arange( 0 , 10 )
X, Y = np.meshgrid(x, y)
u = np.ones(( 10 , 10 ))
v = np.zeros(( 10 , 10 ))
fig = plt.figure(figsize = ( 12 , 7 ))
plt.streamplot(X, Y, u, v, density = 0.5 )
plt.show()
|
Output:

Here, x and y are 1D arrays on an evenly spaced grid, u and v are 2D arrays of velocities of x and y where the number of rows should match with the length of y while the number of columns should match with x, density is a float value which controls the closeness of the stream lines.
Customization of stream plot –
With the help of streamplot() function we can create and customize a plot showing field lines based on defined 2D vector field. Many attributes are available in streamplot() function for the modification of the plots.
Python3
import numpy as np
import matplotlib.pyplot as plt
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 12 , 7 ))
plt.streamplot(X, Y, U, V, density = 1 )
plt.show()
|
Output:

Some of the customization of the above graph are listed below:
Varying the density of streamlines –
Python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 24 , 20 ))
gs = gridspec.GridSpec(nrows = 3 , ncols = 2 ,
height_ratios = [ 1 , 1 , 2 ])
ax = fig.add_subplot(gs[ 0 , 0 ])
ax.streamplot(X, Y, U, V,
density = [ 0.4 , 0.8 ])
ax.set_title( 'Varying the density along a streamline' )
plt.tight_layout()
plt.show()
|
Output:

Varying the color along a streamline –
Python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 24 , 20 ))
gs = gridspec.GridSpec(nrows = 3 , ncols = 2 ,
height_ratios = [ 1 , 1 , 2 ])
ax = fig.add_subplot(gs[ 0 , 1 ])
strm = ax.streamplot(X, Y, U, V, color = U,
linewidth = 2 , cmap = 'autumn' )
fig.colorbar(strm.lines)
ax.set_title( 'Varying the color along a streamline.' )
plt.tight_layout()
plt.show()
|
Output:

Varying the line width along a streamline –
Python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 24 , 20 ))
gs = gridspec.GridSpec(nrows = 3 , ncols = 2 ,
height_ratios = [ 1 , 1 , 2 ])
ax = fig.add_subplot(gs[ 1 , 0 ])
lw = 5 * speed / speed. max ()
ax.streamplot(X, Y, U, V, density = 0.6 ,
color = 'k' , linewidth = lw)
ax.set_title( 'Varying line width along a streamline' )
plt.tight_layout()
plt.show()
|
Output:

Controlling the starting points of streamlines –
Python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 24 , 20 ))
gs = gridspec.GridSpec(nrows = 3 , ncols = 2 ,
height_ratios = [ 1 , 1 , 2 ])
seek_points = np.array([[ - 2 , - 1 , 0 , 1 , 2 , - 1 ],
[ - 2 , - 1 , 0 , 1 , 2 , 2 ]])
ax = fig.add_subplot(gs[ 1 , 1 ])
strm = ax.streamplot(X, Y, U, V, color = U,
linewidth = 2 ,
cmap = 'autumn' ,
start_points = seek_points.T)
fig.colorbar(strm.lines)
ax.set_title('Controlling the starting\
points of the streamlines')
ax.plot(seek_points[ 0 ], seek_points[ 1 ], 'bo' )
ax. set (xlim = ( - w, w), ylim = ( - w, w))
plt.tight_layout()
plt.show()
|
Output:

Streamlines skipping masked regions and NaN values –
Python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
w = 3
Y, X = np.mgrid[ - w:w: 100j , - w:w: 100j ]
U = - 1 - X * * 2 + Y
V = 1 + X - Y * * 2
speed = np.sqrt(U * * 2 + V * * 2 )
fig = plt.figure(figsize = ( 20 , 16 ))
gs = gridspec.GridSpec(nrows = 3 , ncols = 2 , height_ratios = [ 1 , 1 , 2 ])
mask = np.zeros(U.shape, dtype = bool )
mask[ 40 : 60 , 40 : 60 ] = True
U[: 20 , : 20 ] = np.nan
U = np.ma.array(U, mask = mask)
ax = fig.add_subplot(gs[ 2 :, :])
ax.streamplot(X, Y, U, V, color = 'r' )
ax.set_title( 'Streamplot with Masking' )
ax.imshow(~mask, extent = ( - w, w, - w, w), alpha = 0.5 ,
interpolation = 'nearest' , cmap = 'gray' , aspect = 'auto' )
ax.set_aspect( 'equal' )
plt.tight_layout()
plt.show()
|
Output:

Example:
Stream plot to demonstrate the electric field due to two point charges.The electric field at any point on a surface depends upon the position and distance between the two charges:
Python3
import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
def E(q, r0, x, y):
den = np.hypot(x - r0[ 0 ], y - r0[ 1 ]) * * 3
return q * (x - r0[ 0 ]) / den, q * (y - r0[ 1 ]) / den
nx, ny = 64 , 64
x = np.linspace( - 2 , 2 , nx)
y = np.linspace( - 2 , 2 , ny)
X, Y = np.meshgrid(x, y)
nq = 2 * * 1
charges = []
for i in range (nq):
q = i % 2 * 2 - 1
charges.append((q, (np.cos( 2 * np.pi * i / nq),
np.sin( 2 * np.pi * i / nq))))
Ex, Ey = np.zeros((ny, nx)), np.zeros((ny, nx))
for charge in charges:
ex, ey = E( * charge, x = X, y = Y)
Ex + = ex
Ey + = ey
fig = plt.figure(figsize = ( 18 , 8 ))
ax = fig.add_subplot( 111 )
color = 2 * np.log(np.hypot(Ex, Ey))
ax.streamplot(x, y, Ex, Ey, color = color,
linewidth = 1 , cmap = plt.cm.inferno,
density = 2 , arrowstyle = '->' ,
arrowsize = 1.5 )
charge_colors = { True : '#AA0000' ,
False : '#0000AA' }
for q, pos in charges:
ax.add_artist(Circle(pos, 0.05 ,
color = charge_colors[q> 0 ]))
ax.set_xlabel( 'X-axis' )
ax.set_ylabel( 'X-axis' )
ax.set_xlim( - 2 , 2 )
ax.set_ylim( - 2 , 2 )
ax.set_aspect( 'equal' )
plt.show()
|
Output:

Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!
Last Updated :
21 Oct, 2021
Like Article
Save Article