Seeing mangled images with matplotlib + multiprocessing

Here is a gist that I thought would demonstrate the mangled images when running matplotlib + multiprocessing. However, it works fine when run with both.

#!/usr/bin/env python3

"""
This demonstrates that a bunch of images I create here look ruined when I run with multiprocessing, but look fine when run in parallel.

serial   100 images: run ./demonstration_borked_images.py -N 100
parallel 100 images: run ./demonstration_borked_images.py -N 100 -M
"""

import os, sys, numpy, glob, time
from multiprocessing import Pool, cpu_count
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
from argparse import ArgumentParser

def create_demo_image( imageno ):
    assert( isinstance( imageno, int ) )
    assert( imageno >= 0 )
    fig = Figure( figsize = ( 8 * 1.5, 6 * 1.5 ) )
    ax = fig.add_subplot(111)
    xyvals = numpy.random.random_sample( ( 300, 3 ) )
    ax.scatter( xyvals[:,0], xyvals[:,1], c = xyvals[:,2], s = 20 )
    ax.set_xlabel( 'X VALUES', fontsize = 14, fontweight = 'bold' )
    ax.set_ylabel( 'Y VALUES', fontsize = 14, fontweight = 'bold' )
    ax.set_title( 'IMAGE NUMBER %04d' % imageno )
    canvas = FigureCanvasAgg(fig)
    canvas.print_figure( 'figure_%04d.png' % imageno, bbox_inches = 'tight' )

if __name__ == '__main__':
    parser = ArgumentParser( )
    parser.add_argument( '-N', '--num', type=int, dest='num', action='store', default = 10,
                        help = 'Number of images to draw. Default is 10.' )
    parser.add_argument( '-M', dest='do_multi', action='store_true', default = False,
                        help = ' '.join(
                            [
                             'If chosen, then create these images in parallel using multiprocessing.',
                             'Default is to create images in serial.' ]))
    args = parser.parse_args( )
    assert( args.num > 0 )
    time0 = time.time( )
    if not args.do_multi:
        _ = list( map( create_demo_image, range( args.num ) ) )
    else:
        with Pool( processes = cpu_count( ) ) as pool:
            _ = list( pool.map( create_demo_image, range( args.num ) ) )
    #
    ## how long to run
    print( 'took %0.3f seconds to process %02d images.' % (
        time.time( ) - time0, args.num ) )