2015-07-26 2 views
0

У меня есть QWidget, который я использую для размещения некоторых графиков matplotlib. У меня несколько графиков (2 на данный момент, но это будет увеличиваться), но пока отображается только один график. У меня есть событие тайм-аута, так что каждые 5 секунд текущий сюжет «удаляется» из виджета, а следующий график добавляется к виджету. Это мой первый опыт работы с matplotlib, поэтому я не уверен, правильный ли мой подход (ниже).Цикл между двумя графиками matplotlib в QWidget

Настройка двух участков:

#PLOT 1 
Data = #inherited from another class 
DataArray = #inherited from another class 

DataPos = DataArray > 0 
DataNeg = DataArray < 0 

self.Figure1 = plt.figure('Figure1') 
self.Figure1.patch.set_alpha(0) 
self.Canvas1 = FigureCanvas(self.Figure1) 
self.LayoutWidget.addWidget(self.Canvas1) 

self.Ax1 = plt.subplot(1, 1, 1, axisbg='black') 
self.Ax1.bar(np.arange(len(DataArray))[DataPos], DataArray[DataPos], width=1, color='blue') 
self.Ax1.bar(np.arange(len(DataArray))[DataNeg], DataArray[DataNeg], width=1, color='red') 
self.Ax1.tick_params(axis='y', colors='white') 
plt.title('GRAPH TIME', color='w', fontsize=30, fontname='Sans Serif', fontweight='bold' 
self.Figure1.tight_layout() 
plt.close() #Not sure if/why I need this line? 

#PLOT 2 
Radius = [1, 2, 3, 4, 5, 6] 
Area = [1, 4, 2, 4, 6, 8] 
self.Figure2 = plt.figure('Figure2') 
self.Figure2.patch.set_alpha(0) 
self.Canvas2 = FigureCanvas(self.Figure2) 

self.Ax2 = plt.subplot(1, 1, 1, axisbg='black') 
self.Ax2.tick_params(axis='y', colors='white') 
plt.title('GRAPH TITLE', colors='w', fontsize=30, fontname='Sans Serif', fontweight='bold') 
self.Figure2.tight_layout() 
plt.plot(Radius, Area, color='blue', linewidth=5) 
plt.close() #Again, not sure if/why this is needed. 

и функция тайм-аута, который изменяет сюжет в виджете:

#if current plot = 1: 
    self.LayoutWidget.removeWidget(self.Canvas1) 
    self.LayoutWidget.addWidget(self.Canvas2) 
    #This works as desired! 

#elif current plot = 2: 
    self.LayoutWidget.removeWidget(self.Canvas2) 
    self.LayoutWidget.addWidget(self.Canvas1) 
    #This doesn't work! 

#Stop the timeout timer, then restart the timer, etc. 

Является ли это приемлемым подходом?

ответ

0

Я играл с этим в течение последнего часа или около того и достиг желаемой функциональности. В моем исходном коде было несколько вещей, которые нужно было изменить. Вот исправленный код, который работает по желанию.

Настройка двух участков:

#PLOT 1 
Data = #inherited from another class 
DataArray = #inherited from another class 

DataPos = DataArray > 0 
DataNeg = DataArray < 0 

self.Figure1 = plt.figure('Figure1') 
self.Figure1.patch.set_alpha(0) 
self.Canvas1 = FigureCanvas(self.Figure1) 
self.LayoutWidget.addWidget(self.Canvas1) 

self.Ax1 = plt.subplot(1, 1, 1, axisbg='black') 
self.Ax1.bar(np.arange(len(DataArray))[DataPos], DataArray[DataPos], width=1, color='blue') 
self.Ax1.bar(np.arange(len(DataArray))[DataNeg], DataArray[DataNeg], width=1, color='red') 
self.Ax1.tick_params(axis='y', colors='white') 
plt.title('GRAPH TIME', color='w', fontsize=30, fontname='Sans Serif', fontweight='bold' 
self.Figure1.tight_layout() 
self.Canvas1.show() 

#PLOT 2 
Radius = [1, 2, 3, 4, 5, 6] 
Area = [1, 4, 2, 4, 6, 8] 
self.Figure2 = plt.figure('Figure2') 
self.Figure2.patch.set_alpha(0) 
self.Canvas2 = FigureCanvas(self.Figure2) 

self.Ax2 = plt.subplot(1, 1, 1, axisbg='black') 
self.Ax2.tick_params(axis='y', colors='white') 
plt.title('GRAPH TITLE', colors='w', fontsize=30, fontname='Sans Serif', fontweight='bold') 
self.Figure2.tight_layout() 
plt.plot(Radius, Area, color='blue', linewidth=5) 

И функция тайм-аут:

#if current plot = 1: 
    self.Canvas1.close() 
    self.LayoutWidget.removeWidget(self.Canvas1) 
    self.LayoutWidget.addWidget(self.Canvas2) 
    self.Canvas2.show() 

#elif current plot = 2: 
    self.Canvas2.close() 
    self.LayoutWidget.removeWidget(self.Canvas2) 
    self.LayoutWidget.addWidget(self.Canvas1) 
    self.Canvas1.show() 

#Stop the timeout timer, then restart the timer, etc. 

просто!

+0

Я еще не пробовал это, но вы считали что-то вроде QTabWidget. Вы можете добавить новые вкладки, чтобы содержать каждый график с помощью метода 'addTabs()' и программно программировать с помощью 'setCurrentIndex()' http://doc.qt.io/qt-4.8/qtabwidget.html#details. также дает вам/пользователю некоторую визуальную информацию о том, сколько графиков есть, и о позиции в последовательности. –

+0

... или во второй мысли есть только одна область графика, а затем в вашем таймере просто очистить оси и перестроить следующий элемент в последовательности. Таким образом, вы не имеете кучу объекта фигуры/холста/оси, плавающего вокруг. Всего 1 фигура/холст/оси и несколько массивов данных. –

+0

Я рассмотрел оба этих подхода, но остановился на этом подходе для простоты. Мне нравится тот факт, что сюжет генерируется только один раз, а затем скрыт/показан, в отличие от необходимости пересчитывать сюжет, который часто содержит тысячи точек данных. Спасибо за ваш вклад! – jars121

Смежные вопросы