2017-02-16 30 views
1

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

Сейчас я изменить данные только с удалением все и сюжет еще раз, но это не является эффективным

Это, как я это делаю:

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-координаты vlines и не полного перерисовки.


Edit: решение

Благодаря @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() 

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

ответ

0

Когда вы создаете 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() 

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

+0

Спасибо! мои винглы теперь движутся быстро с помощью ползунка. Но я не мог использовать flush_events(). Влинии второго экземпляра с этим не работали. – Saorsa