
PltQWidget(matplotlib绘图窗体) - 作为完整的模块(plt_qt5)使用
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from PyQt5.QtWidgets import QSizePolicy, QWidget, QVBoxLayout
class MplCanvas(FigureCanvas):
"""
创建一个 Matplotlib 画布类,继承自 FigureCanvasQTAgg。
这样可以更好地封装和复用图表逻辑。
"""
def __init__(self, width, height, pic_dpi):
self.fig = Figure((width, height), dpi=pic_dpi)
super(MplCanvas, self).__init__(self.fig)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
class PltQWidget(QWidget):
def __init__(self, width, height, parent, is_navigate, dpi):
super(PltQWidget, self).__init__(parent)
self.canvas = MplCanvas(width, height, dpi)
layout = QVBoxLayout(parent)
layout.addWidget(self.canvas)
if is_navigate:
toolbar = NavigationToolbar(self.canvas, self)
toolbar.setFixedHeight(35)
layout.addWidget(toolbar)
layout.setSpacing(5)
self.setLayout(layout)
@classmethod
def from_widget(cls,
widget: QWidget,
parent=None,
is_navigate=True,
dpi=100,
**kwargs):
width = widget.width() / dpi
height = widget.height() / dpi
if is_navigate:
height -= 0.52
plt_widget = cls(width, height, parent, is_navigate, dpi)
plt_widget.__dict__.update(widget.__dict__)
for key, value in kwargs.items():
setattr(plt_widget, key, value)
return plt_widget
如何使用
- 正常设计,注意需要作为绘图窗体用QWidget进行设计
- 导入PltQWidget
- 初始化ui设计
- 将设计的窗体QWidget替换为PltQWidget
- 使用plt绘图(使用PltQWidget的fig: matplotlib.figure.Figure)
from plt_qt5 import PltQWidget
class GraphFormUI(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
...
self.ui.widget = PltQWidget.from_widget(self.ui.widget,
parent=self.ui.widget)
...
绘图示例
def plot(self):
self.ui.widget.canvas.fig.clear()
fig = self.ui.widget.canvas.fig
ax = fig.add_subplot(111)
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
ax.hist(x, 50, density=1, facecolor='g', alpha=0.75)
ax.set_xlabel('Smarts')
ax.set_ylabel('Probability')
ax.set_title('Histogram of IQ')
ax.text(60, .025, r'$\mu=100,\ \sigma=15$')
ax.axis([40, 160, 0, 0.03])
ax.grid(True)
fig.tight_layout()
fig.canvas.draw_idle()
QApplication.processEvents()