Изменить данные Matplotlib в графическом интерфейсе

Я разработал графический интерфейс с Python PyQT. Там у меня есть фигура matplotlib с x,y-Data и vlines, которая должна динамически меняться с помощью QSlider.

Прямо сейчас я изменяю данные, просто удаляя все и снова рисуя, но это не эффективно

Вот как я это делаю:

 def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg):
    if PlotNr == 2:
        self.axes.cla()
        self.axes.plot(xData, Data, color='b', linewidth=2)             
        self.axes.vlines(valueSlider1,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4)
        self.axes.vlines(valueSlider2,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4)
        self.axes.text(1,0.8*max(Data),str(np.round(width_wg,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.text(1,0.6*max(Data),"Pos1: "+str(round(valueSlider1,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.text(1,0.4*max(Data),"Pos2: "+str(round(valueSlider2,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.grid(True)
        self.draw()

"vlines" - это LineCollections в matplotlib. Я искал в документации, но не смог найти подсказки для такой функции, как 'set_xdata'. Как я могу изменить значение x вертикальных линий, когда они уже нарисованы и встроены в FigureCanvas?

У меня та же проблема с изменением данных x и y. При попытке использования известных функций matplotlib, таких как 'set_data', я получаю сообщение об ошибке, что AxisSubPlot не имеет этого атрибута.

Ниже приведен мой код для класса FigureCanvas. Def update_verticalLines должен содержать только команды для изменения координаты x строк, а не для полной перерисовки.


Изменить: решение

Спасибо @Craigular Джо. Это было не совсем так, как у меня. Мне нужно было что-то изменить:

def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg):

    self.vLine1.remove()
    self.vLine1 = self.axes.vlines(valueSlider1,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)
    self.vLine2.remove()
    self.vLine2 = self.axes.vlines(valueSlider2,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)            
    self.axes.draw_artist(self.vLine1)
    self.axes.draw_artist(self.vLine2)
    #self.update()
    #self.flush_events()        
    self.draw() 

update () не работал без draw(). (Старые vlines остались) flush_events() сделала что-то безумное. У меня есть два экземпляра FigureCanvas. flush_events() вызвал то, что во втором вызове экземпляра vlines перемещаются с помощью ползунка, но затем возвращаются в начальную позицию.

2 ответа

Решение

Когда вы создаете vlines, сохраняйте ссылку на них, например,

self.my_vlines = self.axes.vlines(...)

так что, когда вы хотите изменить их, вы можете просто удалить и заменить их, например,

self.my_vlines.remove()
self.my_vlines = self.axes.vlines(...)

# Redraw vline
self.axes.draw_artist(self.my_vlines)
# Add newly-rendered lines to drawing backend
self.update()
# Flush GUI events for figure
self.flush_events()

Кстати, в будущем вы должны постараться сократить пример кода до основных частей. Наличие большого количества ненужного примера кода затрудняет понимание вашего вопроса.:)

Спасибо @Craigular Джо . Это было не совсем так, как это работало для меня. Мне нужно было что-то изменить:

      def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg):
                
    self.vLine1.remove()
    self.vLine1 = self.axes.vlines(valueSlider1,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)
    self.vLine2.remove()
    self.vLine2 = self.axes.vlines(valueSlider2,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)            
    self.axes.draw_artist(self.vLine1)
    self.axes.draw_artist(self.vLine2)
    #self.update()
    #self.flush_events()        
    self.draw() 

update()не работал безdraw(). (Старые vlines остались) сделал некоторые сумасшедшие вещи. У меня есть два экземпляраFigureCanvas.flush_events()вызвало то, что во втором вызове экземпляра vlines перемещались вместе с ползунком, но затем возвращались в исходное положение.


Этот ответ был опубликован как редактирование вопроса об изменении данных matplotlib в графическом интерфейсе OP user5243337 в соответствии с CC BY-SA 3.0.

Другие вопросы по тегам