In this chapter, we will cover the following recipes:
Installing matplotlib, NumPy, and SciPy
Installing virtualenv and virtualenvwrapper
Installing matplotlib on Mac OS X
Installing matplotlib on Windows
Installing Python Imaging Library (PIL) for image processing
Installing a requests module
Customizing matplotlib's parameters in code
Customizing matplotlib's parameters per project
This chapter introduces the reader to the essential tooling and installation and configuration of them. This is a necessary work and common base for the rest of the book. If you have never used Python for data and image processing and visualization, it is advised not to skip this chapter. Even if you do skip it, you can always return to this chapter in case you need to install some supporting tool or verify what version you need to support the current solution.
We assume that you already have Linux (preferably Debian/Ubuntu or RedHat/SciLinux) installed and Python installed on it. Usually, Python is already installed on the mentioned Linux distributions and, if not, it is easily installable through standard means. We assume that Python 2.7+ Version is installed on your workstation.
Almost all code should work with Python 3.3+ Versions, but because most operating systems still deliver Python 2.7 (some even Python 2.6) we decided to write the Python 2.7 Version code. The differences are small, mainly in version of packages and some code (xrange should be substituted with range in Python 3.3+).
We also assume that you know how to use your OS package manager in order to install software packages and know how to use a terminal.
Build requirements must be satisfied before matplotlib can be built.
Install NumPy (at least 1.4+, or 1.5+ if you want to use it with Python 3) from http://www.numpy.org/.
NumPy will provide us with data structures and mathematical functions for using it with large datasets. Python's default data structures such as tuples, lists, or dictionaries are great for insertions, deletions, and concatenation. NumPy's data structures support "vectorized" operations and are very efficient for use and for executions. They are implemented with Big Data in mind and rely on C implementations that allow efficient execution time.
SciPy, building on top of NumPy, is the de facto standard's scientific and numeric toolkit for Python comprising great selection of special functions and algorithms, most of them actually implemented in C and Fortran, coming from the well-known Netlib repository (see http://www.netlib.org).
Perform the following steps for installing NumPy:
Install Python-NumPy package:
$ sudo apt-get install python-numpy
Check the installed version:
$ python -c 'import numpy; print numpy.__version__'
Install the required libraries:
If you are using RedHat or variation of this distribution (Fedora, SciLinux, or CentOS) you can use yum to perform same installation:
$ su -c 'yum-builddep python-matplotlib'
There are many ways one can install matplotlib and its dependencies: from source, from precompiled binaries, from OS package manager, and with prepackaged python distributions with built-in matplotlib.
# in your terminal, type: $ sudo apt-get install python-numpy python-matplotlib python-scipy
If you want to be on the bleeding edge, the best option is to install from source. This path comprises a few steps: Get the source, build requirements, and configure, compile, and install.
Download the latest source from code host www.github.com by following these steps:
$ cd ~/Downloads/ $ wget https://github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.tar.gz $ tar xzf matplotlib-1.2.0.tar.gz $ cd matplotlib-1.2.0 $ python setup.py build $ sudo python setup.py install
We use standard Python Distribution Utilities, known as Distutils, to install matplotlib from source code. This procedure requires us to previously install dependencies, as we already explained in the Getting ready section of this recipe. The dependencies are installed using the standard Linux packaging tools.
No matter what project you are working on, we recommend installing IPython—an Interactive Python shell that supports PyLab mode where you already have matplotlib and related packages, such as NumPy and SciPy, imported and ready to play with! Please refer to IPython's official site on how to install it and use it—it is, though, very straightforward.
If you are working on many projects simultaneously, or even just switching between them frequently, you'll find that having everything installed system-wide is not the best option and can bring problems in future on different systems (production) where you want to run your software. This is not a good time to find out that you are missing a certain package or have versioning conflicts between packages that are already installed on production system; hence, virtualenv.
For example, you inherited legacy Django website based on Django 1.1 and Python 2.3, but at the same time you are working on a new project that must be written in Python 2.6. This is my usual case—having more than one required Python version (and related packages) depending on the project I am working on.
virtualenv enables me to easily switch to different environments and have the same package easily reproduced if I need to switch to another machine or to deploy software to a production server (or to a client's workstation).
To install virtualenv, you must have workable installation of Python and pip. Pip is a tool for installing and managing Python packages, and it is a replacement for easy install. We will use pip through most of this book for package management. Pip is easily installed, as root executes the following line in your terminal:
# easy_install pip
virtualenv by itself is really useful, but with the help of virtualenvwrapper, all this becomes easy to do and also easy to organize many virtual environments. See all the features at http://virtualenvwrapper.readthedocs.org/en/latest/#features.
Install virtualenv and virtualenvwrapper:
$ sudo pip virtualenv $ sudo pip virtualenvwrapper # Create folder to hold all our virtual environments and export the path to it. $ export VIRTENV=~/.virtualenvs $ mkdir -p $VIRTENV # We source (ie. execute) shell script to activate the wrappers $ source /usr/local/bin/virtualenvwrapper.sh # And create our first virtual environment $ mkvirtualenv virt1
You can now install our favorite package inside
(virt1)user1:~$ pip install matplotlib
You will probably want to add the following line to your
The easiest way to get matplotlib on Mac OS X is to use prepackaged python distributions such as Enthought Python Distribution (EPD). Just go to the EPD site and download and install the latest stable version for your OS.
In case you are not satisfied with EPD or cannot use it for other reasons such as versions distributed with it, there is a manual (read: harder) way of installing Python, matplotlib, and its dependencies.
We will use the Homebrew project that eases installation of all software that Apple did not install on your OS, including Python and matplotlib. Under the hood, Homebrew is a set of Ruby and Git that automate download and installation. Following these instructions should get the installation working. First, we will install Homebrew, and then Python, followed by tools such as virtualenv, then dependencies for matplotlib (NumPy and SciPy), and finally matplotlib. Hold on, here we go.
In your Terminal paste and execute the following command:
ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
After the command finishes, try running brew update or brew doctor to verify that installation is working properly.
Next, add the Homebrew directory to your system path, so the packages you install using Homebrew have greater priority than other versions. Open
/Users/[your-user-name]/.bash_profile) and add the following line to the end of file:
You will need to restart the terminal so it picks a new path. Installing Python is as easy as firing up another one-liner:
brew install python --framework --universal
This will also install any prerequisites required by Python.
Now, you need to update your path (add to the same line):
To verify that installation worked, type
python --versionat the command line, you should see
2.7.3as the version number in the response.
You should have pip installed by now. In case it is not installed, use
easy_installto add pip:
$ easy_install pip
Now, it's easy to install any required package; for example, virtualenv and virtualenvwrapper are useful:
pip install virtualenv pip install virtualenvwrapper
Next step is what we really wanted to do all along—install matplotlib:
pip install numpy brew install gfortran pip install scipy
import numpy print numpy.__version__ import scipy print scipy.__version__ quit()
pip install matplotlib
There are two ways of installing matplotlib on Windows. The easier way is by installing prepackaged Python environments such as EPD, Anaconda and Python(x,y). This is the suggested way to install Python, especially for beginners.
The second way is to install everything using binaries of precompiled matplotlib and required dependencies. This is more difficult as you have to be careful about the versions of NumPy and SciPy you are installing, as not every version is compatible with the latest version of matplotlib binaries. The advantage in this is that you can even compile your particular versions of matplotlib or any library as to have the latest features, even if they are not provided by authors.
The suggested way of installing free or commercial Python scientific distributions is as easy as following the steps provided on the project's website.
If you just want to start using matplotlib and don't want to be bothered with Python versions and dependencies, you may want to consider using the Enthought Python Distribution (EPD). EPD contains prepackaged libraries required to work with matplotlib and all the required dependencies (SciPy, NumPy, IPython, and more).
As usual, we download Windows Installer (
*.exe) that will install all the code we need to start using matplotlib and all recipes from this book.
There is also a free scientific project Python(x,y) (http://code.google.com/p/pythonxy/) for Windows 32-bit system that contains all dependencies resolved, and is an easy (and free!) way of installing matplotlib on Windows. Because Python(x,y) is compatible with Python modules installers, it can be easily extended with other Python libraries. No Python installation should be present on the system before installing Python(x,y).
Let me shortly explain how we would install matplotlib using precompiled Python, NumPy, SciPy, and matplotlib binaries. First, we download and install standard Python using official MSI Installer for our platform (x86 or x86-64). After that, download official binaries for NumPy and SciPy and install them first. When you are sure that NumPy and SciPy are properly installed, then we download the latest stable release binary for matplotlib and install it by following the official instructions.
Some popular features of PIL are fast access to data, point operations, filtering, image resizing, rotation, and arbitrary affine transforms. For example, the histogram method allows us to get statistics about the images.
PIL can also be used for other purposes, such as batch processing, image archiving, creating thumbnails, conversion between image formats, and printing images.
PIL reads a large number of formats, while write support is (intentionally) restricted to the most commonly used interchange and presentation formats.
$ sudo apt-get build-dep python-imaging $ sudo pip install http://effbot.org/downloads/Imaging-1.1.7.tar.gz
# yum install python-imaging # yum install freetype-devel # pip install PIL
There is a good online handbook, specifically, for PIL. You can read it at http://www.pythonware.com/library/pil/handbook/index.htm, or download the PDF version from http://www.pythonware.com/media/data/pil-handbook.pdf.
There is also a PIL fork, Pillow, whose main aim is to fix installation issues. Pillow can be found at http://pypi.python.org/pypi/Pillow and it is easy to install.
On Windows, PIL can also be installed using a binary installation file. Install PIL in your Python site-packages by executing
.exe from http://www.pythonware.com/products/pil/.
Now, if you want PIL used in virtual environment, manually copy the
PIL.pth file and the PIL directory at
C:\Python27\Lib\site-packages to your virtualenv site-packages directory.
Most of the data that we need now is available over HTTP or similar protocol, so we need something to get it. Python library requests makes that job easy.
Requests module brings new API that makes the use of web services seamless and pain free. Lot of the HTTP 1.1 stuff is hidden away and exposed only if you need it to behave differently than default.
Using pip is the best way to install requests. Use the following command for the same:
$ pip install requests
That's it. This can also be done inside your virtualenv if you don't need requests for every project or want to support different requests versions for each project.
Just to get you ahead quickly, here's a small example on how to use requests:
import requests r = requests.get('http://github.com/timeline.json') print r.content
We sent the
GET HTTP request to a URI at www.github.com that returns a JSON-formatted timeline of activity on GitHub (you can see HTML version of that timeline at https://github.com/timeline). After response is successfully read, the
r object contains content and other properties of the response (response code, cookies set, header metadata, even the request we sent in order to get this response).
The Library we will use the most throughout this book is matplotlib; it provides the plotting capabilities. Default values for most properties are already set inside the configuration file for matplotlib, called
.rc file. This recipe describes how to modify matplotlib properties from our application code.
As we already said, matplotlib configuration is read from a configuration file. This file provides a place to set up permanent default values for certain matplotlib properties, well, for almost everything in matplotlib.
There are two ways to change parameters during code execution: using the dictionary of parameters (
rcParams) or calling the
matplotlib.rc() command. The former enables us to load already existing dictionary into
rcParams, while the latter enables a call to a function using tuple of keyword arguments.
If we want to restore the dynamically changed parameters, we can use
matplotlib.rcdefaults() call to restore the standard matplotlib settings.
The following two code samples illustrate previously explained behaviors:
import matplotlib as mp mpl.rcParams['lines.linewidth'] = 2 mpl.rcParams['lines.color'] = 'r'
Example for the
import matplotlib as mpl mpl.rc('lines', linewidth=2, color='r')
Both examples are semantically the same. In the second sample, we define that all subsequent plots will have lines with line width of 2 points. The last statement of the previous code defines that the color of every line following this statement will be red, unless we override it by local settings. See the following example:
import matplotlib.pyplot as plt import numpy as np t = np.arange(0.0, 1.0, 0.01) s = np.sin(2 * np.pi * t) # make line red plt.rcParams['lines.color'] = 'r' plt.plot(t,s) c = np.cos(2 * np.pi * t) # make line thick plt.rcParams['lines.linewidth'] = '3 plt.plot(t,c) plt.show()
Next, we go to the second graph (cosine function), and explicitly set line width to 3 points using
plt.rcParams['lines.linewidth'] = '3'.
If we want to reset specific settings, we should call
If you don't want to configure matplotlib as the first step in your code every time you use it (as we did in the previous recipe), this recipe will explain how to have different default configurations of matplotlib for different projects. This way your code will not be cluttered with configuration data and, moreover, you can easily share configuration templates with your co-workers or even among other projects.
If you have a working project that always uses the same settings for certain parameters in matplotlib, you probably don't want to set them every time you want to add a new graph code. Instead, what you want is a permanent file, outside of your code, which sets defaults for matplotlib parameters.
Current working directory: This is where your code runs from. This is the place to customize matplotlib just for your current directory that might contain your current project code. File is named
Per user .matplotlib/matplotlibrc: This is usually in user's
$HOMEdirectory (under Windows, this is your
Documents and Settingsdirectory). You can find out where your configuration directory is using the
matplotlib.get_configdir()command. Check the next command.
Per installation configuration file: This is usually in your python site-packages. This is a system-wide configuration, but it will get overwritten every time you reinstall matplotlib; so it is better to use per user configuration file for more persistent customizations. Best usage so far for me was to use this as a default template if I mess up my user's configuration file or if I need fresh configuration to customize for a different project.
The following one-liner will print the location of your configuration directory and can be run from shell.
$ python -c 'import matplotlib as mpl; print mpl.get_configdir()'
axes: Deals with face and edge color, tick sizes, and grid display.
backend: Sets the target output:
figure: Deals with dpi, edge color, figure size, and subplot settings.
font: Looks at font families, font size, and style settings.
grid: Deals with grid color and line settings.
legend: Specifies how legends and text inside will be displayed.
lines: It checks for line (color, style, width, and so on) and markers settings.
patch: Patches are graphical objects that fill 2D space, such as polygons and circles; set linewidth, color, antialiasing, and so on.
verbose: It checks how much information matplotlib gives during runtime: silent, helpful, debug, and debug-annoying.
yticks: These set the color, size, direction, and labelsize for major and minor ticks for x and y axes.
If you are interested in more details for every mentioned setting (and some that we did not mention here), the best place to go is the website of matplotlib project where there is up-to-date API documentation. If it doesn't help, user and development lists are always good places to leave questions. See the back of this book for useful online resources.