# plotting a Gauge with python and matplotlib

Nicolas Fauchereau

Friday 10 Oct. 2014

### imports

``````

In [12]:

%matplotlib inline

``````
``````

In [13]:

import matplotlib
from matplotlib import cm
from matplotlib import pyplot as plt
import numpy as np

``````
``````

In [14]:

from matplotlib.patches import Circle, Wedge, Rectangle

``````

### some function definitions

``````

In [15]:

def degree_range(n):
start = np.linspace(0,180,n+1, endpoint=True)[0:-1]
end = np.linspace(0,180,n+1, endpoint=True)[1::]
mid_points = start + ((end-start)/2.)
return np.c_[start, end], mid_points

``````
``````

In [16]:

def rot_text(ang):
return rotation

``````

### main gauge function

``````

In [17]:

def gauge(N=5, labels=['LOW','MEDIUM','HIGH','VERY HIGH','EXTREME'], colors='jet_r', cat=1, title='', fname='./meter.png'):

"""
some sanity checks first

"""

if len(labels) != N:
print("number of labels not equal to number of categories\n")

"""
if colors is a string, we assume it's a matplotlib colormap
and we discretize
"""

if isinstance(colors, str):
cmap = cm.get_cmap(colors, N)
cmap = cmap(np.arange(N))
colors = cmap[::-1,:].tolist()
if isinstance(colors, list):
if len(colors) == N:
colors = colors[::-1]
else:
print("number of colors not equal to number of categories\n")

"""
begins the plotting
"""

fig, ax = plt.subplots()

ang_range, mid_points = degree_range(N)

labels = labels[::-1]

"""
plots the sectors and the arcs
"""
patches = []
for ang, c in zip(ang_range, colors):
# sectors
patches.append(Wedge((0.,0.), .4, *ang, facecolor='w', lw=2))
# arcs
patches.append(Wedge((0.,0.), .4, *ang, width=0.10, facecolor=c, lw=2, alpha=0.5))

"""
set the labels (e.g. 'LOW','MEDIUM',...)
"""

for mid, lab in zip(mid_points, labels):

horizontalalignment='center', verticalalignment='center', fontsize=14, \
fontweight='bold', rotation = rot_text(mid))

"""
set the bottom banner and the title
"""
r = Rectangle((-0.4,-0.1),0.8,0.1, facecolor='w', lw=2)

ax.text(0, -0.05, title, horizontalalignment='center', \
verticalalignment='center', fontsize=22, fontweight='bold')

"""
plots the arrow now
"""

pos = mid_points[abs(cat - N)]

"""
removes frame and ticks, and makes axis equal and tight
"""

ax.set_frame_on(False)
ax.axes.set_xticks([])
ax.axes.set_yticks([])
ax.axis('equal')
plt.tight_layout()
fig.savefig(fname, dpi=200)

``````

### testing

``````

In [18]:

gauge(N=5, labels=['LOW','MEDIUM','HIGH','VERY HIGH','EXTREME'], colors='jet_r', cat=5, title='scary thing here', fname='./gauge.png')

``````
``````

``````