如何使用 Matplotlib 制作 1-cell table headers?

How to make a 1-cell table headers with Matplotlib?

我正在使用 Matplotlib 的 PdfPages 从查询的数据中绘制各种图形和 tables 并生成 Pdf。我想按 "Stage 1"、"Stage 2" 和 "Stage 3" 等各个部分对地块进行分组,主要是创建部分 headers。例如,在 Jupyter notebook 中,我可以制作单元格的 markdown 并创建粗体 headers。但是,我不确定如何使用 PdfPages 做类似的事情。我的一个想法是生成一个包含章节标题的 1 单元格 table。它没有创建 1 个单元格 table,而是在标题中为每个字符创建一个单元格。

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)

这会导致以下输出:

如果有人对如何创建部分 headers 或者至少修复我创建的 table 中的单元格问题有任何建议,我将不胜感激。谢谢!

您需要使用 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)

Table 多行

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

产生

A table 需要二维 cellText。 IE。第 n 行的第 m 列包含内容 cellText[n][m]。如果 cellText=['Stage 1']cellText[0][0] 将计算为 "S",因为只有一行并且其中的字符串被索引为列。相反,您可能想使用

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

即整个文本作为第一行的第一列。


现在的基本问题似乎是如何添加章节标题,也许为此使用 table 不是最好的方法?至少可以用普通文本实现类似的结果,

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,一个解决方案是让你的每个绘图成为相同 figuresubplot。例如:

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

当我这样做时,我得到如下内容: