如何使用 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,一个解决方案是让你的每个绘图成为相同 figure
的 subplot
。例如:
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 的 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,一个解决方案是让你的每个绘图成为相同 figure
的 subplot
。例如:
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()
当我这样做时,我得到如下内容: