Как сделать заголовки таблицы с 1 ячейкой с помощью Matplotlib?

Я использую PdfPages Matplotlib для построения различных рисунков и таблиц из запрошенных данных и создания файла Pdf. Я хочу сгруппировать графики по различным разделам, таким как «Этап 1», «Этап 2» и «Этап 3», по существу создав заголовки разделов. Например, в блокноте Jupyter я могу сделать уценку ячейки и выделить заголовки полужирным шрифтом. Однако я не уверен, как сделать что-то подобное с PdfPages. Одна из моих идей заключалась в том, чтобы создать таблицу из 1 ячейки, содержащую заголовок раздела. Вместо создания таблицы с 1 ячейкой в ​​заголовке есть ячейка для каждого символа.

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 2))
ax = plt.subplot(111)
ax.axis('off')
tab = ax.table(cellText=['Stage 1'], bbox=[0, 0, 1, 1])
tab.auto_set_font_size(False)
tab.set_fontsize(24)

Это приводит к следующему результату: Как сделать заголовки таблицы с 1 ячейкой с помощью Matplotlib?

Если у кого-то есть предложения о том, как создать заголовки разделов или, по крайней мере, исправить проблему с ячейкой в ​​созданной мной таблице, я был бы признателен за ваш вклад. Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 626
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно использовать colLabels для именования столбцов и использовать cellText с соответствующей формой

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 2))
ax = plt.subplot(111)
ax.axis('off')

length = 7
colLabels = ['Stage %s' %i for i in range(1,length+1)] # <--- 1 row, 7 columns
cellText = np.random.randint(0, 10, (1,length))

tab = ax.table(cellText=cellText, colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')
tab.auto_set_font_size(False)
tab.set_fontsize(14)

Таблица с несколькими строками

cellText = np.random.randint(0, 10, (3,length)) # <--- 3 rows, 7 columns

tab = ax.table(cellText=cellText, colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')

Чтобы получить одну строку с несколькими столбцами, начиная с 2 строк, 7 столбцов

tab = ax.table(cellText=[['']*length], colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')
cells=tab.get_celld()

for i in range(length):
    cells[(1,i)].set_height(0)

Получение одного столбца Использование в приведенном выше коде

length = 1

производит

Спасибо, что приложили усилия и использовали простой метод, чтобы объяснить больше о таблице matplotlib.

nish 26.11.2020 03:54

Таблицу ожидает двухмерный cellText. т.е. столбец mth строки nth имеет содержимое cellText[n][m]. Если cellText=['Stage 1'], cellText[0][0] будет оцениваться как "S", потому что там одна строка и строка внутри индексируется как столбцы. Вместо этого вы, вероятно, захотите использовать

ax.table(cellText=[['Stage 1']])

то есть весь текст как первый столбец первой строки.


Теперь основной вопрос, похоже, заключается в том, как добавить заголовок раздела, и, возможно, использование таблицы для этого не лучший подход? По крайней мере, аналогичный результат можно было бы получить с обычным текстом,

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(12, 2))
ax.tick_params(labelleft=False, left=False, labelbottom=False, bottom=False)
ax.annotate('Stage 1', (.5,.5), ha = "center", va = "center", fontsize=24)
plt.show()

Я могу неправильно понять ваш вопрос, но если ваша конечная цель состоит в том, чтобы сгруппировать несколько графиков вместе в PDF, одно из решений — сделать каждый из ваших графиков subplot одного и того же figure. Например:

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import random

# Declare the PDF file and the single figure
pp = PdfPages('test.pdf')
thefig = plt.figure()
thefig.suptitle("Group 1")

# Generate 4 subplots for the same figure, arranged in a 2x2 grid
subplots = [ ["Plot One", 221], ["Plot Two", 222],
             ["Plot Three", 223], ["Plot Four", 224] ]
for [subplot_title, grid_position] in subplots:
    plt.subplot(grid_position)
    plt.title(subplot_title)
    # Make a random bar graph:
    plt.bar(range(1,11), [ random.random() for i in range(10) ])

# Add some spacing, so that the writing doesn't overlap
plt.subplots_adjust(hspace=0.35, wspace=0.35)

# Finish
pp.savefig()
pp.close()

Когда я это делаю, я получаю что-то вроде следующего:

Другие вопросы по теме