Source code for energy_demand.plotting.basic_plot_functions

"""Basic plotting functions
"""
import math
import numpy as np

from scipy.interpolate import interp1d, splrep, splev

from energy_demand.technologies import diffusion_technologies
#matplotlib.use('Agg') # Used to make it work in linux

[docs]def export_legend(legend, filename="legend.png"): """Export legend as seperate file """ fig = legend.figure fig.canvas.draw() bbox = legend.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) fig.savefig(filename, dpi="figure", bbox_inches=bbox)
[docs]def cm2inch(*tupl): """Convert input cm to inches (width, hight) """ inch = 2.54 if isinstance(tupl[0], tuple): return tuple(i/inch for i in tupl[0]) else: return tuple(i/inch for i in tupl)
[docs]def simple_smooth(x_list, y_list, num=500, spider=False, interpol_kind='quadratic'): nr_x_values = len(x_list) min_x_val = min(x_list) max_x_val = max(x_list) x_values = np.linspace(min_x_val, max_x_val, num=nr_x_values, endpoint=True) f2 = interp1d(x_values, y_list, kind=interpol_kind) smoothed_data_x = np.linspace( min_x_val, max_x_val, num=num, endpoint=True) smoothed_data_y = f2(smoothed_data_x) return smoothed_data_x, smoothed_data_y
[docs]def smooth_data( x_list, y_list, num=500, spider=False, interpol_kind='quadratic' ): """Smooth data x_list : list List with x values y_list : list List with y values num : int New number of interpolation points spider : bool Criteria whether spider plot or not interpol_kind : str Kind of interpolation, i.e. quadratic or cubic Note: ------ - needs at least 4 entries in lists - https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html - The smoothing prevents negative values by setting them to zero """ if spider: min_x_val = min(x_list) max_x_val = math.pi * 2 #max is tow pi x_values = np.linspace( min_x_val, max_x_val, num=len(x_list), endpoint=True) f2 = interp1d( x_values, y_list, kind=interpol_kind) x_smooth = np.linspace( min_x_val, max_x_val, num=num, endpoint=True) else: # Smooth x data x_smooth = np.linspace( min(x_list), max(x_list), num=num) f2 = interp1d( x_list, y_list, kind=interpol_kind) # smooth y_smooth = f2(x_smooth) # Prevent smoothing to go into negative values and replace negative values with zero # Get position of last negative entry try: pos_zero = int(np.argwhere(y_smooth < 0)[-1]) y_smooth[:pos_zero] = 0 except IndexError: pass return x_smooth, y_smooth
[docs]def smooth_line( input_x_line_data, input_y_line_data, nr_line_points=1000 ): """https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splrep.html#scipy.interpolate.splrep nr_line_points : int represents number of points to make between input_line_data.min and T.max """ x = np.array(input_x_line_data) y = np.array(input_y_line_data) spl = splrep(x, y) x2 = np.linspace(x.min(), x.max(), nr_line_points) y2 = splev(x2, spl) return x2, y2