#python #matplotlib
Вопрос:
Я пытаюсь создать диаграмму в перспективе, где одна 2D-фигура «парит» над другой 2D-фигурой. https://matplotlib.org/stable/gallery/mplot3d/pathpatch3d.html этого было достаточно, чтобы я начал. Эти три строки, в частности, показались мне полезными:
p = Circle((5, 5), 3)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z=0, zdir="x")
Я сделал 2D-фигуру с помощью преобразований, с помощью таких операций, как
rect = patches.Rectangle((1,2),3,4)
trans = Affine2D().rotate_around(-5, -6, pi/7) ax.transData
rect.set_transform(trans)
ax.add_patch(rect)
поэтому я подумал, что могу просто добавить art3d.pathpatch_2d_to_3d(rect, z=0, zdir="z")
в конце. Это не работает: у меня получился гигантский прямоугольник. Как заставить деталь преобразования работать с деталью от 2D до 3D?
Во второй попытке я попытался применить преобразование к координатам левого нижнего угла, чтобы избежать set_transform
:
trans = Affine2D().rotate_around(-5, -6, pi/7) ax.transData
rect = patches.Rectangle(trans.transform((1,2)),3,4, angle = pi/7)
ax.add_patch(rect)
art3d.pathpatch_2d_to_3d(rect, z=0, zdir="z")
Чтение https://matplotlib.org/stable/tutorials/advanced/transforms_tutorial.html, Я понял, что ax.transData
вызывает проблемы. Опуская это со второй попытки, я получаю что-то близкое: по крайней мере, теперь прямоугольник имеет разумный размер. Но он находится не совсем в нужном положении.
Комментарии:
1. Мне удалось заставить все работать, с помощью чего-то похожего на мою вторую попытку. Однако мне хотелось бы найти решение, в котором я мог бы применить преобразования к самим патчам, вместо того, чтобы выяснять, как преобразовать входные данные, как я сделал во второй попытке.