1

我正在使用 Python 3 来分析实验数据。为此,我创建了一个带有 load 和 fit 方法的 Data 类,我想要完成的是这两种方法都定义(或重新定义)属性 Data.figure 并且在运行之后,我希望能够访问该属性和绘制图形。

所以我不知道如何在运行这些方法时创建绘图,但在创建过程中没有显示它,但之后在命令中访问图形属性时显示它。

我的代码(不工作)简化看起来像这样

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def expo(x, A, inv_tau):
    return A * np.exp(-inv_tau * x)

class Data:

    def load(self, file_name, parameter, bins=50):
        """Data loading"""

        self.file_name = file_name
        self.parameter = parameter
        dt = np.dtype([(self.parameter, '<f4'), ('molecules', '<f4')])
        self.table = np.fromfile(file_name, dtype=dt)

        # HISTOGRAM CONSTRUCTION
        self.mean = np.mean(self.table[self.parameter])
        self.hist, bin_edges = np.histogram(self.table[self.parameter],
                                            bins=bins,
                                            range=(0, bins * self.mean / 10))
        self.bin_centres = (bin_edges[:-1] + bin_edges[1:]) / 2
        self.bin_width = bin_edges[1] - bin_edges[0]

    def plot(self):
        """Data plotting"""

        # PLOT THE HISTOGRAM
        fig = plt.figure()
        plt.bar(self.bin_centres, self.hist, self.bin_width)
        self.figure = fig

    def fit(self, fit_start=0):
        """Histogram fitting"""

        self.fit_guess = [self.hist[0], 1 / self.mean]
        self.fit_par, self.fit_var = curve_fit(expo,
                                               self.bin_centres[fit_start:-1],
                                               self.hist[fit_start:-1],
                                               p0=self.fit_guess)
        self.tau = 1 / self.fit_par[1]

        # PLOT
        fig = plt.figure()
        hist_fit = expo(self.bin_centres, *self.fit_par)
        plt.bar(self.bin_centres, self.hist, self.bin_width)
        plt.plot(self.bin_centres[fit_start:-1], hist_fit[fit_start:-1])
        self.figure = fig

if __name__ == "__main__":

    data1.load(os.path.join(dirname, file_list[i]))
    data1.fit()
    print(data1.tau)

    data1.figure

这段代码有两个不想要的结果:fit 方法返回一个绘图图(我不想要),最后一行“data1.figure”没有得到绘图,它什么也不做。

我究竟做错了什么?

并且独立于解决问题,你认为有更好的方法来做我想做的事吗?

谢谢!

4

1 回答 1

0

定义self.figself.axplot

def plot(self):
    """Data plotting"""

    # PLOT THE HISTOGRAM
    self.fig, self.ax = plt.subplots()
    hist_fit = expo(self.bin_centres, *self.fit_par)
    self.ax.bar(self.bin_centres, self.hist, self.bin_width)
    self.ax.plot(self.bin_centres[fit_start:-1], hist_fit[fit_start:-1])

将用于拟合数据的代码与绘图代码分开:

def fit(self, fit_start=0):
    """Histogram fitting"""

    self.fit_guess = [self.hist[0], 1 / self.mean]
    self.fit_par, self.fit_var = curve_fit(expo,
                                           self.bin_centres[fit_start:-1],
                                           self.hist[fit_start:-1],
                                           p0=self.fit_guess)
    self.tau = 1 / self.fit_par[1]

然后调用绘图方法:

if __name__ == "__main__":

    data1.load(os.path.join(dirname, file_list[i]))
    data1.fit()
    print(data1.tau)
    data1.plot()
    data1.figure

如果你想重用同一个轴来做更多的绘图,那么在 plot 方法之外定义一个

fig, ax = plt.subplots()

并将 传递ax给 plot 方法作为参数:

def plot(self, ax):
    hist_fit = expo(self.bin_centres, *self.fit_par)
    ...    

fig, ax = plt.subplots()
data1.plot(ax)
于 2013-10-04T12:38:23.293 回答