визуализация
March 20, 2023

3 смелых способа нарисовать таблицу в Jupyter

Все, что делаешь, надо делать хорошо, даже если совершаешь безумство (Оноре де Бальзак). Если вы знаете базовый функционал для аналитики данных с Python, то можете использовать его для презентации табличных данных без обращения к сторонним инструментам.

Markdown

Так, таблицу можно нарисовать прямо в Markdown ячейке. Отделите поля в строках символами "|", а между заголовком и первой строкой поместите служебный ряд из "-" в каждой ячейке, разделенных все той же прямой линией. Красоту в ячейках можно навести с html тегами (например, тегом font):

<font size=15 color='green'>столбец 1</font>|<font size=15 color='green'>столбец 2</font>
-|-
<font size=10 color='blue'> ячейка 1_1 </font>|<font size=10, color='blue'> ячейка 1_2 <font>

Matplotlib

Также таблицу можно представить как фигуру Matplotlib, ячейки - ее подграфики, а содержимое задавать как текст в подграфике (детальнее о применяемых элементах matplotlib можно прочитать здесь и здесь. Ниже приведу пример (подграфики заполняются прямоугольниками):

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2, figsize=(14, 5), sharex=True, sharey=True)
ax[0][0].add_patch(plt.Rectangle((0,0),1,1, alpha=0.3, color='green'))
ax[0][0].text(0.15, 0.5,'столбец 1', size=45)

ax[0][1].add_patch(plt.Rectangle((0,0),1,1, alpha=0.3, color='green'))
ax[0][1].text(0.15, 0.5,'столбец 2', size=45)

ax[1][0].add_patch(plt.Rectangle((0,0),1,1, alpha=0.5, color='blue'))
ax[1][0].text(0.2, 0.5,'ячейка 1_1', size=35)

ax[1][1].add_patch(plt.Rectangle((0,0),1,1, alpha=0.5, color='blue'))
ax[1][1].text(0.2, 0.5,'ячейка 1_2', size=35)

ax[0][0].set_xticks([])
ax[0][0].set_yticks([])
fig.subplots_adjust(hspace=0, wspace=0)

Pandas

И, конечно, таблицу можно нарисовать со стилевым оформлением pandas датафрейма (ранее писал о применении стилей к датафрейму, а детальный мануал здесь). На картинке ниже через set_properties задаются размер и цвет текста, через apply - стили конкретной строки (параметры subset и axis), hide скрывает встроенные в датафрейм заголовки и индекс:

import pandas as pd

pd.DataFrame([['столбец 1', 'столбец 2'], ['ячейка 1_1', 'ячейка 1_2']]).style\
                .set_properties(**{'font-size': '20pt', 'color': 'blue'})\
                .apply(lambda x: ['background-color:green' for it in x], subset=0, axis=0)\
                .hide(axis='columns').hide(axis='index')