Вокруг моей таблицы Matplotlib есть лишнее белое пустое пространство, из-за чего моя таблица сжимается, как будто figsize
недостаточно велика. Если я увеличу figsize
, таблица отобразится нормально, но тогда белое пустое пространство станет еще больше. Кроме того, заголовок перемещается по таблице, когда количество строк превышает определенное число (около 35 или около того).
import matplotlib.pyplot as plt
def create_pivot_table(
title: str,
pivot_table: pd.core.frame.DataFrame,
):
"""
Creates a Matplotlib table from a Pandas pivot table.
Returns fig and ax.
"""
fig_width = 1 + len(pivot_table.columns) * 0.6
fig_height = 1 + len(pivot_table) * 0.3
figsize=(fig_width, fig_height)
fig, ax = plt.subplots(figsize=figsize)
title = title
ax.set_title(
title,
fontsize=16,
weight='bold',
loc='center'
)
ax.axis('off')
table = ax.table(
cellText=pivot_table.values,
colLabels=pivot_table.columns,
rowLabels=pivot_table.index,
cellLoc='center',
loc='center'
)
table.auto_set_font_size(False)
# Formatting the table with alternating colors to make it more readable
for (row, column), cell in table.get_celld().items():
if row == 0:
cell.set_text_props(weight='bold')
cell.set_fontsize(8)
cell.set_height(0.05)
if column % 2 == 0:
cell.set_facecolor('#dadada')
else:
cell.set_facecolor('#ffffff')
else:
cell.set_fontsize(10)
cell.set_height(0.03)
if row % 2 == 0:
cell.set_facecolor('#ffffff')
else:
cell.set_facecolor('#e6f7ff')
if column % 2 == 0:
cell.set_facecolor('#dadada' if row % 2 == 0 else '#b9d5d3')
else:
cell.set_facecolor('#ffffff' if row % 2 == 0 else '#e6f7ff')
return fig, ax
Фиктивные данные:
import pandas as pd
import numpy as np
data = np.random.randint(1, 100, size=(3, 4))
df = pd.DataFrame(data, index=['A', 'B', 'C'], columns=[1, 2, 3, 4])
title = 'Title'
fig, ax = create_pivot_table(
title=title,
pivot_table=df
)
Результат:
Желаемый результат: та же таблица за вычетом пустого пробела, чтобы таблица отображалась правильно. Кроме того, я хотел бы центрировать заголовок и таблицу внутри рисунка, чего не происходит с написанным мной кодом (в зависимости от размера таблицы и заголовка).
Заранее спасибо за помощь!
Я думаю, вам нужно попробовать suptitle
для получения названия и поиграть с bbox
параметром table
.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def create_pivot_table(
title: str,
pivot_table: pd.core.frame.DataFrame,
):
"""
Creates a Matplotlib table from a Pandas pivot table.
Returns fig and ax.
"""
fig_width = 1 + len(pivot_table.columns) * 0.6
fig_height = 1 + len(pivot_table) * 0.3
figsize=(fig_width, fig_height)
fig, ax = plt.subplots(figsize=figsize)
fig.suptitle(title, fontsize=16, weight='bold', y=0.95)
ax.axis('off')
table = ax.table(
cellText=pivot_table.values,
colLabels=pivot_table.columns,
rowLabels=pivot_table.index,
cellLoc='center',
loc='center',
bbox=[0,0,1,0.95]
)
table.auto_set_font_size(False)
# Formatting the table with alternating colors to make it more readable
for (row, column), cell in table.get_celld().items():
if row == 0:
cell.set_text_props(weight='bold')
cell.set_fontsize(8)
cell.set_height(0.05)
if column % 2 == 0:
cell.set_facecolor('#dadada')
else:
cell.set_facecolor('#ffffff')
else:
cell.set_fontsize(10)
cell.set_height(0.03)
if row % 2 == 0:
cell.set_facecolor('#ffffff')
else:
cell.set_facecolor('#e6f7ff')
if column % 2 == 0:
cell.set_facecolor('#dadada' if row % 2 == 0 else '#b9d5d3')
else:
cell.set_facecolor('#ffffff' if row % 2 == 0 else '#e6f7ff')
return fig, ax
data = np.random.randint(1, 100, size=(3, 4))
df = pd.DataFrame(data, index=['A', 'B', 'C'], columns=[1, 2, 3, 4])
title = 'Title'
fig, ax = create_pivot_table(
title=title,
pivot_table=df
)
plt.show()
Это сработало! Ты потрясающий, спасибо. Желаю вам прекрасных выходных. <3