Source code for SALib.plotting.hdmr

'''
Created on Dec 20, 2019

@author: @sahin-abdullah

This submodule produces two diffent figures: (1) emulator vs simulator,
(2) regression lines of first order component functions
'''
import matplotlib.pyplot as plt
import numpy as np


[docs]def plot(Si): # Close all figures plt.close('all') # Extract necessary data from Si problem = Si.problem Em = Si['Em'] RT = Si['RT'] Y_em = Si['Y_em'] idx = Si['idx'] X = Si['X'] Y = Si['Y'] # Get number of bootstrap from Runtime and sample size N K = RT.shape[1] N = Y.shape[0] row = 2 col = 5 try: ax = Si._plot() except AttributeError: # basic bar plot not found or is not available pass # Plot emulator performance Y_p = np.linspace(np.min(Y), np.max(Y), N, endpoint=True) start = max(0, K-10) for i in range(start, K): # Only showing the last 10 if (i % (row * col) == 0) or (i == 0): fig = plt.figure(frameon=False) fig.suptitle('Showing last 10 Bootstrap Trials') it = 1 title_str = f'Trial {K - i}' ax = fig.add_subplot(row, col, it, frameon=True, title=title_str) ax.plot(Em['Y_e'][:, i], Y[idx[:, i]], 'r+', label='Emulator') ax.plot(Y_p, Y_p, 'darkgray', label='1:1 Line') ax.axis('square') ax.set_xlim(np.min(Y), np.max(Y)) ax.set_ylim(np.min(Y), np.max(Y)) it += 1 if i == (K-1): handles, labels = ax.get_legend_handles_labels() fig.legend(handles, labels, loc='center right', bbox_to_anchor=(1.0, 0.5)) fig.tight_layout() # Now plot regression lines of component functions row = 3 col = 1 last_bootstrap = idx[:, -1] for i in range(problem['num_vars']): if (i % (row * col) == 0) or (i == 0): fig = plt.figure(frameon=False) it = 1 title_str = 'Regression of parameter ' + \ problem['names'][i] + r'$^{(Last Trial)}$' ax = fig.add_subplot(row, col, it, frameon=True, title=title_str) ax.plot(X[last_bootstrap, i], Y[last_bootstrap], 'r.') ax.plot(X[last_bootstrap, i], np.mean(Em['f0']) + Y_em[:, i], 'k.') ax.legend([r'$\widetilde{Y}$', '$f_' + str(i + 1) + '$'], loc='upper left', bbox_to_anchor=(1.04, 1.0)) it += 1 fig.tight_layout() plt.show() if 'emulated' in Si: emulated = Si['emulated'] # Sum of squared residuals Y_test = Si['Y_test'] ssr = np.sum((emulated - Y_test)**2) # Plot testing results fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6,6)) ax.plot(emulated, Y_test, 'r+', label='Emulator') ax.plot( Y_test, Y_test, 'darkgray', label='1:1 Line') ax.axis('square') ax.set_xlabel('Emulator') ax.set_ylabel('New Observation') ax.set_xlim(np.min(Y_test), np.max(Y_test)) ax.set_ylim(np.min(Y_test), np.max(Y_test)) ax.legend(loc='lower right') plt.title(f'Testing results\nSSR = {ssr:.2f}') fig.tight_layout() plt.show() return ax
if __name__ == '__main__': pass