matplotlib table

A quick example is as in below.

It needs to convert all data rows in to string array to feed into the table.

The table doesn't have any cell padding so its very ugly. One way is scale the table to x1.5 to allow more space.

The table class is designed by showing data below a chart, but if you just want to show the table without a chart, simply set axis to off.


import matplotlib.pyplot as plt

data =  [

            ['       ','Freeze', 'Wind', 'Flood', 'Quake', 'Hail'],

            [ '5 year',  66386, 174296,   75131,  577908,  32015],

            ['10 year',  58230, 381139,   78045,   99308, 160454],

            ['20 year',  89135,  80552,  152558,  497981, 603535],

            ['30 year',  78415,  81858,  150656,  193263,  69638],

            ['40 year', 139361, 331509,  343164,  781380,  52269],

        ]


cell_text = []

for row in data:

    cell_text.append([str(x) for x in row])

plt.figure()

the_table = plt.table(cellText=cell_text, loc='center')

the_table.scale(1, 1.5)

plt.axis('off')

plt.show()


A good full example of using matplotlib table https://towardsdatascience.com/simple-little-tables-with-matplotlib-9780ef5d0bc4

import numpy as np

import matplotlib.pyplot as plt

title_text = 'Loss by Disaster'

footer_text = 'June 24, 2020'

fig_background_color = 'skyblue'

fig_border = 'steelblue'

data =  [

            [         'Freeze', 'Wind', 'Flood', 'Quake', 'Hail'],

            [ '5 year',  66386, 174296,   75131,  577908,  32015],

            ['10 year',  58230, 381139,   78045,   99308, 160454],

            ['20 year',  89135,  80552,  152558,  497981, 603535],

            ['30 year',  78415,  81858,  150656,  193263,  69638],

            ['40 year', 139361, 331509,  343164,  781380,  52269],

        ]

# Pop the headers from the data array

column_headers = data.pop(0)

row_headers = [x.pop(0) for x in data]

# Table data needs to be non-numeric text. Format the data

# while I'm at it.

cell_text = []

for row in data:

    cell_text.append([f'{x/1000:1.1f}' for x in row])

# Get some lists of color specs for row and column headers

rcolors = plt.cm.BuPu(np.full(len(row_headers), 0.1))

ccolors = plt.cm.BuPu(np.full(len(column_headers), 0.1))

# Create the figure. Setting a small pad on tight_layout

# seems to better regulate white space. Sometimes experimenting

# with an explicit figsize here can produce better outcome.

plt.figure(linewidth=2,

           edgecolor=fig_border,

           facecolor=fig_background_color,

           tight_layout={'pad':1},

           #figsize=(5,3)

          )

# Add a table at the bottom of the axes

the_table = plt.table(cellText=cell_text,

                      rowLabels=row_headers,

                      rowColours=rcolors,

                      rowLoc='right',

                      colColours=ccolors,

                      colLabels=column_headers,

                      loc='center')

# Scaling is the only influence we have over top and bottom cell padding.

# Make the rows taller (i.e., make cell y scale larger).

the_table.scale(1, 1.5)

# Hide axes

ax = plt.gca()

ax.get_xaxis().set_visible(False)

ax.get_yaxis().set_visible(False)

# Hide axes border

plt.box(on=None)

# Add title

plt.suptitle(title_text)

# Add footer

plt.figtext(0.95, 0.05, footer_text, horizontalalignment='right', size=6, weight='light')

# Force the figure to update, so backends center objects correctly within the figure.

# Without plt.draw() here, the title will center on the axes and not the figure.

plt.draw()

# Create image. plt.savefig ignores figure edge and face colors, so map them.

fig = plt.gcf()

plt.savefig('pyplot-table-demo.png',

            #bbox='tight',

            edgecolor=fig.get_edgecolor(),

            facecolor=fig.get_facecolor(),

            dpi=150

            )