Я пытаюсь нанести изображение на повернутые относительно существующих осей.
В настоящее время я использую matplotlib - но если мне нужно переключиться на что-то другое - я в порядке (если он вызывается из Python).
Я пробовал плавающие_оси и простой Affine2D, но изо всех сил пытался понять, как управлять положением новых осей и графиком imshow внутри него. Похоже, что в обоих случаях я упускаю что-то очень простое, но не могу понять, что это может быть.
Figure1
#%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
import mpl_toolkits.axisartist.floating_axes as floating_axes
import numpy as np
fig,ax = plt.subplots()
y=[1,2,3,0,5,3,2,1,2,3,2,1,2,3,2,1,2,3,3,4]
x=np.arange(len(y))
plt.plot(x,y)
ax.set_xlim((0,np.max(x)+1))
ax.set_ylim((0,np.max(y)))
ax.set_xticks(x)
plot_extents = 0, 10, 0, 10
transform = Affine2D().scale(1,1).rotate_deg(20)
helper = floating_axes.GridHelperCurveLinear(transform, plot_extents)
ax1 = floating_axes.FloatingSubplot(fig, 111, grid_helper=helper)
fig.add_subplot(ax1)
aux_ax = ax1.get_aux_axes(transform)
aux_ax.imshow(np.arange(100).reshape([10,10]))
plt.show()
и Figure2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
def do_plot(ax, Z, transform):
im = ax.imshow(Z, interpolation='none',
origin='lower',
extent=[-3, 3, -4, 2], clip_on=True)
trans_data = transform + ax.transData
im.set_transform(trans_data)
# display intended extent of the image
x1, x2, y1, y2 = im.get_extent()
ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "y--",
transform=trans_data)
ax.set_xlim(-5, 5)
ax.set_ylim(-6, 6)
# prepare image and figure
fig, ax = plt.subplots()
ax.plot(np.arange(9)-4,np.random.permutation(9)-4)
Z = np.arange(100).reshape([10,10])
# image rotation
do_plot(ax, Z, mtransforms.Affine2D().scale(1,1).rotate_deg(30))
plt.show()
Figure1 выглядит так:
Как вы можете видеть, график imshow смещен относительно своей оси (это не происходит с графиком или разбросом). Изменение угла также изменяет начало плавающих осей (относительно главных осей), и я не знаю, как это контролировать.
Figure2 выглядит так:
И на этот раз я не вижу точек с плавающей осью - поэтому не знаю, выключен ли график изображения - но также неясно, как управлять смещением.
Я пытаюсь построить что-то вроде этого:
fig,ax=plt.subplots()
ax.plot([1,2,3,4,5],[5,2,1,2,5])
rotated_ax = ax.create_new_axes(originx=2.6, originy=3.5,\
width=10, hight=9, rotation=20)
#or alternatively
rotated_ax = ax.create_new_axes(originx=2.6, originy=3.5,\
right_top_corner_x=12, right_top_corner_y=13, projection='rect')
rotated_ax.imshow(np.arange(90).reshape([10,9]))
plt.show()
Это должно нарисовать линию на исходных осях.
А затем поверх него создайте новые оси с левым нижним углом (начало координат), расположенным в точке (2.6,3.5) и высотой 9 и шириной = 10, а также повернутыми на 20 градусов против часовой стрелки.
Я уверен, что чего-то не хватает в приведенном выше описании, но я рад, что кто-то прояснил и предложил некоторые возможные обходные пути.