Search code examples
pythonmatplotlibmetadata

Can matplotlib add metadata to saved figures?


I want to be able to ascertain the provenance of the figures I create using matplotlib, i.e. to know which version of my code and data created these figures. (See this essay for more on provenance.)

I imagine the most straightforward approach would be to add the revision numbers of the code and data to the metadata of the saved figures, or as comments in a postscript file for example.

Is there any easy way to do this in Matplotlib? The savefig function doesn't seem to be capable of this but has someone come up with a workable solution?


Solution

  • I don't know of a way using matplotlib, but you can add metadata to png's with PIL:

    f = "test.png"
    METADATA = {"version":"1.0", "OP":"ihuston"}
    
    # Create a sample image
    import pylab as plt
    import numpy as np
    X = np.random.random((50,50))
    plt.imshow(X)
    plt.savefig(f)
    
    # Use PIL to save some image metadata
    from PIL import Image
    from PIL import PngImagePlugin
    
    im = Image.open(f)
    meta = PngImagePlugin.PngInfo()
    
    for x in METADATA:
        meta.add_text(x, METADATA[x])
    im.save(f, "png", pnginfo=meta)
    
    im2 = Image.open(f)
    print im2.info
    

    This gives:

    {'version': '1.0', 'OP': 'ihuston'}