Я хочу вставить маленькую иконку в определенную точку в полярном графе.
Из того, что я понимаю, 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.
Вам нужно будет нарисовать фигуру сначала, прежде чем преобразование даст вам правильные координаты.
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()