График меняет свой размер, если я отображаю изображение

#python #matplotlib #rectangles

#python #matplotlib #прямоугольники

Вопрос:

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

 ax3.imshow(img, extent=[x1, x3, 0, max(ID2)])
  

Третий график меняет свой размер после выбора области с помощью селектора прямоугольников.
Без строки 47 он работает нормально.
У вас есть идея, в чем проблема?

График 1 и 2: ось x: пройденный путь, ось y: скорость

график 3: ось x: пройденный путь, ось y: Wt (устройство перемещается по конвейеру. Верхняя и нижняя строки — это диаметр трубопровода.)

Дополнительно это моя фотография. (На данный момент это просто красный фон, созданный из paint в качестве заполнителя, и я могу видеть, работает ли код.)
введите описание изображения здесь

У меня есть еще один вопрос, на который вы можете ответить: возможно ли, что прямоугольник остается с максимальным размером по оси y. Это означает, что я могу перемещать его только вправо и влево, а не вверх и вниз.

Надеюсь, я написал это достаточно ясно. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

Спасибо и с наилучшими пожеланиями

 from matplotlib.widgets import RectangleSelector
import matplotlib.pyplot as plt


'''Daten einlesen'''

x = [1,2,3,4,5,6,7,8,9,10]
y = [1,1,2,1,0,0,1,3,5,1]
ID1 = [5,5,5,5,5,5,5,5,5,5]
ID2 = [200,200,200,200,200,200,200,200,200,200]

img = plt.imread("bild.png")

'''PLotten'''

plt.close()

fig, (ax1, ax2, ax3) = plt.subplots(3)


def Daten_plotten (ax, xx, yy):
    ax.plot(xx,yy)
    ax.set_xlim([min(xx)-1, max(xx) 1])
    ax.set_ylim([min(yy)-0.5, max(yy) 0.5])

Daten_plotten(ax1,x,y,)
Daten_plotten(ax2,x,y)
Daten_plotten(ax3,x,ID1)
Daten_plotten(ax3,x,ID2)
ax3.set_xlim([min(x), max(x)])
ax3.set_ylim([0,max(ID2) 1])


def line_select_callback_ax1(eclick, erelease):
    'eclick and erelease are the press and release events'
    x1, y1 = eclick.xdata, min(y)-0.5
    x2, y2 = erelease.xdata, max(y) 0.5
    x3 = x1   (x2-x1)/2
    
    print("(%3.2f) --> (%3.2f)" % (x1, x2))
    print(x3)
                  
    ax2.set_xlim([x1, x2])
    ax2.set_ylim([y1, y2])
    
    
    ax3.imshow(img, extent=[x1, x3, 0, max(ID2)])
   
    ax3.set_xlim([x1, x2])
    ax3.set_ylim([0, max(ID2) 1])
    
    plt.pause(0.01)
    fig.canvas.draw

RS = RectangleSelector(ax1, line_select_callback_ax1,
                                       drawtype='box', useblit=True,
                                       button=[1, 3],  # don't use middle button
                                       minspanx=1, minspany=1,
                                       spancoords='pixels',
                                       interactive=True)

plt.show()
  

Комментарии:

1. По умолчанию imshow соотношение сторон данных устанавливается равным 1: 1, поэтому при выборе области размер осей изменяется в соответствии с соотношением сторон выбранного вами диапазона данных. Вы можете установить aspect='auto' вместо этого, если хотите, чтобы оси оставались того же размера.

2. Это работает. Спасибо.