Export a Pandas dataframe as a table image

前端 未结 4 939
独厮守ぢ
独厮守ぢ 2020-11-27 02:55

Is it possible to export a Pandas dataframe as an image file? Something like df.to_png() or df.to_table().savefig(\'table.png\').

At the mo

相关标签:
4条回答
  • 2020-11-27 03:09

    If you have pdflatex and imagemagick installed, you could export the DataFrame to tex, use pdflatex to convert it to a pdf file, and then convert the pdf to png using imagemagick:

    import pandas as pd
    import numpy as np
    import subprocess
    
    df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.],
                       'c': np.tile(['a', 'b', 'c'], 2),
                       'v': np.arange(1., 7.)})
    filename = 'out.tex'
    pdffile = 'out.pdf'
    outname = 'out.png'
    
    template = r'''\documentclass[preview]{{standalone}}
    \usepackage{{booktabs}}
    \begin{{document}}
    {}
    \end{{document}}
    '''
    
    with open(filename, 'wb') as f:
        f.write(template.format(df.to_latex()))
    
    subprocess.call(['pdflatex', filename])
    subprocess.call(['convert', '-density', '300', pdffile, '-quality', '90', outname])
    

    enter image description here

    If you install phantomjs and imagemagick, you could export the DataFrame to HTML and then use phantomjs to convert the HTML to png, and imagemagick to crop the result:

    import pandas as pd
    import numpy as np
    import subprocess
    
    df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.],
                       'c': np.tile(['a', 'b', 'c'], 2),
                       'v': np.arange(1., 7.)})
    filename = '/tmp/out.html'
    outname = '/tmp/out.png'
    cropname = '/tmp/cropped.png'
    
    with open(filename, 'wb') as f:
        f.write(df.to_html())
    rasterize = '/path/to/phantomjs/examples/rasterize.js'
    subprocess.call(['phantomjs', rasterize, filename, outname])
    subprocess.call(['convert', outname, '-trim', cropname])
    

    enter image description here

    0 讨论(0)
  • 2020-11-27 03:12

    With some additional code, you can even make output look decent:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import six
    
    df = pd.DataFrame()
    df['date'] = ['2016-04-01', '2016-04-02', '2016-04-03']
    df['calories'] = [2200, 2100, 1500]
    df['sleep hours'] = [2200, 2100, 1500]
    df['gym'] = [True, False, False]
    
    
    def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14,
                         header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='w',
                         bbox=[0, 0, 1, 1], header_columns=0,
                         ax=None, **kwargs):
        if ax is None:
            size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height])
            fig, ax = plt.subplots(figsize=size)
            ax.axis('off')
    
        mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=data.columns, **kwargs)
    
        mpl_table.auto_set_font_size(False)
        mpl_table.set_fontsize(font_size)
    
        for k, cell in  six.iteritems(mpl_table._cells):
            cell.set_edgecolor(edge_color)
            if k[0] == 0 or k[1] < header_columns:
                cell.set_text_props(weight='bold', color='w')
                cell.set_facecolor(header_color)
            else:
                cell.set_facecolor(row_colors[k[0]%len(row_colors) ])
        return ax
    
    render_mpl_table(df, header_columns=0, col_width=2.0)
    

    0 讨论(0)
  • 2020-11-27 03:21

    https://matplotlib.org/3.3.1/gallery/misc/table_demo.html#sphx-glr-gallery-misc-table-demo-py

    You can use matplotlib.pyplot.table

    0 讨论(0)
  • 2020-11-27 03:23

    I had the same requirement for a project I am doing. But none of the answers came elegant to my requirement. Here is something which finally helped me, and might be useful for this case:

    from bokeh.io import export_png, export_svgs
    from bokeh.models import ColumnDataSource, DataTable, TableColumn
    
    def save_df_as_image(df, path):
        source = ColumnDataSource(df)
        df_columns = [df.index.name]
        df_columns.extend(df.columns.values)
        columns_for_table=[]
        for column in df_columns:
            columns_for_table.append(TableColumn(field=column, title=column))
    
        data_table = DataTable(source=source, columns=columns_for_table,height_policy="auto",width_policy="auto",index_position=None)
        export_png(data_table, filename = path)
    

    0 讨论(0)
提交回复
热议问题