Построить графическое представление на плавающих осях в данном начале относительно главных осей в питоне matplotlib - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь нанести изображение на повернутые относительно существующих осей. В настоящее время я использую 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 выглядит так:

figure1

Как вы можете видеть, график imshow смещен относительно своей оси (это не происходит с графиком или разбросом). Изменение угла также изменяет начало плавающих осей (относительно главных осей), и я не знаю, как это контролировать.

Figure2 выглядит так:

enter image description here

И на этот раз я не вижу точек с плавающей осью - поэтому не знаю, выключен ли график изображения - но также неясно, как управлять смещением.

Я пытаюсь построить что-то вроде этого:

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 градусов против часовой стрелки.

Я уверен, что чего-то не хватает в приведенном выше описании, но я рад, что кто-то прояснил и предложил некоторые возможные обходные пути.

...