У меня есть 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.
Является ли это приемлемым подходом?
Я еще не пробовал это, но вы считали что-то вроде QTabWidget. Вы можете добавить новые вкладки, чтобы содержать каждый график с помощью метода 'addTabs()' и программно программировать с помощью 'setCurrentIndex()' http://doc.qt.io/qt-4.8/qtabwidget.html#details. также дает вам/пользователю некоторую визуальную информацию о том, сколько графиков есть, и о позиции в последовательности. –
... или во второй мысли есть только одна область графика, а затем в вашем таймере просто очистить оси и перестроить следующий элемент в последовательности. Таким образом, вы не имеете кучу объекта фигуры/холста/оси, плавающего вокруг. Всего 1 фигура/холст/оси и несколько массивов данных. –
Я рассмотрел оба этих подхода, но остановился на этом подходе для простоты. Мне нравится тот факт, что сюжет генерируется только один раз, а затем скрыт/показан, в отличие от необходимости пересчитывать сюжет, который часто содержит тысячи точек данных. Спасибо за ваш вклад! – jars121