def test_theme_linedraw(self): p = self.g + labs(title='Theme Linedraw') + theme_linedraw() if six.PY2: # Small displacement in title assert p + _theme == ('theme_linedraw', {'tol': 8}) else: assert p + _theme == 'theme_linedraw'
def graph(df): graph = (ggplot(data=df, mapping=aes(x='Time', y='NDVI')) + geom_line(size =2, color = 'green') +geom_point() +theme_linedraw() + theme(axis_text_x= element_text(rotation=45, hjust=1)) +scales.ylim(0,1) + geom_area(fill = "green", alpha = .4) ) return graph
def batch_plots(self): # First, put together active leak data and output for live plotting functionality # (no AL plot here currently) dfs = self.active_leak_dfs for i in range(len(dfs)): n_cols = dfs[i].shape[1] dfs[i]['mean'] = dfs[i].iloc[:, 0:n_cols].mean(axis=1) dfs[i]['std'] = dfs[i].iloc[:, 0:n_cols].std(axis=1) dfs[i]['low'] = dfs[i].iloc[:, 0:n_cols].quantile(0.025, axis=1) dfs[i]['high'] = dfs[i].iloc[:, 0:n_cols].quantile(0.975, axis=1) dfs[i]['program'] = self.directories[i] # Move reference program to the top of the list for i, df in enumerate(dfs): if df['program'].iloc[0] == self.ref_program: dfs.insert(0, dfs.pop(i)) # Arrange dfs for plot 1 dfs_p1 = dfs.copy() for i in range(len(dfs_p1)): # Reshape dfs_p1[i] = pd.melt(dfs_p1[i], id_vars=['datetime', 'mean', 'std', 'low', 'high', 'program']) # Combine dataframes into single dataframe for plotting df_p1 = dfs_p1[0] for i in dfs_p1[1:]: df_p1 = df_p1.append(i, ignore_index=True) # Output Emissions df for other uses (e.g. live plot) df_p1.to_csv(self.output_directory + 'mean_active_leaks.csv', index=True) # Now repeat for emissions (which will actually be used for batch plotting) dfs = self.emission_dfs for i in range(len(dfs)): n_cols = dfs[i].shape[1] dfs[i]['mean'] = dfs[i].iloc[:, 0:n_cols].mean(axis=1) dfs[i]['std'] = dfs[i].iloc[:, 0:n_cols].std(axis=1) dfs[i]['low'] = dfs[i].iloc[:, 0:n_cols].quantile(0.025, axis=1) dfs[i]['high'] = dfs[i].iloc[:, 0:n_cols].quantile(0.975, axis=1) dfs[i]['program'] = self.directories[i] # Move reference program to the top of the list for i, df in enumerate(dfs): if df['program'].iloc[0] == self.ref_program: dfs.insert(0, dfs.pop(i)) # Arrange dfs for plot 1 dfs_p1 = dfs.copy() for i in range(len(dfs_p1)): # Reshape dfs_p1[i] = pd.melt(dfs_p1[i], id_vars=['datetime', 'mean', 'std', 'low', 'high', 'program']) # Combine dataframes into single dataframe for plotting df_p1 = dfs_p1[0] for i in dfs_p1[1:]: df_p1 = df_p1.append(i, ignore_index=True) # Output Emissions df for other uses (e.g. live plot) df_p1.to_csv(self.output_directory + 'mean_emissions.csv', index=True) # Make plots from list of dataframes - one entry per dataframe pn.theme_set(pn.theme_linedraw()) plot1 = (pn.ggplot(None) + pn.aes('datetime', 'value', group='program') + pn.geom_ribbon(df_p1, pn.aes(ymin='low', ymax='high', fill='program'), alpha=0.2) + pn.geom_line(df_p1, pn.aes('datetime', 'mean', colour='program'), size=1) + pn.ylab('Daily emissions (kg/site)') + pn.xlab('') + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.scale_x_datetime(labels=date_format('%Y')) + pn.scale_y_continuous(trans='log10') + pn.ggtitle('To reduce uncertainty, use more simulations.') + pn.labs(color='Program', fill='Program') + pn.theme(panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) ) plot1.save(self.output_directory + 'program_comparison.png', width=7, height=3, dpi=900) # Build relative mitigation plots dfs_p2 = dfs.copy() for i in dfs_p2[1:]: i['mean_dif'] = 0 i['std_dif'] = 0 i['mean_ratio'] = 0 i['std_ratio'] = 0 for j in range(len(i)): ref_mean = dfs_p2[0].loc[dfs_p2[0].index[j], 'mean'] ref_std = dfs_p2[0].loc[dfs_p2[0].index[j], 'std'] alt_mean = i.loc[i.index[j], 'mean'] alt_std = i.loc[i.index[j], 'std'] i.loc[i.index[j], 'mean_dif'] = alt_mean - ref_mean i.loc[i.index[j], 'std_dif'] = math.sqrt( math.pow(alt_std, 2) + math.pow(ref_std, 2)) i.loc[i.index[j], 'mean_ratio'] = alt_mean / ref_mean i.loc[i.index[j], 'std_ratio'] = math.sqrt( math.pow((alt_std / alt_mean), 2) + math.pow((ref_std / ref_mean), 2)) # Build plotting dataframe df_p2 = self.dates_trunc.copy().to_frame() df_p2['program'] = dfs_p2[1]['program'] df_p2['mean_dif'] = dfs_p2[1]['mean_dif'] df_p2['std_dif'] = dfs_p2[1]['std_dif'] df_p2['mean_ratio'] = dfs_p2[1]['mean_ratio'] df_p2['std_ratio'] = dfs_p2[1]['std_ratio'] df_p2['low_dif'] = dfs_p2[1]['mean_dif'] - 2 * dfs_p2[1]['std_dif'] df_p2['high_dif'] = dfs_p2[1]['mean_dif'] + 2 * dfs_p2[1]['std_dif'] df_p2['low_ratio'] = dfs_p2[1]['mean_ratio'] / (dfs_p2[1] ['mean_ratio'] + 2 * dfs_p2[1]['std_ratio']) df_p2['high_ratio'] = dfs_p2[1]['mean_ratio'] + 2 * dfs_p2[1]['std_ratio'] pd.options.mode.chained_assignment = None for i in dfs_p2[2:]: i['low_dif'] = i['mean_dif'] - 2 * i['std_dif'] i['high_dif'] = i['mean_dif'] + 2 * i['std_dif'] i['low_ratio'] = i['mean_ratio'] / (i['mean_ratio'] + 2 * i['std_ratio']) i['high_ratio'] = i['mean_ratio'] + 2 * i['std_ratio'] short_df = i[['program', 'mean_dif', 'std_dif', 'low_dif', 'high_dif', 'mean_ratio', 'std_ratio', 'low_ratio', 'high_ratio']] short_df['datetime'] = np.array(self.dates_trunc) df_p2 = df_p2.append(short_df, ignore_index=True) # Make plot 2 plot2 = (pn.ggplot(None) + pn.aes('datetime', 'mean_dif', group='program') + pn.geom_ribbon( df_p2, pn.aes(ymin='low_dif', ymax='high_dif', fill='program'), alpha=0.2) + pn.geom_line(df_p2, pn.aes('datetime', 'mean_dif', colour='program'), size=1) + pn.ylab('Daily emissions difference (kg/site)') + pn.xlab('') + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.scale_x_datetime(labels=date_format('%Y')) + pn.ggtitle('Daily differences may be uncertain for small sample sizes') + # pn.scale_y_continuous(trans='log10') + pn.labs(color='Program', fill='Program') + pn.theme(panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) ) plot2.save(self.output_directory + 'relative_mitigation.png', width=7, height=3, dpi=900) # Make plot 3 plot3 = (pn.ggplot(None) + pn.aes('datetime', 'mean_ratio', group='program') + pn.geom_ribbon(df_p2, pn.aes( ymin='low_ratio', ymax='high_ratio', fill='program'), alpha=0.2) + pn.geom_hline(yintercept=1, size=0.5, colour='blue') + pn.geom_line(df_p2, pn.aes('datetime', 'mean_ratio', colour='program'), size=1) + pn.ylab('Emissions ratio') + pn.xlab('') + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.scale_x_datetime(labels=date_format('%Y')) + pn.ggtitle( 'Blue line represents equivalence. \nIf uncertainty is high, use more ' 'simulations and/or sites. \nLook also at ratio of mean daily emissions' 'over entire timeseries.') + pn.labs(color='Program', fill='Program') + pn.theme(panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) ) plot3.save(self.output_directory + 'relative_mitigation2.png', width=7, height=3, dpi=900) # --------------------------------------- # ------ Figure to compare costs ------ dfs = self.cost_dfs for i in range(len(dfs)): n_cols = dfs[i].shape[1] dfs[i]['mean'] = dfs[i].iloc[:, 0:n_cols].mean(axis=1) dfs[i]['std'] = dfs[i].iloc[:, 0:n_cols].std(axis=1) dfs[i]['low'] = dfs[i].iloc[:, 0:n_cols].quantile(0.025, axis=1) dfs[i]['high'] = dfs[i].iloc[:, 0:n_cols].quantile(0.975, axis=1) dfs[i]['program'] = self.directories[i] # Move reference program to the top of the list for i, df in enumerate(dfs): if df['program'].iloc[0] == self.ref_program: dfs.insert(0, dfs.pop(i)) # Arrange dfs for plot 1 dfs_p1 = dfs.copy() for i in range(len(dfs_p1)): # Reshape dfs_p1[i] = pd.melt(dfs_p1[i], id_vars=['datetime', 'mean', 'std', 'low', 'high', 'program']) # Combine dataframes into single dataframe for plotting df_p1 = dfs_p1[0] for i in dfs_p1[1:]: df_p1 = df_p1.append(i, ignore_index=True) # Output Emissions df for other uses (e.g. live plot) df_p1.to_csv(self.output_directory + 'rolling_cost_estimates.csv', index=True) # Make plots from list of dataframes - one entry per dataframe pn.theme_set(pn.theme_linedraw()) plot1 = (pn.ggplot(None) + pn.aes('datetime', 'value', group='program') + pn.geom_ribbon(df_p1, pn.aes(ymin='low', ymax='high', fill='program'), alpha=0.2) + pn.geom_line(df_p1, pn.aes('datetime', 'mean', colour='program'), size=1) + pn.ylab('Estimated cost per facility') + pn.xlab('') + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.scale_x_datetime(labels=date_format('%Y')) + # pn.scale_y_continuous(trans='log10') + pn.labs(color='Program', fill='Program') + pn.theme(panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) ) plot1.save(self.output_directory + 'cost_estimate_temporal.png', width=7, height=3, dpi=900) ######################################## # Cost breakdown by program and method method_lists = [] for i in range(len(self.directories)): df = pd.read_csv( self.output_directory + self.directories[i] + "/timeseries_output_0.csv") df = df.filter(regex='cost$', axis=1) df = df.drop(columns=["total_daily_cost"]) method_lists.append(list(df)) costs = [[] for i in range(len(self.all_data))] for i in range(len(self.all_data)): for j in range(len(self.all_data[i])): simcosts = [] for k in range(len(method_lists[i])): timesteps = len(self.all_data[i][j][method_lists[i][k]]) simcosts.append( (sum(self.all_data[i][j][method_lists[i][k]])/timesteps/self.n_sites)*365) costs[i].append(simcosts) rows_list = [] for i in range(len(costs)): df_temp = pd.DataFrame(costs[i]) for j in range(len(df_temp.columns)): dict = {} dict.update({'Program': self.directories[i]}) dict.update({'Mean Cost': round(df_temp.iloc[:, j].mean())}) dict.update({'St. Dev.': df_temp.iloc[:, j].std()}) dict.update({'Method': method_lists[i][j].replace('_cost', '')}) rows_list.append(dict) df = pd.DataFrame(rows_list) # Output Emissions df for other uses df.to_csv(self.output_directory + 'cost_comparison.csv', index=True) plot = ( pn.ggplot( df, pn.aes( x='Program', y='Mean Cost', fill='Method', label='Mean Cost')) + pn.geom_bar(stat="identity") + pn.ylab('Cost per Site per Year') + pn.xlab('Program') + pn.scale_fill_hue(h=0.15, l=0.25, s=0.9) + pn.geom_text(size=15, position=pn.position_stack(vjust=0.5)) + pn.theme( panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5))) plot.save(self.output_directory + 'cost_comparison.png', width=7, height=3, dpi=900) return
def test_theme_linedraw(self): p = self.g + labs(title='Theme Linedraw') + theme_linedraw() assert p + _theme == 'theme_linedraw'
def make_plots(leak_df, time_df, site_df, sim_n, spin_up, output_directory): """ This function makes a set of standard plots to output at end of simulation. """ # Temporarily mute warnings warnings.filterwarnings('ignore') pn.theme_set(pn.theme_linedraw()) # Chop off spin-up year (only for plots, still exists in raw output) time_df_adj = time_df.iloc[spin_up:, ] # Timeseries plots plot_time_1 = ( pn.ggplot(time_df_adj, pn.aes('datetime', 'daily_emissions_kg')) + pn.geom_line(size=2) + pn.ggtitle('Daily emissions from all sites (kg)') + pn.ylab('') + pn.xlab('') + pn.scale_x_datetime(labels=date_format('%Y')) + pn.theme( panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5))) plot_time_1.save(output_directory + '/plot_time_emissions_' + sim_n + '.png', width=10, height=3, dpi=300) plot_time_2 = (pn.ggplot(time_df_adj, pn.aes('datetime', 'active_leaks')) + pn.geom_line(size=2) + pn.ggtitle('Number of active leaks at all sites') + pn.ylab('') + pn.xlab('') + pn.scale_x_datetime(labels=date_format('%Y')) + pn.theme(panel_border=pn.element_rect( colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5))) plot_time_2.save(output_directory + '/plot_time_active_' + sim_n + '.png', width=10, height=3, dpi=300) # Site-level plots plot_site_1 = ( pn.ggplot(site_df, pn.aes('cum_frac_sites', 'cum_frac_emissions')) + pn.geom_line(size=2) + pn.theme( panel_border=pn.element_rect(colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) + pn.xlab('Cumulative fraction of sites') + pn.ylab('Cumulative fraction of emissions') + pn.ggtitle('Empirical cumulative distribution of site-level emissions') ) plot_site_1.save(output_directory + '/site_cum_dist_' + sim_n + '.png', width=5, height=4, dpi=300) # Leak plots plot_leak_1 = (pn.ggplot(leak_df, pn.aes('days_active')) + pn.geom_histogram(colour='gray') + pn.theme(panel_border=pn.element_rect( colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) + pn.ggtitle('Distribution of leak duration') + pn.xlab('Number of days the leak was active') + pn.ylab('Count')) plot_leak_1.save(output_directory + '/leak_active_hist' + sim_n + '.png', width=5, height=4, dpi=300) plot_leak_2 = (pn.ggplot( leak_df, pn.aes('cum_frac_leaks', 'cum_frac_rate', colour='status')) + pn.geom_line(size=2) + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.theme(panel_border=pn.element_rect( colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) + pn.xlab('Cumulative fraction of leak sources') + pn.ylab('Cumulative leak rate fraction') + pn.ggtitle('Fractional cumulative distribution')) plot_leak_2.save(output_directory + '/leak_cum_dist1_' + sim_n + '.png', width=4, height=4, dpi=300) plot_leak_3 = (pn.ggplot( leak_df, pn.aes('cum_frac_leaks', 'cum_rate', colour='status')) + pn.geom_line(size=2) + pn.scale_colour_hue(h=0.15, l=0.25, s=0.9) + pn.theme(panel_border=pn.element_rect( colour="black", fill=None, size=2), panel_grid_minor_x=pn.element_blank(), panel_grid_major_x=pn.element_blank(), panel_grid_minor_y=pn.element_line( colour='black', linewidth=0.5, alpha=0.3), panel_grid_major_y=pn.element_line( colour='black', linewidth=1, alpha=0.5)) + pn.scale_y_continuous(trans='log10') + pn.xlab('Cumulative fraction of leak sources') + pn.ylab('Cumulative emissions (kg/day)') + pn.ggtitle('Absolute cumulative distribution')) plot_leak_3.save(output_directory + '/leak_cum_dist2_' + sim_n + '.png', width=4, height=4, dpi=300) return