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 に起因する線を表示することです。

両方がチェックされている場合:

ここに画像の説明を入力

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])

奇妙なエラーが発生するかどうかを確認するために、両方の方法 (リストと行オブジェクト) を試しました。グラフの再描画に戻ると、軸の 1 つをクリアし ( plt.cla() )、そこにプロットし ( self.axis.plot(stuffx, stuffy) )、グラフを再描画する必要がありました。update メソッドが呼び出されるたびに両方の軸が更新されるようにするには、軸 ( plt.sca(axis to be clear) ) を切り替えて、後で再描画してプロセスを繰り返す必要がありました。

これが、この問題に遭遇した他の誰かに役立つことを願っています。

于 2016-03-28T15:55:28.300 に答える