GR/GR3 and Matplotlib Interoperability Tutorial

Matplotlib is the tool of choice for 2D data visualization and the creation of publication-quality scientific graphics. Starting with version 0.6.0 of the GR framework Matplotlib’s capabilities can be greatly expanded, especially for dynamic or interactive plots.

In the following example it is demonstrated how different graphics modules can be combined to produce a single animated plot:

  • A histogram created with Matplotlib

  • Results of a physics simulation rendered with Mogli/GR3

  • Annotation and a simple line graph (created with GR)

import numpy as np
import matplotlib.pyplot as plt
import mogli
import gr

molecules = mogli.read('700K_460.xyz')
angles = np.load('700K_460.npy')
lens = []

gr.setregenflags(gr.MPL_POSTPONE_UPDATE)

for t in range(100):

    plt.cla()
    fig = plt.subplot(133)
    fig.xaxis.set_ticks([-100, 0, 100])
    fig.yaxis.set_ticks([])
    plt.ylim([0, 1000])
    plt.hist(angles[t], 20, normed=0, facecolor='g', alpha=0.5)
    plt.show()

    gr.setviewport(0, 0.7, 0, 0.7)
    gr.setwindow(0.1, 0.9, 0.05, 0.85)
    mogli.draw(molecules[t], bonds_param=1.15, camera=((60, 0, 0),
                                                       (0, 0, 0),
                                                       (0, 1, 0)))

    gr.settextalign(gr.TEXT_HALIGN_CENTER, gr.TEXT_VALIGN_HALF)
    gr.text(0.35, 0.7, '700K (%.1f ps)  # of bonds: %d' %
            (t / 10.0, len(angles[t])))
    lens.append(len(angles[t]))
    if t > 0:
        gr.setwindow(0, 10, 3500, 5000)
        gr.setviewport(0.1, 0.6, 0.05, 0.1)
        gr.axes(1, 0, 0, 3500, 2, 0, 0.005)
        gr.polyline(np.arange(t + 1) / 10.0, lens)

    gr.updatews()

Looking toward the future, this approach may be a significant feature enhancement for Matplotlib. There is no need to change a single line of code, neither for the Matplotlib part nor for the GR/GR3 part. The GR Matplotlib backend can be activated by setting the MPLBACKEND environment variable previous before starting Python:

% export MPLBACKEND=module://gr.matplotlib.backend_gr
% python ...

Even if you’d like to create animations no further module (like Matplotlib’s animation toolkit) or any post-processing is required. To create an MPEG video, you simply have to redirect the GR output to the movie device driver by setting the GKS_WSTYPE (= GKS workstation type) environment variable):

% export GKS_WSTYPE=mov
% python ...

To view the animation in a browser window, first start GR’s Bottle server:

% cd lib/gks/html5
% python server.py
Bottle v0.13-dev server starting up (using GeventServer())...
Listening on http://127.0.0.1:8080/
Hit Ctrl-C to quit.

Then, open the above URL (http://127.0.0.1:8080/) in a browser and start the animation with the output redirected to the GR’s HTML5 device driver:

% export MPLBACKEND=module://gr.matplotlib.backend_gr
% python -o html ...

You can then watch the animation in your browser window.