Как построить разные графики на разных холстах в PyQt4 в окне?
Я пытаюсь кодировать с python3 графический интерфейс, который отображает 4 различных графика в 4 соответствующих макетах: скорость, высота, координаты и угол. Прямо сейчас я могу нарисовать фигуру в каждом соответствующем макете. Тем не менее, я понятия не имею, как построить различные функции в каждом графике. Я использовал метод случайного генерирования 10 точек для построения графика. Когда метод вызывается, он выводит один и тот же график на каждый 4 холста.
Так что мой вопрос - **, если есть в любом случае, чтобы построить другую функцию соответственно фигуре (один график на график)?** Я довольно плохо знаком с Python3 и был бы благодарен за любую помощь, оказанную.
Если это возможно, я бы хотел избежать использования большого числа вспомогательных участков на рисунке, поскольку макет для каждого рисунка уже существует.
Вот как выглядит текущий графический интерфейс, когда я вызываю метод test, который генерирует случайные точки, вы можете видеть, что один и тот же график строится на каждом холсте
Я также упомяну, если он добавляет какие-либо ограничения, этот код в конечном итоге будет использоваться для построения графика, который будет обновляться данными, поступающими из другого потока.
И вот код:
from PyQt4 import QtGui
from .flight_dataUI import Ui_Dialog
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
import random
class FlightData(QtGui.QDialog, Ui_Dialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.figure = plt.figure() # FlightData.figure = matplotlib.pyplot.figure()
# Creates a figure widget self.name = FigureCanvas(self.figure)
self.speedGraph = FigureCanvas(self.figure)
self.heightGraph = FigureCanvas(self.figure)
self.mapGraph = FigureCanvas(self.figure)
self.angleGraph = FigureCanvas(self.figure)
# -------------------------------------------------------------
self.speedLayout.addWidget(self.speedGraph) # insert widget "speedGraph" in speedLayout
self.heightLayout.addWidget(self.heightGraph) # insert widget "heightGraph" in heightLayout
self.mapLayout.addWidget(self.mapGraph) # insert widget "mapGraph" in mapLayout
self.angleLayout.addWidget(self.angleGraph) # insert widget "angleGraph" in angleLayout
self.ax = self.figure.add_subplot(111)
self.ax.hold(False)
self.init_widgets()
def init_widgets(self):
self.analyseButton.clicked.connect(self.open_analysedata)
self.draw_plot()
def open_analysedata(self):
self.done(2) # Closes and delete Dialog window et and return the int 2 as a results in main_window.py
def draw_plot(self):
data = [random.random() for i in range(10)]
self.ax.plot(data, '-*')
1 ответ
Если встраивание не импортировать pyplot
Это глобальное состояние только причинит вам неприятности. Вы используете одну и ту же фигуру для инициализации всех 4 FigureCanvas
объекты. Вы хотите сделать что-то вроде:
from matplotlib.figure import Figure
class FlightData(QtGui.QDialog, Ui_Dialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.figs = {}
self.canvas = {}
self.axs = {}
plot_names = ['speed', 'height', 'map', 'angle']
for pn in plot_names:
fig = Figure()
self.canvas[pn] = FigureCanvas(fig)
ax = fig.add_subplot(1, 1, 1)
self.figs[pn] = fig
self.axs[pn] = ax
# -------------------------------------------------------------
self.speedLayout.addWidget(self.canvas['speed'])
self.heightLayout.addWidget(self.canvas['height'])
self.mapLayout.addWidget(self.canvas['map'])
self.angleLayout.addWidget(self.canvas['angle'])
def draw_plot(self, target, data):
self.axs[target].plot(data, '-*')
self.canvas[target].draw_idle()