Добавить текст к межосевой стрелке - PullRequest
0 голосов
/ 24 декабря 2018

Вчера я задал вопрос , основанный на заблуждении.Теперь я лучше знаю, что на самом деле я спрашиваю.

Я хочу нарисовать стрелку между двумя осями И иметь рядом текст, как я нарисовал здесь вручную:

enter image description here

import matplotlib.pyplot as plt
from matplotlib import patches
import numpy as np

fig = plt.figure()

X, Y = np.mgrid[-1:1:.1, -1:1:.1]
Z = X+Y

ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(313)
ax1.contourf(X, Y, Z)
ax2.contourf(X, Y, -Z)

con = patches.ConnectionPatch((0,0),
                              (0,0),
                              coordsA="data",
                              coordsB="data",
                              arrowstyle="<|-",
                              mutation_scale=20,
                              axesA=ax2,
                              axesB=ax1)
ax2.add_artist(con)

fig.show()

Наличие стрелок с текстом рядом с ними в пределах Одной оси можно сделать с помощью ax.annotate().Рисование стрелок между осями может быть сделано с помощью ConnectionPatch.Однако в документах говорится:

ConnectionPatch похож на аннотацию без текста.Хотя функция аннотирования рекомендуется в большинстве ситуаций, ConnectionPatch полезен, когда вы хотите соединить точки на разных осях.

Итак, это звучит так, как если бы они оба (стрелка между осями итекст) не рассматривается API в удобной для пользователя форме.

Хорошо ... но должен быть хотя бы приемлемый способ справиться с этим, верно?Ответ на мой вчерашний вопрос был основан на моем заблуждении.Итак, я надеюсь, что есть лучшее решение, основанное на этом моем перефразированном вопросе.

Итак, есть ли надежный способ добавить текст к стрелке между осями (например, ConnectionPatch), без суетывокруг с координатами и ax.text или такая ерунда?

1 Ответ

0 голосов
/ 27 декабря 2018

Решение "возни с координатами" требует небольшого кода и достаточно гибко:

import matplotlib.pyplot as plt
from matplotlib import patches
import numpy as np

fig = plt.figure()

X, Y = np.mgrid[-1:1:.1, -1:1:.1]
Z = X+Y

ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(313)
ax1.contourf(X, Y, Z)
ax2.contourf(X, Y, -Z)

xy1, xy2 = (0,0), (0,0)
con = patches.ConnectionPatch(xy2,
                              xy1,
                              coordsA="data",
                              coordsB="data",
                              arrowstyle="<|-",
                              mutation_scale=20,
                              axesA=ax2,
                              axesB=ax1)
ax2.add_artist(con)

# calculate center of inter-axes arrow in figure pixels
xy = np.mean([ax1.transData.transform(xy1), ax2.transData.transform(xy2)],
  axis=0)
plt.annotate(" arrow label", xy, xycoords='figure pixels', va='center')

plt.show()

Здесь результат: labeled arrow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...