2

这是我到目前为止使用的代码:

class Main:
    app = QtGui.QApplication(sys.argv)

    QtCore.QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
    mainWidget = Gui.PointPredictorGui()
    app.setActiveWindow(mainWidget)
    mainWidget.show()
    app.exec()

class PointPredictorGui(QtGui.QMainWindow):
def __init__(self, parent = None):
    QtGui.QMainWindow.__init__(self)
    frame = QtGui.QFrame()
    hobo = QtGui.QHBoxLayout()
    self.graphFigure = plt.Figure()
    self.graphCanvas = FigureCanvas(self.graphFigure)

    self.ax1 = self.graphFigure.add_subplot(111)
    self.ax2 = self.ax1.twinx()

    self.check1 = QtGui.QCheckBox("1")
    self.check2 = QtGui.QCheckBox("2")

    hobo.addWidget(self.graphCanvas)
    hobo.addWidget(self.check1)
    hobo.addWidget(self.check2)

    frame.setLayout(hobo)
    self.setCentralWidget(frame)
    self.check1.stateChanged.connect(self.updateGraph)
    self.check2.stateChanged.connect(self.updateGraph)

def updateGraph(self):

    if self.check1.isChecked(): self.ax1.plot([1,2,3,4,5], [1,2,3,4,5], '--')
    elif not self.check1.isChecked(): self.eraseMethod()
    if self.check2.isChecked(): self.ax2.plot([1,2,3,4,5], [500,400,300,200,100], '--')
    elif not self.check2.isChecked(): self.eraseMethod()
    self.graphCanvas.draw()

def eraseMethod(self):
    self.graphFigure.clear()

我想要发生的是,我希望归因于轴 1 或 2 的线显示取决于相应的复选框是否被选中。

当两者都被检查时:

在此处输入图像描述

当只检查第二个时:

在此处输入图像描述

你明白了。

我遇到的问题是,我似乎无法以正确的方式实现这一点来促进我想做的事情,或者弄清楚从哪个类中使用哪种方法。我尝试过的几乎所有结果都没有改变,或者图形部分完全消失了。

回顾一下,这就是我想要做的:当复选框被选中时出现线条(完成)当复选框被取消选中时线条消失(未完成)

此外,如果这是我需要求助的,那么每次重绘整个东西都很好。

4

1 回答 1

0

我想到了。

self.graphFigure = plt.figure()

fig, self.ax1 = plt.subplots()
self.ax2 = self.ax1.twinx()

self.graphCanvas = FigureCanvas(fig)

这是图形小部件需要具备的设置才能使我尝试做的事情成为可能。为什么?我不太确定,也许其他人可以回答这个问题。我所知道的是,需要在一个轴一个轴的基础上重绘图表。这是我的更新方法:

def updateGraph(self):
    plt.sca(self.ax2)
    plt.cla()
    plt.sca(self.ax1)
    plt.cla()
    if self.check1.isChecked():
        self.ax1.plot([1,2,3,4,5], [1,2,3,4,5], '--')

    if self.check2.isChecked():
        self.ax2.plot(self.line2.get_xdata(), self.line2.get_ydata(), '--')

    self.graphCanvas.draw_idle()

顺便说一下,self.line2 是这样的:self.line1 = matplotlib.lines.Line2D([1,2,3,4,5], [1,2,3,4,5])

我尝试了两种方法(列表和行对象)来查看是否出现任何奇怪的错误。回到重绘图表,我必须清除其中一个轴( plt.cla() ),然后绘制到它( self.axis.plot(stuffx,stuffy) ),然后重绘图表。为了确保每次调用更新方法时两个轴都得到更新,我必须在轴之间切换( plt.sca(axis to be clear) )并重复该过程,然后重绘。

我希望这对遇到此问题的其他人有所帮助。

于 2016-03-28T15:55:28.300 回答