簡體   English   中英

如何使用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的線根據是否選中相應的復選框來顯示。

兩者都選中時:

在此處輸入圖片說明

僅檢查第二個時:

在此處輸入圖片說明

你明白了。

我遇到的問題是,我似乎無法以正確的方式來實現我想做的事情,或者從哪個類中找出要使用的方法。 我所做的任何嘗試幾乎都不會導致任何變化,或者圖形部分會完全消失。

概括地說,這就是我要執行的操作:選中(完成)復選框時出現行取消選中(未完成)復選框時,行消失

此外,如果這是我需要采取的措施,則每次都可以重畫整個內容。

我想到了。

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(要清除的軸)),然后重復該過程,然后重新繪制。

希望這對遇到此問題的其他人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM