在 PyQT4 中修改 Matplotlib 图形轴
Modifying Matplotlib figure axes within PyQT4
我想创建一个在 PyQT4 GUI 中嵌入 Matplotlib 动画的应用程序。我试图弄清楚 FigureCanvasQTAgg 对象如何工作的基础知识,并且在创建后无法更改轴限制。在下面的程序中,使用 FigureCanvasQTAgg 对象生成了一个非常简单的图形,我想按下按钮来更改生成的绘图的 x 轴范围。 (注意以下代码是末尾代码的简化版)
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class Window(QtGui.QDialog):
def __init__(self):
super(Window, self).__init__()
self.fig = Figure()
self.canvas = FigureCanvas(self.fig)
self.ax = self.fig.add_subplot(111) # create an axis
self.ax.hold(False) # discards the old graph
self.ax.set_xlim([0, 100])
self.ax.set_ylim([-10, 10])
self.ax.set_xlabel('Random x label')
self.button = QtGui.QPushButton('Adjust axes')
self.button.clicked.connect(self.axis_adjust)
# set the layout
layout = QtGui.QVBoxLayout()
layout.addWidget(self.canvas)
layout.addWidget(self.button)
self.setLayout(layout)
self.canvas.draw()
def axis_adjust(self):
self.ax.set_xlim([0, 200])
self.ax.set_xlabel('New label')
app = QtGui.QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())
不幸的是,当我运行我的程序并点击"Adjust axes"按钮时,它完全没有效果。我根本不明白的一件事是 self.canvas.draw()
行的作用。从 a Matplotlib tutorial,我得到的印象是这使得图形实际上出现在 GUI 中 window...但事实并非如此,因为当我注释掉行 self.canvas.draw()
时,图仍然出现在 GUI window 中。实际上是 self.setLayout(layout)
行使图形出现在 GUI window 中,从我所读的内容来看这没有任何意义。看来我对这个功能缺乏理解是我问题的根源......
我之前写过一个简单的应用。根据我的经验,必须在更新设置或使用 matplotlib 功能绘制曲线(或任何其他对象)后调用 self.canvas.draw()
。它只是一个触发任何图形对象更新的函数。因此,只需将 self.canvas.draw()
添加到回调函数的末尾 axis_adjust()
即可解决您的问题。
仅供参考,您的 UI 的层次结构将是 QtGui.QDialog
->QtGui.QVBoxLayout
->FigureCanvas
->matplotlib.figure.Figure
我想创建一个在 PyQT4 GUI 中嵌入 Matplotlib 动画的应用程序。我试图弄清楚 FigureCanvasQTAgg 对象如何工作的基础知识,并且在创建后无法更改轴限制。在下面的程序中,使用 FigureCanvasQTAgg 对象生成了一个非常简单的图形,我想按下按钮来更改生成的绘图的 x 轴范围。 (注意以下代码是
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class Window(QtGui.QDialog):
def __init__(self):
super(Window, self).__init__()
self.fig = Figure()
self.canvas = FigureCanvas(self.fig)
self.ax = self.fig.add_subplot(111) # create an axis
self.ax.hold(False) # discards the old graph
self.ax.set_xlim([0, 100])
self.ax.set_ylim([-10, 10])
self.ax.set_xlabel('Random x label')
self.button = QtGui.QPushButton('Adjust axes')
self.button.clicked.connect(self.axis_adjust)
# set the layout
layout = QtGui.QVBoxLayout()
layout.addWidget(self.canvas)
layout.addWidget(self.button)
self.setLayout(layout)
self.canvas.draw()
def axis_adjust(self):
self.ax.set_xlim([0, 200])
self.ax.set_xlabel('New label')
app = QtGui.QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())
不幸的是,当我运行我的程序并点击"Adjust axes"按钮时,它完全没有效果。我根本不明白的一件事是 self.canvas.draw()
行的作用。从 a Matplotlib tutorial,我得到的印象是这使得图形实际上出现在 GUI 中 window...但事实并非如此,因为当我注释掉行 self.canvas.draw()
时,图仍然出现在 GUI window 中。实际上是 self.setLayout(layout)
行使图形出现在 GUI window 中,从我所读的内容来看这没有任何意义。看来我对这个功能缺乏理解是我问题的根源......
我之前写过一个简单的应用。根据我的经验,必须在更新设置或使用 matplotlib 功能绘制曲线(或任何其他对象)后调用 self.canvas.draw()
。它只是一个触发任何图形对象更新的函数。因此,只需将 self.canvas.draw()
添加到回调函数的末尾 axis_adjust()
即可解决您的问题。
仅供参考,您的 UI 的层次结构将是 QtGui.QDialog
->QtGui.QVBoxLayout
->FigureCanvas
->matplotlib.figure.Figure