PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts.
It provides a Figure constructor class Waffle
, which could be passed to matplotlib.pyplot.figure and generate a matplotlib Figure object.
For more information, please visit:
PyPI Page: https://pypi.org/project/pywaffle/
Documentation: http://pywaffle.readthedocs.io/
pip install pywaffle
- Python 3.5+
- Matplotlib
import matplotlib.pyplot as plt
from pywaffle import Waffle
fig = plt.figure(
FigureClass=Waffle,
rows=5,
columns=10,
values=[48, 46, 6],
figsize=(5, 3) # figsize is a parameter of matplotlib.pyplot.figure
)
plt.show()
Note that the values are scaled to 24, 23 and 3 to fit 5 * 10 chart size.
data = {'Democratic': 48, 'Republican': 46, 'Libertarian': 3}
fig = plt.figure(
FigureClass=Waffle,
rows=5,
values=data,
legend={'loc': 'upper left', 'bbox_to_anchor': (1.1, 1)}
)
plt.show()
In this example, we set columns
to empty, then PyWaffle would use the absolute value in values
as block number and calculate rows automatically. Similarly, rows
could also be optional if columns
is passed.
If values
is a dict, its keys are used as labels.
data = {'Democratic': 48, 'Republican': 46, 'Libertarian': 3}
fig = plt.figure(
FigureClass=Waffle,
rows=5,
values=data,
colors=("#983D3D", "#232066", "#DCB732"),
title={'label': 'Vote Percentage in 2016 US Presidential Election', 'loc': 'left'},
labels=["{0} ({1}%)".format(k, v) for k, v in data.items()],
legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
starting_location='NW'
)
fig.set_facecolor('#EEEEEE')
plt.show()
It is now clear to see that there are 3% votes to other parties/candidates.
data = {'Democratic': 48, 'Republican': 46, 'Libertarian': 3}
fig = plt.figure(
FigureClass=Waffle,
rows=5,
values=data,
colors=("#232066", "#983D3D", "#DCB732"),
legend={'loc': 'upper left', 'bbox_to_anchor': (1, 1)},
icons='child',
font_size=12,
icon_legend=True
)
PyWaffle supports Font Awesome icons in the chart.
import pandas as pd
data = pd.DataFrame(
{
'labels': ['Hillary Clinton', 'Donald Trump', 'Others'],
'Virginia': [1981473, 1769443, 233715],
'Maryland': [1677928, 943169, 160349],
'West Virginia': [188794, 489371, 36258],
},
).set_index('labels')
# A glance of the data:
# Maryland Virginia West Virginia
# labels
# Hillary Clinton 1677928 1981473 188794
# Donald Trump 943169 1769443 489371
# Others 160349 233715 36258
fig = plt.figure(
FigureClass=Waffle,
plots={
'311': {
'values': data['Virginia'] / 30000,
'labels': ["{0} ({1})".format(n, v) for n, v in data['Virginia'].items()],
'legend': {'loc': 'upper left', 'bbox_to_anchor': (1.05, 1), 'fontsize': 8},
'title': {'label': '2016 Virginia Presidential Election Results', 'loc': 'left'}
},
'312': {
'values': data['Maryland'] / 30000,
'labels': ["{0} ({1})".format(n, v) for n, v in data['Maryland'].items()],
'legend': {'loc': 'upper left', 'bbox_to_anchor': (1.2, 1), 'fontsize': 8},
'title': {'label': '2016 Maryland Presidential Election Results', 'loc': 'left'}
},
'313': {
'values': data['West Virginia'] / 30000,
'labels': ["{0} ({1})".format(n, v) for n, v in data['West Virginia'].items()],
'legend': {'loc': 'upper left', 'bbox_to_anchor': (1.3, 1), 'fontsize': 8},
'title': {'label': '2016 West Virginia Presidential Election Results', 'loc': 'left'}
},
},
rows=5, # shared parameter among subplots
colors=("#2196f3", "#ff5252", "#999999"), # shared parameter among subplots
figsize=(9, 5) # figsize is a parameter of plt.figure
)
In this chart, 1 block = 30000 votes.
Data source https://en.wikipedia.org/wiki/United_States_presidential_election,_2016.
Wanna try it yourself? There is Online Demo!
See CHANGELOG
- PyWaffle is under MIT license, see
LICENSE
file for the details. - The Font Awesome font is licensed under the SIL OFL 1.1: http://scripts.sil.org/OFL