Introduction

In Matplotlib is it a simple task to plot a regular polygon. A regular polygon is a plolygon with all the of equal length, this also implies that the angle between adjacent sides are all the same. Below, I’ve plotted a regular triangle, a square an an octagon. It’s a simple task as well to turn the polygon with a given angle and set the color of the edges.

The Figures

Figure 1: Twisted Polygons

The Code

The full code is available on Github, and I will go through the core here.

First, we need to import some libraries:

import matplotlib.pyplot as plt # For all kind of plotting
import matplotlib.patches as mpatches # For plotting the ploygons
import matplotlib as mpl # For turning the polygons
import numpy as np # For linspace

Then we need to create the figure and the ax (this topic on StackOverflow is about subplot)

fig, ax = plt.subplots(
	1, 1, # Just 1x1 grid in this example
	figsize=(5, 5), 
	dpi=100)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)

Now, we add the polygon with some parameters:

polyParams = {
	'facecolor':'none', # The fill color
	'edgecolor': [0.5, 0, 0.5, 0.75], # red, green, blue, opacity, values between 0 and 1
	'numVertices':5, # Number of vertices
	'radius':1,
	'xy':(0,0) # The center of polygon
}

polygon = mpatches.RegularPolygon(**polyParams)

# We may also specify a rotation in params ('orientation'), but we will
# do it in another way below.

# Rotate and add the polygon to the ax
rotationParams = {
	'x':0,
	'y':0,
	'degrees':45
}

transform = mpl.transforms.Affine2D().rotate_deg_around(**rotationParams)

ax.add_patch(polygon)
polygon.set_transform(transform+ax.transData)

# Hide the axis
plt.axis('off')

# And set the aspect ratio to equal (e.g. a circle looks like a circle)
ax.set_aspect('equal')

# Save and show the figure, if you like
# fig.savefig('polygons.png', bbox_inches='tight')
plt.show()

This is the code to handle and show a regular polygon (a pentagon in this case), I think its pretty straight forward.

The rotation could been done easier with the orientation parameter in polyParams, but there are much more things that can be done with the transform.Affine2D() method. For example scaling, skewing and transslation of the patch, se reference here.

The difference between the above code sample and the code producing a chart of multiple polygons is just a matter of dimensions. I was astonished of the beautiful interference patterns (and other patterns) the polygons of various sizes and orientations may result in.