def save_step_chart(self):
        if self.record_step_chart:
            plt.figure(figsize=(20, 12))

            plt.subplot(511)
            plt.title(r"State (0:state$x$, 1:state$y$)")
            plt.ylim(-0.15, 1.15)
            plt.step(self.steps, self.states, color="#0E7AC4")

            plt.subplot(512)
            plt.title(r"$R_x^W$")
            plt.ylim(-0.05, 1.05)
            plt.step(self.steps, self.rxw_history, color="#0E7AC4")

            plt.subplot(513)
            plt.title(r"$R_y$")
            plt.ylim(-0.05, 1.05)
            plt.step(self.steps, self.ry_history, color="#0E7AC4")

            plt.subplot(514)
            plt.title(r"$K$")
            plt_line(plt, self.random_choices, color='green')
            plt.step(self.steps, self.k_history, color="#0E7AC4")

            plt.subplot(515)
            plt.title(r"Turnover angle $A$")
            plt_line(plt, self.turnover_times)
            plt.scatter(self.turnover_times, self.turnover_angles, color="#0E7AC4", s=3)

            plt.tight_layout()
            save_and_close_plt(plt, 'walking')
        else:
            raise Exception('Walking chart is not recorded.')
    def save_interval_angle_dist(self):
        """
        Plot 2D probability distribution P(tau,a)
        """

        plt.figure(figsize=(3, 4))

        xmin = min(self.calced_log_turnover_intervals.get())
        xmax = max(self.calced_log_turnover_intervals.get())
        ymin = min(self.calced_log_turnover_angles.get())
        ymax = max(self.calced_log_turnover_angles.get())

        xx = np.linspace(-1, 6, 32)
        yy = np.linspace(-2, 3, 32)
        X, Y = np.meshgrid(xx, yy)
        positions = np.vstack([X.ravel(), Y.ravel()])
        values = np.vstack([self.calced_log_turnover_intervals.get(), self.calced_log_turnover_angles.get()])
        kernel = gaussian_kde(values)
        Z = np.reshape(kernel(positions), X.shape)
        plt.imshow(np.rot90(Z.T), cmap=plt.cm.gist_earth_r, extent=[-1, 6, -2, 3], aspect=2)

        plt.xlabel(r'$\log_{10}(\tau)$')
        plt.ylabel(r'$\log_{10}(A)$')

        plt.plot(self.calced_log_turnover_intervals.get(), self.calced_log_turnover_angles.get(), 'k.', markersize=5, c='#FF0000')
        save_and_close_plt(plt, 'interval_angle_dist')
def main():

    parser = argparse.ArgumentParser(description='Plot 3D scatter graphs of human turnover simulations from csv.')
    parser.add_argument('file', type=str,
                       help='csv file inputted')

    args = parser.parse_args()

    df = pd.read_csv(args.file)

    fig = plt.figure()
    ax = Axes3D(fig)

    ax.set_xlabel(r"$\alpha_S$")
    ax.set_ylabel(r"$\alpha_L$")
    ax.set_zlabel(r"Skewness of $\log_{10}\tau$")

    ax.set_xlim(0.45, 0.8)
    ax.set_ylim(0.45, 0.8)
    ax.set_zlim(2.3, -2.3)

    d_wake = df[df.stage == 'wake']
    d_sleep_disturb = df[(df.stage == 'sleep') & (df.alpha_l > 0.55)]
    d_sleep_undisturb = df[(df.stage == 'sleep') & (df.alpha_l <= 0.55)]


    ax.scatter3D(d_sleep_disturb['alpha_s'], d_sleep_disturb['alpha_l'], d_sleep_disturb['skew'], "o", color="#00FF00", s=2)
    ax.scatter3D(d_sleep_undisturb['alpha_s'], d_sleep_undisturb['alpha_l'], d_sleep_undisturb['skew'], "o", color="#0000FF", s=2)
    ax.scatter3D(d_wake['alpha_s'], d_wake['alpha_l'], d_wake['skew'], "o", color="gold", s=2)

    save_and_close_plt(plt, '3dscat')
    def save_fluctuation(self):
        """
        Plot F(n) and alpha(n)
        """
        plt.figure(figsize=(3, 4))

        plt.xscale('log')
        plt.yscale('log')
        plt.ylim(0.005, 100)
        plt.scatter(self.calced_fn_series.get()[0], self.calced_fn_series.get()[1], s=100, c='#999999')
        plt.xlabel(r'$n$')
        plt.ylabel(r'$F(n)$')
        ax = plt.twinx()
        ax.set_ylim(0, 1)
        ax.set_ylabel(r'$\alpha(n)$')
        ax.scatter(self.calced_alpha_series.get()[0], self.calced_alpha_series.get()[1], s=100, c='white')
        save_and_close_plt(plt, 'fn_and_alpha')
def main():

    parser = argparse.ArgumentParser(
        description=
        'Plot 3D scatter graphs of human turnover simulations from csv.')
    parser.add_argument('file', type=str, help='csv file inputted')

    args = parser.parse_args()

    df = pd.read_csv(args.file)

    fig = plt.figure()
    ax = Axes3D(fig)

    ax.set_xlabel(r"$\alpha_S$")
    ax.set_ylabel(r"$\alpha_L$")
    ax.set_zlabel(r"Skewness of $\log_{10}\tau$")

    ax.set_xlim(0.45, 0.8)
    ax.set_ylim(0.45, 0.8)
    ax.set_zlim(2.3, -2.3)

    d_wake = df[df.stage == 'wake']
    d_sleep_disturb = df[(df.stage == 'sleep') & (df.alpha_l > 0.55)]
    d_sleep_undisturb = df[(df.stage == 'sleep') & (df.alpha_l <= 0.55)]

    ax.scatter3D(d_sleep_disturb['alpha_s'],
                 d_sleep_disturb['alpha_l'],
                 d_sleep_disturb['skew'],
                 "o",
                 color="#00FF00",
                 s=2)
    ax.scatter3D(d_sleep_undisturb['alpha_s'],
                 d_sleep_undisturb['alpha_l'],
                 d_sleep_undisturb['skew'],
                 "o",
                 color="#0000FF",
                 s=2)
    ax.scatter3D(d_wake['alpha_s'],
                 d_wake['alpha_l'],
                 d_wake['skew'],
                 "o",
                 color="gold",
                 s=2)

    save_and_close_plt(plt, '3dscat')
    def save_interval_ccdf(self):
        """
        Plot complementary cumulative distribution function P(x>=tau)
        """
        plt.figure(figsize=(3, 4))

        plt.xlabel(r'$\tau (s)$')
        plt.ylabel(r'$P(x\geq\tau)$')

        slis = sorted(self.calced_log_turnover_intervals.get())
        l = len(slis)
        i = 0
        y = []
        for x in slis:
            y.append(1.0 * (l - i) / l)
            i += 1

        plt.scatter(slis, y, s=100, c='white')
        save_and_close_plt(plt, 'interval_ccdf')