В настоящее время у меня есть код ниже, чтобы получить первую строку в .
Код: Выделить всё
# 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]]

< /p>
Хотя я не понял, как объединить строки и ячейки.
Я нашел этот пост: Таблица Matplotlib с двойными заголовками
Где создано несколько таблиц для отображения несколько заголовков. Но, к сожалению, это не сработает для объединения ячеек в столбце и только в строке.
Подробнее здесь: https://stackoverflow.com/questions/790 ... d-rowspans