Python — преобразование координат с графиком полярного рассеяния в matplotlib

Мне нужно связать интерактивную карту HTML с некоторыми полярными графиками, созданными с помощью matplotlib, поэтому мне нужен метод для преобразования координат данных в координаты пикселей фигуры.

Код, адаптированный из Как получить координаты пикселей для сгенерированного Matplotlib диаграмма рассеяния?, это:

# Creates 6 points on a ray of the polar plot
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
points, = ax.plot([1,1,1,1,1,1],[0,1,2,3,4,5], 'ro')
ax.set_rmax(5)

x, y = points.get_data()
xy_pixels = ax.transData.transform(np.vstack([x,y]).T)
xpix, ypix = xy_pixels.T
width, height = fig.canvas.get_width_height()
ypix = height - ypix

for xp, yp in zip(xpix, ypix):
    print('{x:0.2f}\t{y:0.2f}'.format(x=xp, y=yp))

который дает

328.00  240.00
354.80  207.69
381.60  175.38
408.40  143.06
435.20  110.75
461.99  78.44

Правильной является только первая точка, расположенная в центре графика. Остальные кажутся смещенными, как будто фигура вытянута по горизонтали. На этом рисунке представлены точки, нарисованные matplotlib (красные), и те, которые я нарисовал по координатам:

Разница между нанесенными точками и координатами рисунка, которые я получаю

Что может происходить? Спасибо за вашу помощь!

Обновление 03 августа 2017 г.

«Растягивание» еще более странное: я попытался построить октаэдр, вписанный в окружность радиуса 3, с помощью этой команды:

points, = ax.plot([math.pi/4,math.pi/2,3*math.pi/4,math.pi,5*math.pi/4,3*math.pi/2,7*math.pi/4,2*math.pi],[3,3,3,3,3,3,3,3], 'ro')

и такая же рутина дала в итоге

495.01  110.70
328.00  57.14
160.99  110.70
91.81   240.00
160.99  369.30
328.00  422.86
495.01  369.30
564.19  240.00

В то время как 4 точки по осям x и y расположены правильно, остальные 4, соответствующие углам i*pi/2 + pi/4 (где i=0,1,2,3), страдают от «растяжения». Действительно, это видно даже по их координатам: для i=0,2,4,6 должно быть верно, что |x[(i+4)%8]-x[i]| = |y[(i+4)%8]-y[i]|, хотя, похоже, это не так.


person Edoardo Sarti    schedule 31.07.2017    source источник


Ответы (1)


Это очень сложная проблема, оказывается, она уже решена здесь:

Несогласованные координаты фигуры в matplotlib с одинаковым соотношением сторон

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

Самое простое решение - позвонить

fig.canvas.draw()

сразу после команды plot, но до выполнения каких-либо преобразований. Таким образом, фигура рисуется на холсте, применяя равный аспект; и с этого момента доступны правильные преобразования.

person tom    schedule 04.08.2017