Python Matplotlib аннотировать дуги переменной длины - PullRequest
0 голосов
/ 29 апреля 2020

Я хотел бы аннотировать некоторые точки на графике 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 ...): enter image description here

Просто обрезать разъемы для точек данных, не хорошо: enter image description here

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете установить длину armB так, чтобы она зависела от положения точки.

Вот пример того, что мне показалось хорошим:

enter image description here

connection = "arc,angleA=-90,armA=20,angleB=90,rad=10,"
arpr = {"arrowstyle": "-"}

for i, j in zip(x, tx):
    #lines all the way down but messy
    arpr["connectionstyle"] = connection + "armB="+ "{0}".format((5-yd[i])*30)
    plt.annotate("foo", (i, yd[i]), (j, 6), arrowprops=arpr, rotation="vertical")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...