Я использую 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)
Это приводит к следующему результату:

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






Вам нужно использовать 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
производит
Таблицу ожидает двухмерный 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()
Когда я это делаю, я получаю что-то вроде следующего:
Спасибо, что приложили усилия и использовали простой метод, чтобы объяснить больше о таблице matplotlib.