Я хотел бы аннотировать некоторые точки на графике matplotlib (динамически c) со стилями соединения "ar c" таким образом, чтобы аннотации группировались вверху, соединители работали с соответствующими x- позиции, но останавливаются в определенной точке y и проходят как прямые руки от их до точки данных (см. рис.). Решением может быть манипулирование отдельными значениями «armB», но проблема в том, что они находятся только в точках и не соответствуют системе координат данных. Причина, по которой я не просто использую прямые линии, во-первых, в том, что в реальных данных точки иногда слишком близко друг к другу, и текст будет перекрываться, следовательно, изогнутые «стрелки». Да, и он должен динамически адаптироваться к уровню масштабирования (последний график будет интерактивным), но я думаю, что я смогу осуществить это, как только проблема линии соединения будет решена. Минимальный рабочий пример:
import matplotlib.pyplot as plt
x=[2, 3, 4, 6, 7, 8, 10, 11]
y=[1, 3, 4, 2, 3, 1, 5, 2,]
tx=[3, 4, 5, 6, 7, 8, 9, 10]
yd=dict(zip(x, y))
plt.scatter(x, y)
plt.xlim(0, 14)
plt.ylim(0, 7)
arpr = {"arrowstyle": "-", "connectionstyle": "arc,angleA=-90,armA=20,angleB=90,armB=20,rad=10"}
for i, j in zip(x, tx):
#lines all the way down but messy
plt.annotate("foo", (i, yd[i]), (j, 6), arrowprops=arpr, rotation="vertical")
#lines orderly, but incomplete
plt.annotate("foo", (i, 5), (j, 6), arrowprops=arpr, rotation="vertical")
Что бы я хотел (красные линии - это проблема, добавленная в пи c с MS Paint ...):
Просто обрезать разъемы для точек данных, не хорошо: