-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Develop minimization plots #85
Changes from 7 commits
c497fb3
6342239
b9295bd
f19f76a
75552dd
4f1780a
e2ac9fc
c4bb16a
a84ff7e
98bd242
868f149
858b33c
6402615
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
import numpy as np | ||
import pandas as pd | ||
from datetime import datetime | ||
import matplotlib.pyplot as plt | ||
from emcpy.plots.plots import LinePlot | ||
from emcpy.plots import CreatePlot | ||
|
||
__all__ = ['plot_minimization'] | ||
|
||
|
||
def _plot_cost_function(df, outdir): | ||
""" | ||
Use data from dataframe to plot the cost function. | ||
""" | ||
# Get cycle info | ||
cycle = df.index.get_level_values(0)[-1] | ||
cyclestr = datetime.strftime(cycle, '%Y%m%d%H') | ||
n_cycles = len(np.unique(df.index.get_level_values(0))) | ||
|
||
# Create approriate dataframes | ||
current_cycle_df = df.loc[cycle] | ||
avg_df = df.groupby(level=[1, 2]).mean() | ||
|
||
# Grab data | ||
j = current_cycle_df['J'].to_numpy() | ||
x = np.arange(len(j)) | ||
|
||
avg_j = avg_df['J'].to_numpy() | ||
avg_x = np.arange(len(avg_j)) | ||
|
||
# Create LinePlot objects | ||
cost_plot = LinePlot(x, j) | ||
cost_plot.linewidth = 2 | ||
cost_plot.label = 'Cost' | ||
|
||
avg_cost_plot = LinePlot(avg_x, avg_j) | ||
avg_cost_plot.color = 'tab:red' | ||
avg_cost_plot.linewidth = 2 | ||
avg_cost_plot.label = f'Last {n_cycles} cycles Average' | ||
|
||
# Create Plot | ||
myplot = CreatePlot() | ||
myplot.draw_data([cost_plot, avg_cost_plot]) | ||
myplot.set_yscale('log') | ||
myplot.add_grid() | ||
myplot.set_xlim(0, len(j)-1) | ||
myplot.add_xlabel('Iterations') | ||
myplot.add_ylabel('log (J)') | ||
myplot.add_legend(loc='upper right', | ||
fontsize='large') | ||
myplot.add_title('FV3LAM Cost', loc='left') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since there are multiple experiments (FV3LAMDA, LAMDAX, etc.) can we make the title include an optional experiment name passed to the function? |
||
myplot.add_title(cyclestr, loc='right', | ||
fontweight='semibold') | ||
|
||
fig = myplot.return_figure() | ||
|
||
plt.savefig(outdir + f"{cyclestr}_cost_function.png", | ||
bbox_inches='tight', pad_inches=0.1) | ||
plt.close('all') | ||
|
||
|
||
def _plot_gnorm(df, outdir): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same two comments for this function as the first one. |
||
""" | ||
Use date from dataframe to plot gnorm. | ||
""" | ||
# Get cycle info | ||
cycle = df.index.get_level_values(0)[-1] | ||
cyclestr = datetime.strftime(cycle, '%Y%m%d%H') | ||
n_cycles = len(np.unique(df.index.get_level_values(0))) | ||
|
||
# Create approriate dataframes | ||
current_cycle_df = df.loc[cycle] | ||
avg_df = df.groupby(level=[1, 2]).mean() | ||
|
||
# Grab data | ||
gJ = current_cycle_df['gJ'].to_numpy() | ||
gJ = np.log(gJ/gJ[0]) | ||
x = np.arange(len(gJ)) | ||
|
||
avg_gJ = avg_df['gJ'].to_numpy() | ||
avg_gJ = np.log(avg_gJ/avg_gJ[0]) | ||
avg_x = np.arange(len(avg_gJ)) | ||
|
||
# Create LinePlot objects | ||
gnorm = LinePlot(x, gJ) | ||
gnorm.linewidth = 2 | ||
gnorm.label = 'gnorm' | ||
|
||
avg_gnorm = LinePlot(avg_x, avg_gJ) | ||
avg_gnorm.color = 'tab:red' | ||
avg_gnorm.linewidth = 2 | ||
avg_gnorm.linestyle = '--' | ||
avg_gnorm.label = f'Last {n_cycles} cycles Average' | ||
|
||
# Create Plot | ||
myplot = CreatePlot() | ||
myplot.draw_data([gnorm, avg_gnorm]) | ||
# myplot.set_yscale('log') | ||
myplot.add_grid() | ||
myplot.set_xlim(0, len(j)-1) | ||
myplot.add_xlabel('Iterations') | ||
myplot.add_ylabel('log (gnorm)') | ||
myplot.add_legend(loc='upper right', | ||
fontsize='large') | ||
myplot.add_title('FV3LAM gnorm', loc='left') | ||
myplot.add_title(cyclestr, loc='right', | ||
fontweight='semibold') | ||
|
||
fig = myplot.return_figure() | ||
|
||
plt.savefig(outdir + f"{cyclestr}_gnorm.png", | ||
bbox_inches='tight', pad_inches=0.1) | ||
plt.close('all') | ||
|
||
|
||
def plot_minimization(df, outdir): | ||
""" | ||
Plot minimization plots including gnorm and cost function | ||
and save them to outdir. | ||
|
||
Args: | ||
df : (pandas dataframe) dataframe with appropriate information | ||
from GSI Stat file | ||
outdir : (str) path to output diagnostics | ||
""" | ||
|
||
_plot_gnorm(df, outdir) | ||
_plot_cost_function(df, outdir) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only question is how to handle the
tm06
information for this plot?