Как сделать заголовок таблицы из 1 ячейки с Matplotlib? - PullRequest
0 голосов
/ 17 января 2019

Я использую 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)

Это приводит к следующему выводу: enter image description here

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

Ответы [ 3 ]

0 голосов
/ 17 января 2019

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

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

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

enter image description here


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

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()

enter image description here

0 голосов
/ 17 января 2019

Возможно, я неправильно понимаю ваш вопрос, но если ваша конечная цель состоит в том, чтобы сгруппировать несколько графиков в 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()

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

enter image description here

0 голосов
/ 17 января 2019

Вам нужно использовать 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)

enter image description here

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

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')

enter image description here

Чтобы получить одну строку с несколькими столбцами, начиная с 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)

enter image description here

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

length = 1

производит

enter image description here

...