ASTRONOMICAL DATA ANALYSIS SOFTWARE AND SYSTEMS XIV
ASP Conference Series, Vol. 347, 2005
P. L. Shopbell, M. C. Britton, and R. Ebert, eds.
matplotlib – A Portable Python Plotting Package
Paul Barrett
Space Telescope Science Institute
John Hunter
University of Chicago
J. Todd Miller, Jin-Chung Hsu, and Perry Greenfield
Space Telescope Science Institute
Abstract. matplotlib is a portable 2D plotting and imaging package aimed
primarily at visualization of scientific, engineering, and financial data. mat-
plotlib can be used interactively from the Python shell, called from python
scripts, or embedded in a GUI application (GTK, Wx, Tk, Windows). Many
popular hardcopy outputs are supported including JPEG, PNG, PostScript and
SVG. Features include the creation of multiple axes and figures per page, inter-
active navigation, many predefined line styles and symbols, images, antialiasing,
alpha blending, date and financial plots, W3C compliant font management and
FreeType2 support, legends and tables, pseudocolor plots, mathematical text
and more. It works with both numarray and Numeric. The goals of the pack-
age, basic architecture, current features (illustrated with examples), and planned
enhancements will be described.
1. Introduction
matplotlib is designed with the philosophy that you should be able to create
simple plots with just a few commands, or just one! If you want to see a
histogram of your data, you shouldn’t need to instantiate objects, call methods,
set properties, etc; it should just work.
The initial goals of matplotlib were:
• Plots should be publication quality; particularly the text (antialiased, ro-
tated, etc.).
• PostScript output for inclusion with TEX documents.
• Embeddable in a graphical user interface for application development.
• Code should be understandable.
• Making plots should be easy.
• The software is Open Source, so it can be downloaded, used, and dis-
tributed freely.
matplotlib can be used in a variety of settings. Most users are familiar with
the command-line for interactively creating plots and images. This interface
provides a simple pop-up window for displaying and manipulating the data.
However, the true power of matplotlib is the underlying plotting library, which
91
92 Barrett et al.
!#"%$'&(*),+.-0/.1*243 56*78$:9*;
( A)
Figure 1. A line plot of FITS binary table data containing 10k points.
is operating system independent and graphical user interface (GUI) agnostic. It
can be used without a GUI as part of a web server to create plots and images in
a variety of hardcopy outputs; or can be embedded in a larger application using
one of several GUIs (e.g. GTK, Tk, or WXwindows) running on one of several
OSs (e.g. Windows, OS X, Solaris, and Linux).
2. Architecture
The matplotlib code is conceptually divided into three parts:
• The matlab interface is the set of functions that allow a user to create
plots from the command line.
• The frontend or matplotlib API is the set of classes that do the heavy
lifting by creating and managing figures, text, lines, plots, etc. This is the
abstract interface that knows nothing about output.
• The backends are device dependent drawing devices or renderers that
transform the frontend representation to hardcopy (JPEG, PNG, PDF,
PS, SVG, Paint, GD) or a display device (Agg, GTK/GTKAgg, TkAgg,
WX/WXAgg). Much of the critical rendering code is written in C/C++
and therefore provides very good performance.
Agg is the Anti-Grain Graphics library that enables writing vector graphics
to a buffer, which can then be block transfered (or BLTed) to the display de-
vice. This means that all interactive implementations based on Agg avoid the
matplotlib – A Portable Python Plotting Package 93
Y%T
Y\[
Y%Z
T%X
T%W
T%V
T%U
@BA CED F0G @ CED F0GIH CJD FK A CED F @L M G K M GO M KP M @@ M I@ H GP K@ KH
<=?> =?N =?N =N =?N =?N QSR N QSR N QSR N
Figure 2. A financial plot that uses the daily high, low, and closing values
of a stock price.
graphical limitations of the GUI and render identical graphics regardless of the
GUI interface.
3. Plotting
The following Python session uses the matlab interface to create a quicklook
spectrum of FUSE data (see Figure 1).
> python
Python 2.3.3 (#1, Jan 5 2004, 16:22:13)}
[GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-113)] on linux2
Type "help", "copyright", "credits" or "license"
for more information.
>>> import pyfits
>>> fits = [Link](’[Link]’)
>>> wave = fits[1].[Link](’wave’)
>>> flux = fits[1].[Link](’flux’)
>>> from [Link] import *
>>> ylim(0, 1.5e-12)
>>> xlim(985, 1085)
>>> xlabel(r’$\lambda\ (\angstrom)$’)
<[Link] instance at 0x41118f8c>
>>> ylabel(r’Flux’)
94 Barrett et al.
u
s w
t y
v \
x w
t |
z ~
{ j
} z
z|{twvyjtw} x
c_].]
b%].]
r %a ].]
qq
op
l mn
`%].]
^_].]
]
] ^_]%] `%].] a%]%] b%]%] cS]%]
.d g
e .f j
h Ei Ei k
Figure 3. A graphic of FITS image data. Note the labeled axes and title.
<[Link] instance at 0x4112108c>
>>> title(’FUSE LiF 1A spectrum of EG And’)
<[Link] instance at 0x4112420c>
>>> plot(wave, flux)
Other available plot types are: 2-D vector plots, high-low-close plots (see
Figure 2), histogram plots, log plots, pie charts and bar charts.
4. Images
The matlab interface has two functions for displaying image data: figimage,
which will preserve the size and shape of the image; and imshow, which will
resample the image to fit the size of the figure (see Figure 3). Images can be
enhanced by annotations or graphical overlays.
5. Features
Key features that make matplotlib easy to use are:
• Integrated support for numarray or Numeric – the Python multi-dimen-
sional array libraries.
• The plot window contains a simple interactive GUI with support for pan-
and-zoom, history recall, and saving to hardcopy.
matplotlib – A Portable Python Plotting Package 95
• The command line interface is modeled after the easy to use MatLab in-
terface.
• Support for multiple plots and images per page.
• TrueType/FreeType fonts are available in the GD, Agg, Paint, and Post-
Script backends. SVG support is coming soon.
• Mathematical text ala TEX math mode is available whenever TrueType
fonts are available.
• Images are automatically resampled to the size of the figure.
• A fully object-oriented design to ease programming and development.
6. Enchancements
Enhancements to matplotlib that are expected in the near future are:
• Contour plots which can be used for image overlays.
• The ability to handle general 2-D transforms, which are useful for map
projections and world coordinate systems.
To learn more about matplotlib and to download the latest version, go to
[Link]