Matplotlib: полярная проекция transData.transform дает неправильные значения

1

Я хочу вставить маленькую иконку в определенную точку в полярном графе.

Из того, что я понимаю, fig.figimage(image, x, y) принимает x,y как отображаемые координаты. Я использую ax.transData.transform_point((theta, radius)), но это работает неправильно.

Мой код следующий:

from numpy import *
from matplotlib.pyplot import *

t = arange(0, 2*pi, 0.01)
r = ones(t.size)

fig = gcf()
ax = fig.add_subplot(111, projection='polar')
ax.plot(t, r)

x, y = ax.transData.transform((pi/4, 1.0))
img = imread('die.png')
fig.figimage(img, x, y)

show()

Здесь результат, тогда как нижний левый угол img должен касаться синей линии при 45 градусах и радиусе 1.

Теги:
matplotlib

1 ответ

0
Лучший ответ

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

fig.canvas.draw()
x, y = ax.transData.transform((pi/4, 1.0))

Это связано с тем, что положение осей полярного графика определяется только тогда, когда рисунок фактически нарисован. Попытка трансформировать что-то впереди приведет к неправильным координатам.

В общем, я бы рекомендовал использовать AnnotationBbox вместо figimage в таком случае.

import numpy as np
import matplotlib.pyplot  as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

t = np.arange(0, 2*np.pi, 0.01)
r = np.ones(t.size)

fig = plt.gcf()
ax = fig.add_subplot(111, projection='polar')
ax.plot(t, r)

img = plt.imread('https://i.stack.imgur.com/9qe6z.png')

imagebox = OffsetImage(img, zoom=0.2)
imagebox.image.axes = ax

ab = AnnotationBbox(imagebox, (np.pi/4, 1.0),
                    box_alignment=(0., 0),
                    xycoords='data', pad=0)

ax.add_artist(ab)

plt.show()

Изображение 174551

  • 0
    Это сработало! Можете ли вы объяснить или связать меня с соответствующей документацией, чтобы понять, почему это исправляет это? Кроме того, я не уверен, как пометить ваш ответ как правильный. Может быть, похоже на то, как я не могу проголосовать, потому что мой аккаунт совсем недавно.
  • 0
    Я обновил ответ. Надеюсь, теперь это стало понятнее. В настоящее время я не уверен, где именно задокументировано, что положения осей фиксируются только после рисования - я думаю, что это неявно показано в нескольких местах документов. О том, как принять ответ, смотрите, кто-то отвечает или, может быть, лучше. Как принять ответ .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню