如何使用matplotlib有选择地删除2yaxis子批上的行(Python)

2024-04-24 23:28:31 发布

您现在位置: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的线根据相应的复选框是否被选中来显示。你知道吗

当两者都选中时:

enter image description here

仅选中第二个选项时:

enter image description here

你明白了。你知道吗

我遇到的问题是,我似乎既不能以正确的方式实现它来促进我想做的事情,也不能从哪个类中找出要使用的方法。无论我尝试了什么,结果都没有任何变化,或者图形部分完全消失了。你知道吗

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

而且,如果我需要的话,每次都重新画一遍就可以了。你知道吗


Tags: selfappdefconnectframeqtguiax1addwidget
1条回答
网友
1楼 · 发布于 2024-04-24 23:28:31

我想出来了。你知道吗

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

顺便说一下,这是自身线条2是:self.line1 = matplotlib.lines.Line2D([1,2,3,4,5], [1,2,3,4,5])

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

我希望这能帮助其他遇到这个问题的人。你知道吗

相关问题 更多 >