Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrap text in matplotlib table

I need to create a table using matplotlib from a list of dictionaries.

For this I use the following function, which I found in another answer on this site:

import matplotlib.pyplot as plt
from matplotlib.externals import six
import matplotlib
matplotlib.rc('font', family='Arial')

def render_mpl_table(data, col_width=3.0, row_height=2, font_size=10,
                     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', wrap=True)
            cell.set_facecolor(header_color)
        else:
            cell.set_facecolor(row_colors[k[0]%len(row_colors) ])
    return ax

The problem is that I cannot wrap the text inside a cell, even though I put the properties at cell.set_text_props(weight='bold', color='w', wrap=True).

Example image:enter image description here

Thanks for any help!

like image 382
Litwos Avatar asked Apr 07 '17 12:04

Litwos


1 Answers

If you want to apply an automatical wrap, an additional option might be the useage of textwrap at your table content outside the tables definition.

import matplotlib.pyplot as plt
import textwrap as twp
import numpy as np

#create column headers with long text and apply textwrap with \n after defined lenght
columns=[twp.fill('this is a long column header text',25), twp.fill('...and this is an even longer column header text',25)]
#create rows
rows=[1,2]
#create (stupid) content
cell_text=[[100,200],[100,200]]

#create figure with simple data (just for demo)
fig,ax=plt.subplots(1,1)
x=np.arange(100)
ax.plot(x,np.sin(x/10))
# insert table with wrapped column headers and data
table=ax.table(cellText=cell_text,
                  rowLabels=rows,
                  colLabels=columns,
                  loc='bottom',
                  bbox=[0.0,-0.3,1,.2])

#adjust format of table and plot
table.auto_set_font_size(False)
table.set_fontsize(9)
plt.subplots_adjust(left=0.2, bottom=0.1)
plt.tight_layout()

example of table with text wrap

like image 125
Aroc Avatar answered Sep 20 '22 13:09

Aroc