Search code examples
pythonmatplotlibpandasipythoncanopy

Save the "Out[]" table of a pandas dataframe as a figure


This may seem to be a useless feature but it would be very helpful for me. I would like to save the output I get inside Canopy IDE. I would not think this is specific to Canopy but for the sake of clarity that is what I use. For example, my console Out[2] is what I would want from this:

enter image description here

I think that the formatting is quite nice and to reproduce this each time instead of just saving the output would be a waste of time. So my question is, how can I get a handle on this figure? Ideally the implimentation would be similar to standard methods, such that it could be done like this:

from matplotlib.backends.backend_pdf import PdfPages

pp = PdfPages('Output.pdf')
fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1)
df.plot(how='table')
pp.savefig()
pp.close()

NOTE: I realize that a very similar question has been asked before ( How to save the Pandas dataframe/series data as a figure? ) but it never received an answer and I think I have stated the question more clearly.


Solution

  • Here is a somewhat hackish solution but it gets the job done. You wanted a .pdf but you get a bonus .png. :)

    import numpy as np
    import pandas as pd
    from matplotlib.backends.backend_pdf import PdfPages
    import matplotlib.pyplot as plt
    
    from PySide.QtGui import QImage
    from PySide.QtGui import QPainter
    from PySide.QtCore import QSize
    from PySide.QtWebKit import QWebPage
    
    arrays = [np.hstack([ ['one']*3, ['two']*3]), ['Dog', 'Bird', 'Cat']*2]
    columns = pd.MultiIndex.from_arrays(arrays, names=['foo', 'bar'])
    df =pd.DataFrame(np.zeros((3,6)),columns=columns,index=pd.date_range('20000103',periods=3))
    
    h = "<!DOCTYPE html> <html> <body> <p> " + df.to_html() + " </p> </body> </html>";
    page = QWebPage()
    page.setViewportSize(QSize(5000,5000))
    
    frame = page.mainFrame()
    frame.setHtml(h, "text/html")
    
    img = QImage(1000,700, QImage.Format(5))
    painter = QPainter(img)
    frame.render(painter)
    painter.end()
    a = img.save("html.png")
    
    pp = PdfPages('html.pdf')
    fig = plt.figure(figsize=(8,6),dpi=1080) 
    ax = fig.add_subplot(1, 1, 1)
    img2 = plt.imread("html.png")
    plt.axis('off')
    ax.imshow(img2)
    pp.savefig()
    pp.close()
    

    Edits welcome.