python
复制代码
# matplotlib canvas
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
#Pyqt5
from PyQt5.QtWidgets import QSizePolicy, QWidget, QVBoxLayout
class MplCanvas(FigureCanvas):
"""
创建一个 Matplotlib 画布类,继承自 FigureCanvasQTAgg。
这样可以更好地封装和复用图表逻辑。
"""
def __init__(self, width, height, pic_dpi):
# 创建一个 Figure 对象
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
python
复制代码
def plot(self):
#清空绘图区域
self.ui.widget.canvas.fig.clear()
fig = self.ui.widget.canvas.fig
# 使用axes绘图
ax = fig.add_subplot(111)
mu, sigma = 100, 15
# 产生高斯分布的智商数据
x = mu + sigma * np.random.randn(10000)
# the histogram of the data 频率直方图
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')
# 加入latex表达
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()