Рисование скобок по сюжету

Как бы я пошел, если бы хотел нарисовать скобки над некоторыми частями моего заговора следующим образом:

скобки по сюжету

В настоящий момент я добавляю их с powerpoint, но я хотел бы сделать это целиком в python.

Спасибо за помощь

Ответ 1

Один из способов получить то, что вы хотите (или что-то очень близкое ему), - использовать функцию matplotlib annotate, которая позволяет вам довольно широко настраивать функцию стрелок. Вот пример с некоторыми составленными данными графика, чтобы показать, как использовать его в соответствии с вашими требованиями к ярлыкам:

import matplotlib.pyplot as plt
import numpy as np

# Make some fake data and a sample plot
x = np.arange(1,100)
y = x**2 * 1.0e6
ax = plt.axes()
ax.plot(x,y)

# Adjust the fontsizes on tick labels for this plot
fs = 14.0
[t.set_fontsize(fs) for t in ax.xaxis.get_majorticklabels()]
[t.set_fontsize(fs) for t in ax.yaxis.get_majorticklabels()]
ax.yaxis.get_offset_text().set_fontsize(fs)

# Here is the label and arrow code of interest
ax.annotate('SDL', xy=(0.5, 0.90), xytext=(0.5, 1.00), xycoords='axes fraction', 
            fontsize=fs*1.5, ha='center', va='bottom',
            bbox=dict(boxstyle='square', fc='white'),
            arrowprops=dict(arrowstyle='-[, widthB=7.0, lengthB=1.5', lw=2.0))

введите описание изображения здесь

Функция annotate содержит требуемую текстовую метку, а также аргументы для позиционирования для стрелки (xy) и самого текста (xycoords) и некоторых общих команд позиционирования и шрифтов.

Вероятно, наиболее интересны аргументы bbox и arrowprops. Аргумент bbox рисует квадрат вокруг метки с белым фоном. arrowprops больше задействованы - клавиша arrowstyle устанавливает головку стрелки (в данном случае - скобу), а также ширину и длину головы. Обратите внимание, что это все одна строка под arrowstyle. Наконец, ширина линии стрелки слегка увеличивается.

Возможно, вам придется настроить xy, xytext, widthB, lengthB и стрелку lw, чтобы получить все, что вам нужно.

Одна вещь, которая не сразу понятна (или, по крайней мере, не была для меня, когда я понял это), заключалась в том, что когда annotate содержит аргумент arrowstyle, matplotlib использует FancyArrowPatch свойства, но когда arrowstyle отсутствует, он использует свойства YAArrow. Очевидно, что в документации для annotate отмечено более подробно (а также это различие).