lmfit,result.plot_fit(ax) 没有在 pyqt 中绘制所有 3 个图
lmfit, result.plot_fit(ax) not plotting all 3 plots in pyqt
我有一个 pyqt5 小部件
class MPLibWidget(QtWidgets.QWidget):
"""
base MatPlotLib widget
"""
def __init__(self, parent=None):
super(MPLibWidget, self).__init__(parent)
self.figure = Figure()
self.canvas = FigureCanvasQTAgg(self.figure)
self.canvas.setParent(self)
self.mpl_toolbar = NavigationToolbar2QT(self.canvas, self)
self.canvas.mpl_connect('key_press_event', self.on_key_press)
self.axes = self.figure.add_subplot(111)
self.axes.hold(False)
当我尝试使用 result.plot_fit(ax=ax) 拟合时,它只绘制绘图拟合的数据列。不是 init_fit 或 best_fit。
def fit(self, data, widget):
self.layers = ['Air', 'BK7', 'SLG']
wv = np.arange(400, 900)
mod = lmfit.Model(self.get_R, ['wavelengths'], ['thickness', 'void_percent'])
mod.set_param_hint('thickness', value=130, min=50, max=250)
mod.set_param_hint('void_percent', value=.15, min=.05, max=.5)
R = data.norm(wv)
result = mod.fit(R, wavelengths=wv)
RMSE = (sp.sum(result.residual**2)/(result.residual.size-2))**0.5
bf_values = result.best_values
bf_str = 'thk: ' + str(round(bf_values['thickness'])) + ", Void %: " + str(round(bf_values['void_percent']*100, 2))
txt_spot = wv.min()-100 + (wv.max()-wv.min()) / 2
ax = widget.figure.axes[0]
result.plot_fit(ax=ax, datafmt='b+', initfmt='r--', fitfmt='g-')
ax.text(txt_spot, .9, "RMSE: "+str(round(RMSE, 3)))
ax.text(txt_spot, .85, bf_str)
widget.canvas.draw()
如果我不使用 (ax=ax) 而只使用 plot_fit(),那么 plt.show() 它可以很好地绘制所有三个轴,但它会打开一个新的 window .我希望情节显示在我程序中的小部件中。
带有 ax=ax 的内部小部件
刚好适合的外部小部件
self.axes.hold(False)
行中的问题,在每次调用 plot
等之前清除数字。 plot_fit
绘制的最后一行是 'data',因此您得到的只是数据线。
一般不要使用hold(False)
,我们正在考虑将其从上游移除。
我有一个 pyqt5 小部件
class MPLibWidget(QtWidgets.QWidget):
"""
base MatPlotLib widget
"""
def __init__(self, parent=None):
super(MPLibWidget, self).__init__(parent)
self.figure = Figure()
self.canvas = FigureCanvasQTAgg(self.figure)
self.canvas.setParent(self)
self.mpl_toolbar = NavigationToolbar2QT(self.canvas, self)
self.canvas.mpl_connect('key_press_event', self.on_key_press)
self.axes = self.figure.add_subplot(111)
self.axes.hold(False)
当我尝试使用 result.plot_fit(ax=ax) 拟合时,它只绘制绘图拟合的数据列。不是 init_fit 或 best_fit。
def fit(self, data, widget):
self.layers = ['Air', 'BK7', 'SLG']
wv = np.arange(400, 900)
mod = lmfit.Model(self.get_R, ['wavelengths'], ['thickness', 'void_percent'])
mod.set_param_hint('thickness', value=130, min=50, max=250)
mod.set_param_hint('void_percent', value=.15, min=.05, max=.5)
R = data.norm(wv)
result = mod.fit(R, wavelengths=wv)
RMSE = (sp.sum(result.residual**2)/(result.residual.size-2))**0.5
bf_values = result.best_values
bf_str = 'thk: ' + str(round(bf_values['thickness'])) + ", Void %: " + str(round(bf_values['void_percent']*100, 2))
txt_spot = wv.min()-100 + (wv.max()-wv.min()) / 2
ax = widget.figure.axes[0]
result.plot_fit(ax=ax, datafmt='b+', initfmt='r--', fitfmt='g-')
ax.text(txt_spot, .9, "RMSE: "+str(round(RMSE, 3)))
ax.text(txt_spot, .85, bf_str)
widget.canvas.draw()
如果我不使用 (ax=ax) 而只使用 plot_fit(),那么 plt.show() 它可以很好地绘制所有三个轴,但它会打开一个新的 window .我希望情节显示在我程序中的小部件中。
带有 ax=ax 的内部小部件
self.axes.hold(False)
行中的问题,在每次调用 plot
等之前清除数字。 plot_fit
绘制的最后一行是 'data',因此您得到的只是数据线。
一般不要使用hold(False)
,我们正在考虑将其从上游移除。