Matplotlib table formatting column width

23,143

Solution 1

In addition to @jma answer, I found the table method .auto_set_column_width(col=<list of col indices>) to be very helpful, especially in conjunction with .auto_set_font_size(False). Example use below:

from matplotlib import pyplot as plt
import pandas as pd
# Create some example data
data = [{"Movie": "Happy Gilmore", "Lead Actor": "Adam Sandler" , "Year": "1996", 
              "Plot": "An ice hockey star takes up golfing.", 
              "Quotes": "\"Just give it a little tappy. Tap tap taparoo.\""}]
dff = pd.DataFrame(data)
fig, ax = plt.subplots(3,1, figsize=(10,4))
tab0 = ax[0].table(cellText=dff.values, colLabels=dff.columns, loc='center', cellLoc='center')
ax[0].set_title("Default")
tab1 = ax[1].table(cellText=dff.values, colLabels=dff.columns, loc='center', cellLoc='center')
ax[1].set_title("Font AutoSize off")
tab2 = ax[2].table(cellText=dff.values, colLabels=dff.columns, loc='center', cellLoc='center')
ax[2].set_title("Column Width Auto Set, Font AutoSize off")
[a.axis("off") for a in ax]
[t.auto_set_font_size(False) for t in [tab1, tab2]]
[t.set_fontsize(8) for t in [tab1, tab2]]
tab2.auto_set_column_width(col=list(range(len(dff.columns)))) # Provide integer list of columns to adjust
plt.show()

Output

Solution 2

To set the width of the columns, use colWidths within the table function. It accepts a list of widths for each column--they can all be the same or different.

table = plt.table(cellText=cell_text, cellColours=colors[0],
          rowColours=colors[1], rowLabels=row_labels,
          colColours=colors[2], colLabels=columns,
          colWidths=[0.3 for x in columns],
          bbox=[0.0, -1.3, 1.0, 1.0], cellLoc='center')

Solution 3

Try my version of plot_table

data = [{"Movie": "Happy Gilmore", "Lead Actor": "Adam Sandler" , "Year": "1996", 
              "Plot": "An ice hockey star takes up golfing.", 
              "Quotes": "\"Just give it a little tappy. Tap tap taparoo.\""}]
df = pd.DataFrame(data)
data = np.vstack((df.columns.values, df.values.astype(str)))
plot_table(data);

Click here to get plot_table source code.

output

Share:
23,143
Justin
Author by

Justin

Updated on October 22, 2021

Comments

  • Justin
    Justin over 1 year

    I wish to format one column of a table but when iterating through the rows it appears the width of the column width changes after each iteration.

    Source Code

    def p_create_table(self, events, dates, rows, columns, portfolio):
        """
        :param events: Dict - {Date:Event} where Event is a String identifying
        what event happened
        :param dates: List - Dates of events
        :param rows: Int - number of Dates (rows) to create for the table
        :param columns: List - Column headers
        :param portfolio: Dataframe - Portfolio with calculated totals and returns
        :return:
        """
        cell_text = self.p_create_cell_text(events, dates, portfolio)
        cell_text.pop(0)
        row_labels = self.p_create_row_labels(rows)
        row_labels.pop(len(row_labels) - 1)
        colors = self.p_set_table_colors(row_labels)
        table = plt.table(cellText=cell_text, cellColours=colors[0],
                  rowColours=colors[1], rowLabels=row_labels,
                  colColours=colors[2], colLabels=columns,
                  bbox=[0.0, -1.3, 1.0, 1.0], cellLoc='center')
        table.auto_set_font_size(False)
        table.set_fontsize(9)
        table.scale(2, 2)
        cell_dict = table.get_celld()
        for i in range(13):
            cell_dict[(i,1)].set_width(0.3)
    

    Below is an image of the table BEFORE the resizing. The snapshot was taken after line table.set_fontsize(9) was executed. I would like to re-size the second column Event.

    Before formatting

    enter image description here

    Unfortunately, after ever iteration of:

    for i in range(13):
        cell_dict[(i,1)].set_width(0.3)
    

    it looks like the cell width increases, resulting in something like this:

    After formatting

    enter image description here

    Any suggestions on why this could be happening, or an alternative solution to adjusting the width would be much appreciated!

  • Lisa
    Lisa about 3 years
    i found the third table column width was not adjusted automatically by running the code, my third table looks the same as the 2nd one. What did I miss? @Sam Jett
  • Sam Jett
    Sam Jett almost 3 years
    Can you post your code as an example @Lisa ? Make sure you include this line - tab2.auto_set_column_width(col=list(range(len(dff.columns)))‌​) - that's the line that makes the third table different from the second
  • Lisa
    Lisa almost 3 years
    hey i just figured it out, i was using a older version of matplotlib @Sam Jett
  • olenscki
    olenscki about 2 years
    Is there a similar way to adjust the height of a certain row?