我正在寻找一种方法来添加可以跨越多行的列和可以跨越多列的行。
我目前有下面的代码来获取第一行。
# Calculate log-scaled widths
table_widths = [0.001, 0.002, 0.063, 2.0, 63.0, 150.0]
log_table_widths = np.diff(np.log10(table_widths))
log_table_widths = log_table_widths / log_table_widths.sum()
# Normalize widths to sum to 1
log_table_widths = log_table_widths / log_table_widths.sum()
table = ax.table(cellText=[['Clay', 'Silt', 'Sand', 'Gravel', 'Cobbles']], cellLoc='center', loc='bottom', colWidths=log_table_widths)
table_widths = []
table.auto_set_font_size(False)
table.set_fontsize(8)
table.scale(1, 1.5)
但是我需要在表格中添加另一行,其中某些列将跨越下一行。而当前行上的单元格必须跨越多列。如下所示: 最好将底行设为顶行,但不要太糟。
我曾尝试独自完成此事,并寻求 GitHub CoPilot 和 MS CoPilot 的帮助。然而,没有成功,我们能想到的最好的办法如下:
# Calculate log-scaled widths
table_widths = [0.001, 0.002, 0.063, 2.0, 63.0, 150.0]
log_table_widths = np.diff(np.log10(table_widths))
log_table_widths = log_table_widths / log_table_widths.sum()
# Normalize widths to sum to 1
log_table_widths = log_table_widths / log_table_widths.sum()
# Create the table
cell_text = [
['Clay', 'Silt', 'Fine', 'Medium', 'Coarse', 'Fine', 'Medium', 'Coarse'],
['', '', 'Sand', 'Sand', 'Sand', 'Gravel', 'Gravel', 'Gravel'],
]
col_labels = ['Clay', 'Silt', 'Fine', 'Medium', 'Coarse', 'Fine', 'Medium', 'Coarse']
col_widths = [log_table_widths, log_table_widths, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3]
# Add the table to the plot
table = ax.table(cellText=cell_text, colLabels=col_labels, cellLoc='center', loc='bottom', colWidths=col_widths)
table.auto_set_font_size(False)
table.set_fontsize(8)
table.scale(1, 1.5)
# Adjust cell alignment to avoid ambiguity
for key, cell in table.get_celld().items():
cell.set_text_props(ha='center', va='center')
出现以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
不知道如何解决它。
为了获得可重复性,您可以使用:
fig, ax = plt.subplots()
fig.set_figwidth(18)
fig.set_figheight(12)
fig.set_dpi(80)
# draw vertical line at: 0.002mm, 0.063mm, 2.0mm, 63mm
ax.axvline(x=0.002, color='red', linestyle='--')
ax.axvline(x=0.063, color='red', linestyle='--')
ax.axvline(x=2.0, color='red', linestyle='--')
ax.axvline(x=63.0, color='red', linestyle='--')
ax.set_xlim(0.001, 150)
# Calculate log-scaled widths
table_widths = [0.001, 0.002, 0.063, 2.0, 63.0, 150.0]
log_table_widths = np.diff(np.log10(table_widths))
log_table_widths = log_table_widths / log_table_widths.sum()
# Normalize widths to sum to 1
log_table_widths = log_table_widths / log_table_widths.sum()
# Create the table
cell_text = [
['Clay', 'Silt', 'Fine', 'Medium', 'Coarse', 'Fine', 'Medium', 'Coarse'],
['', '', 'Sand', 'Sand', 'Sand', 'Gravel', 'Gravel', 'Gravel'],
]
col_labels = ['Clay', 'Silt', 'Fine', 'Medium', 'Coarse', 'Fine', 'Medium', 'Coarse']
col_widths = [log_table_widths, log_table_widths, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3, log_table_widths/3]
# Add the table to the plot
table = ax.table(cellText=cell_text, colLabels=col_labels, cellLoc='center', loc='bottom', colWidths=col_widths)
table.auto_set_font_size(False)
table.set_fontsize(8)
table.scale(1, 1.5)
# Adjust cell alignment to avoid ambiguity
for key, cell in table.get_celld().items():
cell.set_text_props(ha='center', va='center')
fig.savefig('fig.png', format='png', bbox_inches='tight')
编辑:我设法摆脱了错误。这是由于定义 col_widths 变量时,我用列表而不是其对应的值填充它而导致的。我现在是这样定义的,以后可能会找到更好的解决方案。
col_widths = [log_table_widths[0], log_table_widths[1], log_table_widths[2] / 3, log_table_widths[2] / 3, log_table_widths[2] / 3, log_table_widths[3] / 3, log_table_widths[3] / 3, log_table_widths[3] / 3, log_table_widths[4]]
虽然我还没有弄清楚如何合并行和单元格。但我找到了这篇文章:带有双标题的 Matplotlib 表 ,其中创建了多个表以显示多个标题。但遗憾的是,这不适用于合并列中的单元格和行中的单元格。