如何使用 matplotlib 有选择地擦除 2 y 轴子图上的线条。(Python)

How do I selectively erase lines on a 2 y-axis subplot using matplotlib.(Python)

这是我目前使用的代码:

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 的线根据相应的复选框是否被选中来显示。

当两者都被选中时:

只勾选第二个时:

你懂的。

我遇到的问题是,我似乎既无法以正确的方式实现它来促进我想做的事情,也无法从中找出使用哪种方法 class。几乎我尝试过的任何结果都没有任何变化或图表部分完全消失。

总而言之,这就是我想要做的: 选中复选框时出现线条(完成) 取消选中复选框时线条消失(未完成)

此外,如果我需要求助于此,每次都重新绘制整个内容也可以。

我想通了。

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(要清除的轴))并重复该过程,然后重新绘制。

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