A veces la mejor forma de mostrar unos datos es una tabla. matplotlib puede dibujar tablas con ax.table, lo que es útil para incluirlas en una figura junto a un gráfico o para exportarlas como imagen. Los ejemplos muestran la clasificación de una liga de fútbol.
ax.table
Pasa el contenido de las celdas a cellText y el encabezado a colLabels. Oculta los ejes con ax.axis("off") para mostrar solo la tabla.
import matplotlib.pyplot as plt
columns = ["Equipo", "Jugados", "Ganados", "Empatados", "Perdidos", "Puntos"]
rows = [["Rovers", 30, 21, 6, 3, 69],
["United", 30, 19, 7, 4, 64],
["Athletic", 30, 17, 8, 5, 59],
["City", 30, 15, 6, 9, 51],
["Wanderers", 30, 12, 9, 9, 45]]
fig, ax = plt.subplots()
ax.axis("off")
ax.table(cellText = rows, colLabels = columns, loc = "center")
# plt.show()

Desactiva el tamaño de fuente automático con auto_set_font_size(False), establécelo con set_fontsize y agranda las celdas con scale(x, y).
import matplotlib.pyplot as plt
columns = ["Equipo", "Jugados", "Ganados", "Empatados", "Perdidos", "Puntos"]
rows = [["Rovers", 30, 21, 6, 3, 69],
["United", 30, 19, 7, 4, 64],
["Athletic", 30, 17, 8, 5, 59],
["City", 30, 15, 6, 9, 51],
["Wanderers", 30, 12, 9, 9, 45]]
fig, ax = plt.subplots()
ax.axis("off")
tab = ax.table(cellText = rows, colLabels = columns, loc = "center")
tab.auto_set_font_size(False)
tab.set_fontsize(11)
tab.scale(1.2, 1.8)
# plt.show()

colColours establece el fondo del encabezado y cellColours el fondo de cada celda. Cada celda también se puede personalizar individualmente con tab[fila, columna], donde la fila 0 es el encabezado.
import matplotlib.pyplot as plt
columns = ["Equipo", "Jugados", "Ganados", "Empatados", "Perdidos", "Puntos"]
rows = [["Rovers", 30, 21, 6, 3, 69],
["United", 30, 19, 7, 4, 64],
["Athletic", 30, 17, 8, 5, 59],
["City", 30, 15, 6, 9, 51],
["Wanderers", 30, 12, 9, 9, 45]]
stripes = [["#F1FAEE"] * 6 if i % 2 == 0 else ["white"] * 6 for i in range(len(rows))]
fig, ax = plt.subplots()
ax.axis("off")
tab = ax.table(cellText = rows, colLabels = columns, loc = "center",
cellColours = stripes, colColours = ["#1D3557"] * 6)
tab.auto_set_font_size(False)
tab.set_fontsize(10)
tab.scale(1.2, 2)
for col in range(len(columns)):
tab[0, col].set_text_props(color = "white", weight = "bold")
# plt.show()

Recorre las celdas para cambiar el color de las que cumplan una condición, por ejemplo el líder de la liga.
import matplotlib.pyplot as plt
columns = ["Equipo", "Jugados", "Ganados", "Empatados", "Perdidos", "Puntos"]
rows = [["Rovers", 30, 21, 6, 3, 69],
["United", 30, 19, 7, 4, 64],
["Athletic", 30, 17, 8, 5, 59],
["City", 30, 15, 6, 9, 51],
["Wanderers", 30, 12, 9, 9, 45]]
fig, ax = plt.subplots()
ax.axis("off")
tab = ax.table(cellText = rows, colLabels = columns, loc = "center")
tab.scale(1.1, 1.8)
for col in range(len(columns)):
tab[1, col].set_facecolor("#FFD166")
# plt.show()

Con loc = "bottom" la tabla se coloca debajo de los ejes, por lo que se pueden mostrar los valores de un gráfico bajo él. Ajusta el espacio con subplots_adjust.
import matplotlib.pyplot as plt
columns = ["Equipo", "Jugados", "Ganados", "Empatados", "Perdidos", "Puntos"]
rows = [["Rovers", 30, 21, 6, 3, 69],
["United", 30, 19, 7, 4, 64],
["Athletic", 30, 17, 8, 5, 59],
["City", 30, 15, 6, 9, 51],
["Wanderers", 30, 12, 9, 9, 45]]
teams = [r[0] for r in rows]
points = [r[5] for r in rows]
fig, ax = plt.subplots()
ax.bar(teams, points, color = "#457B9D")
ax.set_xticks([])
ax.table(cellText = [points], rowLabels = ["Puntos"], colLabels = teams, loc = "bottom")
plt.subplots_adjust(bottom = 0.2)
# plt.show()

Si necesitas tablas con un formato más avanzado para informes o páginas web, echa un vistazo a la librería great_tables.
También te puede interesar