Matplotlib provides a function, `streamplot`

, to create a plot of streamlines representing a vector field. The following program displays a representation of the electric field vector resulting from a multipole arrangement of charges. The multipole is selected as a power of 2 on the command line (1=dipole, 2=quadrupole, etc.)

It requires Matplotlib 1.5+ because of the choice of colormap (`plt.cm.inferno`

): this can be replaced with another (for example `plt.cm.hot`

) if using an older version of Matplotlib.

import sys import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Circle def E(q, r0, x, y): """Return the electric field vector E=(Ex,Ey) due to charge q at r0.""" den = ((x-r0[0])**2 + (y-r0[1])**2)**1.5 return q * (x - r0[0]) / den, q * (y - r0[1]) / den # Grid of x, y points nx, ny = 64, 64 x = np.linspace(-2, 2, nx) y = np.linspace(-2, 2, ny) X, Y = np.meshgrid(x, y) # Create a multipole with nq charges of alternating sign, equally spaced # on the unit circle. nq = 2**int(sys.argv[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)))) # Electric field vector, E=(Ex, Ey), as separate components 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() ax = fig.add_subplot(111) # Plot the streamlines with an appropriate colormap and arrow style color = np.log(np.sqrt(Ex**2 + Ey**2)) ax.streamplot(x, y, Ex, Ey, color=color, linewidth=1, cmap=plt.cm.inferno, density=2, arrowstyle='->', arrowsize=1.5) # Add filled circles for the charges themselves 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$') ax.set_ylabel('$y$') ax.set_xlim(-2,2) ax.set_ylim(-2,2) ax.set_aspect('equal') plt.show()

The electric field of a dipole: `$ python efield.py 1`

The electric field of an octopole: `$ python efield.py 3`

## Comments

## Stafford 10 months, 2 weeks ago

What clever program, Loved it. I had to change the 'inferno' to 'hot' as we were warned in the opening comments. Didn't

Link | Replyrealise I was using an outdated version of matplotlib.

## christian 10 months, 2 weeks ago

Thanks, Stafford – the issue of colormaps is one that exercises some people a great deal: for a good article about how awful the default colormap, jet, is, take a look here: https://jakevdp.github.io/blog/2014/10/16/how-bad-is-your-colormap/

Link | Reply## Steven Armour 1 month, 2 weeks ago

Would you be opposed to me publishing a reproduction of this example that I made with the python yt lib (http://yt-project.org/) to the yt repository examples archive? (they need non-astro examples like nothing else) I have already made a prototype of what I am purposing for my E&M class last fall and would also like you to review the photo notebook as well as the final notebook to make sure there are no errors in trying to visualize the vector field volumetrically.

Link | ReplySincerly

Steven Armour

## christian 1 month, 2 weeks ago

Not at all – you're welcome to the example and any code here you find useful. I'd be happy to take a look at the Notebook you are preparing for your EM class.

Link | ReplyBest wishes,

Christian

## New Comment