Можно ли привязать аннотацию matplotlib к координате данных по оси x, но к относительному местоположению по оси y?

У меня есть сюжет, где я хотел бы аннотировать определенное местоположение по оси х стрелкой и меткой:

  • Расположение наконечника стрелки необходимо точно указать в координатах данных.
  • Стрелка должна быть вертикальной, поэтому координата x тупого конца стрелки (и текстовой метки) также должна быть точно указана в координатах данных.
  • Тем не менее, я в идеале хотел бы иметь возможность указать y-положение тупого конца стрелки относительно ограничивающего рамки оси, а не данных.

Мое текущее рабочее решение включает указание местоположений как наконечника стрелки, так и метки в координатах данных:

import numpy as np from matplotlib import pyplot as plt from matplotlib.transforms import blended_transform_factory x = np.random.randn(10000) r = 3 label = 'foo' arrowprops = dict(fc='r', ec='k') def make_example_plot(): fig, ax = plt.subplots(1, 1) ax.hold(True) counts, edges, patches = ax.hist(x) return fig, ax fig, ax = make_example_plot() lo, hi = ax.get_ylim() ax.annotate(label, xy=(r, 0), xycoords='data', xytext=(r, hi * 1.1), textcoords='data', fontsize='xx-large', ha='center', va='center', color='r', arrowprops=arrowprops) ax.set_ylim(0, hi * 1.3) 

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

Я бы предпочел, чтобы ярлык оставался в постоянном положении в y, независимо от того, как я масштабирую или поворачиваю оси y. Я могу добиться желаемого эффекта для простой текстовой метки, передав смешанное преобразование xy в ax.text :

 fig, ax = make_example_plot() tform = blended_transform_factory(ax.transData, ax.transAxes) ax.text(r, 0.9, label, fontsize='xx-large', color='r', transform=tform) 

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

Если вы воспроизведете эту цифру, то панорамируйте или масштабируйте ее, вы увидите, что текст перемещается по x относительно ограничивающего рамки оси, но остается в фиксированном положении по y. Конечно, это все еще не дает мне стрелы. Я надеялся, что смогу использовать тот же подход с ax.annotate , но это, похоже, не работает:

 fig, ax = make_example_plot() tform = blended_transform_factory(ax.transData, ax.transAxes) ax.annotate(label, xy=(r, 0), xycoords='data', transform=tform, xytext=(r, 0.9), textcoords='data', fontsize='xx-large', ha='center', va='center', color='r', arrowprops=arrowprops) 

Метка и стрелка помещаются в y = 0.9 в координатах данных, а не на 90% от общей высоты оси y:

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

Есть ли способ отдельно указать кадры ссылки для x- и y-преобразований, применяемых к matplotlib.text.Annotation ?

One Solution collect form web for “Можно ли привязать аннотацию matplotlib к координате данных по оси x, но к относительному местоположению по оси y?”

Передайте преобразование в параметры xycoords и textcoords вместо параметра transform . Вот так:

 fig, ax = make_example_plot() tform = blended_transform_factory(ax.transData, ax.transAxes) ax.annotate(label, xy=(r, 0), xycoords=tform, xytext=(r, 0.9), textcoords=tform, fontsize='xx-large', ha='center', va='center', color='r', arrowprops=arrowprops) 
  • Как передать двоичные данные в массивы numpy без хранения tmp?
  • linalg.norm не принимает аргумент оси
  • Функция для вычисления градиента 3D с неравномерно расположенными точками выборки
  • Давайте сделаем ссылочную реализацию N-мерного пиксельного биннинга / bucketing для numpy python
  • Numpy: Разница между точками (a, b) и (a * b) .sum ()
  • Графика многоцветной линии Pandas Dataframe
  • Странное назначение в массивах numpy
  • Numpy - квадратный корень из -1 оставляет небольшую реальную часть
  • Python - лучший язык программирования в мире.