diff --git a/examples/script_design_capacity.py b/examples/script_design_capacity.py index d17120e454f2871001ee11c735859c6e05b4c8f8..f9f030c2be59f5d78a3c8e9a9499fe1a4f98e6ad 100644 --- a/examples/script_design_capacity.py +++ b/examples/script_design_capacity.py @@ -35,6 +35,8 @@ from topupheat.pipes.twin import StandardisedTwinPipe from topupheat.pipes.trenches import TwinPipeTrench import topupheat.pipes.utils as utils from topupheat.common import formulas as core +from topupheat.pipes.trenches import SupplyReturnPipeTrench #, TwinPipeTrench +from topupheat.pipes.utils import minimum_assembling_distance_isoplus #****************************************************************************** #****************************************************************************** @@ -527,9 +529,8 @@ for i, label in enumerate(published_results_labels_euroheat2021): #****************************************************************************** ax.set(xlim=(0, 1000),ylim=(0, 9)) -ax.set(xlabel='Pipe internal diameter [mm]', - ylabel='Fluid speed [m/s]', - title='Maximum mean fluid speed for a given specific pressure loss') +ax.set(xlabel='Internal diameter [mm]', + ylabel='Fluid speed [m/s]') ax.legend() @@ -565,9 +566,8 @@ for i, max_specific_pressure_loss in enumerate(list_max_specific_pressure_loss): # label='Nussbaumer et al. (2016), '+str(max_specific_pressure_loss)+' Pa/m') -ax.set(xlabel='Pipe internal diameter [mm]', - ylabel='Specific pressure loss [Pa/m]', - title='...') +ax.set(xlabel='Internal diameter [mm]', + ylabel='Specific pressure loss [Pa/m]') ax.legend() @@ -725,6 +725,7 @@ twin_trench2 = TwinPipeTrench( # pipe capacity vs flow rate fig, ax = plt.subplots() +fig.set_size_inches(12,8) # datasheet level_label_datasheet = ['low speed', 'high speed'] @@ -767,7 +768,7 @@ ax.semilogy([pipe.d_int*1e3 for pipe in twin_trench2.supply_pipe], 'k-', label=str(twin_trench2.max_specific_pressure_loss[0])+' Pa/m (model)') -ax.set(xlabel='Pipe internal diameter [mm]', +ax.set(xlabel='Internal diameter [mm]', ylabel='Transmittable Capacity [kW]') ax.legend() @@ -776,3 +777,342 @@ ax.grid() ax.set(xlim=(10, 220),ylim=(0, 12e3)) # fig.savefig("test.png") plt.show() + +# ***************************************************************************** +# ***************************************************************************** + +# TIP: this is where the second part begins + +# pipe mass flow in tones per hour +m_pipes = { # 60-80 Pa + 21.7: [0.4, 0.5], # 20 + 27.3: [0.8, 1.0], + 36.0: [1.7, 2.0], + 41.9: [2.5, 3.0], + 53.9: [4.7, 5.5], + 69.7: [9.3, 11.0], + 82.5: [14.5, 16.5], + 107.1: [28.5, 33.0], + 132.5: [50.0, 58.0], + 160.3: [82.0, 95.0], + 210.1: [167.0, 193.0], + 263.0: [300, 348], + 312.7: [472, 547], + 344.4: [610, 705], + 393.8: [862, 1000], + 444.6: [1180, 1370], + 495.4: [1570, 1820], + 595.8: [2520, 2920], + 695.0: [3770, 4370], + 795.4: [5390, 6240], + 894.0: [7400, 9500], + #994.0: [9200, None], + } + + +p_pipes = { + (20, 1, 'caldopex', '25-76'): 0, + (20, 2, 'caldopex', 'PLUS 25-91'): 0, + (25, 1, 'caldopex', '32-76'): 0, + (25, 2, 'caldopex', 'PLUS 32-91'): 0, + (32, 1, 'caldopex', '40-91'): 0, + (32, 2, 'caldopex', 'PLUS 40-111'): 0, + (40, 1, 'caldopex', '50-111'): 0, + (40, 2, 'caldopex', 'PLUS 50-126'): 0, + (50, 1, 'caldopex', '63-126'): 0, + (50, 2, 'caldopex', 'PLUS 63-142'): 0, + (65, 1, 'caldopex', '75-142'): 0, + (65, 2, 'caldopex', 'PLUS 75-162'): 0, + (80, 1, 'caldopex', '90-162'): 0, + (80, 2, 'caldopex', 'PLUS 90-182'): 0, + (100, 1, 'caldopex', '110-162'): 0, + (100, 2, 'caldopex', '110-182'): 0, + (100, 3, 'caldopex', 'PLUS 110-202'): 0, + (125, 1, 'caldopex', '125-182'): 0, + (125, 2, 'caldopex', 'PLUS 125-202'): 0, + (125, 3, 'caldopex', '140-202'): 0, + (150, 1, 'caldopex', '160-250'): 0, + (20, 1, 'caldopex', '25+25-91'): 0, + (20, 2, 'caldopex', 'PLUS 25+25-111'): 0, + (25, 1, 'caldopex', '32+32-111'): 0, + (25, 2, 'caldopex', 'PLUS 32+32-126'): 0, + (32, 1, 'caldopex', '40+40-126'): 0, + (32, 2, 'caldopex', 'PLUS 40+40-142'): 0, + (40, 1, 'caldopex', '50+50-162'): 0, + (40, 2, 'caldopex', 'PLUS 50+50-182'): 0, + (50, 1, 'caldopex', '63+63-182'): 0, + (50, 2, 'caldopex', 'PLUS 63+63-202'): 0, + (65, 1, 'caldopex', '75+75-202'): 0, + # single pipe, standard insulation + (20, 1, 'isoplus', 'DRE-20-STD'): 0.1295, + (25, 1, 'isoplus', 'DRE-25-STD'): 0.1564, + (32, 1, 'isoplus', 'DRE-32-STD'): 0.1589, + (40, 1, 'isoplus', 'DRE-40-STD'): 0.1810, + (50, 1, 'isoplus', 'DRE-50-STD'): 0.2013, + (65, 1, 'isoplus', 'DRE-65-STD'): 0.2325, + (80, 1, 'isoplus', 'DRE-80-STD'): 0.2418, + (100, 1, 'isoplus', 'DRE-100-STD'): 0.2543, + (125, 1, 'isoplus', 'DRE-125-STD'): 0.2880, + (150, 1, 'isoplus', 'DRE-150-STD'): 0.3369, + (200, 1, 'isoplus', 'DRE-200-STD'): 0.3686, + (250, 1, 'isoplus', 'DRE-250-STD'): 0.3637, + (300, 1, 'isoplus', 'DRE-300-STD'): 0.4126, + (350, 1, 'isoplus', 'DRE-350-STD'): 0.4009, + (400, 1, 'isoplus', 'DRE-400-STD'): 0.4222, + (450, 1, 'isoplus', 'DRE-450-STD'): 0.4242, + (500, 1, 'isoplus', 'DRE-500-STD'): 0.4149, + (600, 1, 'isoplus', 'DRE-600-STD'): 0.5002, + (700, 1, 'isoplus', 'DRE-700-STD'): 0.5665, + (800, 1, 'isoplus', 'DRE-800-STD'): 0.6372, + (900, 1, 'isoplus', 'DRE-900-STD'): 0.7027, + (1000, 1, 'isoplus', 'DRE-1000-STD'): 0.7742, + # single pipe, reinforced + (20, 2, 'isoplus', 'DRE-20-RE'): 0.1114, + (25, 2, 'isoplus', 'DRE-25-RE'): 0.1308, + (32, 2, 'isoplus', 'DRE-32-RE'): 0.1420, + (40, 2, 'isoplus', 'DRE-40-RE'): 0.1593, + (50, 2, 'isoplus', 'DRE-50-RE'): 0.1763, + (65, 2, 'isoplus', 'DRE-65-RE'): 0.1980, + (80, 2, 'isoplus', 'DRE-80-RE'): 0.2076, + (100, 2, 'isoplus', 'DRE-100-RE'): 0.2148, + (125, 2, 'isoplus', 'DRE-125-RE'): 0.2459, + (150, 2, 'isoplus', 'DRE-150-RE'): 0.2794, + (200, 2, 'isoplus', 'DRE-200-RE'): 0.2953, + (250, 2, 'isoplus', 'DRE-250-RE'): 0.2914, + (300, 2, 'isoplus', 'DRE-300-RE'): 0.3284, + (350, 2, 'isoplus', 'DRE-350-RE'): 0.3169, + (400, 2, 'isoplus', 'DRE-400-RE'): 0.3277, + (450, 2, 'isoplus', 'DRE-450-RE'): 0.3299, + (500, 2, 'isoplus', 'DRE-500-RE'): 0.3249, + (600, 2, 'isoplus', 'DRE-600-RE'): 0.3748, + (700, 2, 'isoplus', 'DRE-700-RE'): 0.4238, + (800, 2, 'isoplus', 'DRE-800-RE'): 0.4732, + (900, 2, 'isoplus', 'DRE-900-RE'): 0.5221, + (1000, 2, 'isoplus', 'DRE-1000-RE'): 0.5733, + # single pipe, twice reinforced + (20, 3, 'isoplus', 'DRE-20-TWIRE'): 0.10280, + (25, 3, 'isoplus', 'DRE-25-TWIRE'): 0.1191, + (32, 3, 'isoplus', 'DRE-32-TWIRE'): 0.1290, + (40, 3, 'isoplus', 'DRE-40-TWIRE'): 0.1432, + (50, 3, 'isoplus', 'DRE-50-TWIRE'): 0.1557, + (65, 3, 'isoplus', 'DRE-65-TWIRE'): 0.1744, + (80, 3, 'isoplus', 'DRE-80-TWIRE'): 0.1847, + (100, 3, 'isoplus', 'DRE-100-TWIRE'): 0.1905, + (125, 3, 'isoplus', 'DRE-125-TWIRE'): 0.2138, + (150, 3, 'isoplus', 'DRE-150-TWIRE'): 0.2343, + (200, 3, 'isoplus', 'DRE-200-TWIRE'): 0.2472, + (250, 3, 'isoplus', 'DRE-250-TWIRE'): 0.2468, + (300, 3, 'isoplus', 'DRE-300-TWIRE'): 0.2698, + (350, 3, 'isoplus', 'DRE-350-TWIRE'): 0.2605, + (400, 3, 'isoplus', 'DRE-400-TWIRE'): 0.2684, + (450, 3, 'isoplus', 'DRE-450-TWIRE'): 0.2703, + (500, 3, 'isoplus', 'DRE-500-TWIRE'): 0.2669, + (600, 3, 'isoplus', 'DRE-600-TWIRE'): 0.3065, + # isoplus twin disconti, standard, 30K delta T + (20, 1, 'isoplus', 'DRD-20-STD'): (25,54), + (25, 1, 'isoplus', 'DRD-25-STD'): (40,88), + (32, 1, 'isoplus', 'DRD-32-STD'): (82,164), + (40, 1, 'isoplus', 'DRD-40-STD'): (110,220), + (50, 1, 'isoplus', 'DRD-50-STD'): (205,410), + (65, 1, 'isoplus', 'DRD-65-STD'): (341,683), + (80, 1, 'isoplus', 'DRD-80-STD'): (537,1074), + (100, 1, 'isoplus', 'DRD-100-STD'): (905,1811), + (125, 1, 'isoplus', 'DRD-125-STD'): (1732,3118), + (150, 1, 'isoplus', 'DRD-150-STD'): (3042,5324), + (200, 1, 'isoplus', 'DRD-200-STD'): (6097,10451), + # isoplus twin disconti, reinforced, 30K delta T + (20, 2, 'isoplus', 'DRD-20-RE'): 0.1608, + (25, 2, 'isoplus', 'DRD-25-RE'): 0.1700, + (32, 2, 'isoplus', 'DRD-32-RE'): 0.1856, + (40, 2, 'isoplus', 'DRD-40-RE'): 0.2144, + (50, 2, 'isoplus', 'DRD-50-RE'): 0.2076, + (65, 2, 'isoplus', 'DRD-65-RE'): 0.2430, + (80, 2, 'isoplus', 'DRD-80-RE'): 0.2653, + (100, 2, 'isoplus', 'DRD-100-RE'): 0.2635, + (125, 2, 'isoplus', 'DRD-125-RE'): 0.2488, + (150, 2, 'isoplus', 'DRD-150-RE'): 0.2914, + (200, 2, 'isoplus', 'DRD-200-RE'): 0.3037, + # isoplus twin disconti, twice reinforced, 30K delta T + (20, 3, 'isoplus', 'DRD-20-TWIRE'): 0.1423, + (25, 3, 'isoplus', 'DRD-25-TWIRE'): 0.1516, + (32, 3, 'isoplus', 'DRD-32-TWIRE'): 0.1661, + (40, 3, 'isoplus', 'DRD-40-TWIRE'): 0.1882, + (50, 3, 'isoplus', 'DRD-50-TWIRE'): 0.1833, + (65, 3, 'isoplus', 'DRD-65-TWIRE'): 0.2074, + (80, 3, 'isoplus', 'DRD-80-TWIRE'): 0.2199, + (100, 3, 'isoplus', 'DRD-100-TWIRE'): 0.2197, + (125, 3, 'isoplus', 'DRD-125-TWIRE'): 0.2126, + (150, 3, 'isoplus', 'DRD-150-TWIRE'): 0.2379 + } + +# ***************************************************************************** +# ***************************************************************************** + +# # pipe data +# pipedb = StandardisedPipeDatabase(source=pipedata_files) + +# # fluid data +# fluiddata_file = 'fluids/incropera2006_saturated_water.csv' +# fluiddb = fic.FluidDatabase(fluid='water', phase='l', source=fluiddata_file) + +list_max_specific_pressure_loss = [60, 80] + +# ***************************************************************************** +# ***************************************************************************** + +# pipe tuples + +list_single_pipe_tuples = [ + pipe_tuple + for pipe_tuple in list_pipe_tuples + if not pipedb.is_twin[pipe_tuple] + ] + +list_twin_pipe_tuples = [ + pipe_tuple + for pipe_tuple in list_pipe_tuples + if pipedb.is_twin[pipe_tuple] + ] + +# pipe objects + +list_single_pipes = [ + StandardisedPipe( + pipe_tuple=pipe_tuple, + e_eff=pipe_e_eff, # override pipe absolute roughness + length=pipe_length, # override the pipe length + db=pipedb) + for pipe_tuple in list_single_pipe_tuples + ] + +list_twin_pipes = [ + StandardisedTwinPipe( + pipe_tuple=pipe_tuple, + e_eff=pipe_e_eff, # override pipe absolute roughness + length=pipe_length, # override the pipe length + db=pipedb) + for pipe_tuple in list_twin_pipe_tuples + ] + +# create a list of pipe objects +dict_single_trench = {} +dict_single_capacity = {} +dict_single_heat_transfer_rate = {} +dict_twin_trench = {} +dict_twin_capacity = {} +dict_twin_heat_transfer_rate = {} + +# for each specific pressure loss level +for max_specific_pressure_loss in list_max_specific_pressure_loss: + + if len(list_single_pipe_tuples) != 0: + # single pipe trench + single_trench = SupplyReturnPipeTrench( + pipe_center_depth=[pipe_depth+pipe.d_cas/2 for pipe in list_single_pipes], + # pipe_center_distance=[pipe_distance+pipe.d_cas for pipe in list_single_pipes], # minimum_assembling_distance + pipe_center_distance=[minimum_assembling_distance_isoplus(pipe.d_cas)+pipe.d_cas for pipe in list_single_pipes], + fluid_db=fluiddb, + phase=fluiddb.fluid_LIQUID, + pressure=[1e5 for i in range(len(list_single_pipes))], + supply_temperature=[dh_flow_temperature for i in range(len(list_single_pipes))], + return_temperature=[dh_return_temperature for i in range(len(list_single_pipes))], + max_specific_pressure_loss=[max_specific_pressure_loss for i in range(len(list_single_pipes))], + supply_pipe=list_single_pipes + ) + assert single_trench.vector_mode + + # single pipe trench losses + qs, qr = single_trench.specific_heat_transfer_surroundings( + ground_thermal_conductivity=soil_k, + ground_air_heat_transfer_coefficient=ground_air_heat_transfer_coefficient, + temperature_surroundings=ground_temperature, + method=single_pipe_trench_config[0], + model=single_pipe_trench_config[1] + ) + single_trench_htr = [_qs+_qr for _qs, _qr in zip(qs, qr)] + + # add lists to the dicts + dict_single_trench.update( + {max_specific_pressure_loss: single_trench} + ) + dict_single_heat_transfer_rate.update( + {max_specific_pressure_loss: single_trench_htr} + ) + dict_single_capacity.update( + {max_specific_pressure_loss: single_trench.rated_heat_capacity()} + ) + +model_string_ids = ['-STD','-RE','-TWIRE'] + +single_pipe_tuples_per_tech = { + i: [pipe_tuple for pipe_tuple in list_single_pipe_tuples if model_string_ids[i] in pipe_tuple[3]] + for i, _str in enumerate(model_string_ids) + } + +twin_pipe_tuples_per_tech = { + i: [pipe_tuple for pipe_tuple in list_twin_pipe_tuples if model_string_ids[i] in pipe_tuple[3]] + for i, _str in enumerate(model_string_ids) + } + +# ***************************************************************************** +# ***************************************************************************** + +# plot of the pipe heat capacity as a function of the diameter + +fig, ax = plt.subplots() +fig.set_size_inches(12,8) + +cpdt = 4187*(dh_flow_temperature-dh_return_temperature)*(1000/3600)/1000 # m in tons per hour; cpdt has to be in J/Kg + + +# single pipe +ax.semilogy( + [d for d in m_pipes], + [cpdt*m[0] for d, m in m_pipes.items()], + 'rd-', + label='2x single, 60 Pa/m (datasheet)' + ) + +# single pipe +ax.semilogy( + [d for d in m_pipes], + [cpdt*m[1] for d, m in m_pipes.items()], + 'bd-', + label='2x single, 80 Pa/m (datasheet)' + ) + +style_category_specific_pressure_loss = { + 60: 'ro--', + 80: 'bo--', + } + +for max_specific_pressure_loss in list_max_specific_pressure_loss: + + # the friction factor is correct at DN600 but not the RE and the fluid speed + + # model, single + for tech_index, _single_pipe_tuples in single_pipe_tuples_per_tech.items(): + _indices = [list_single_pipe_tuples.index(pipe_tuple) for pipe_tuple in _single_pipe_tuples] + ax.semilogy( + [1000*list_single_pipes[index].d_int for index in _indices], + [dict_single_capacity[max_specific_pressure_loss][list_single_pipe_tuples.index(pipe_tuple)]/1e3 + for pipe_tuple in _single_pipe_tuples], + style_category_specific_pressure_loss[max_specific_pressure_loss], + markerfacecolor='none', + markersize=15, + label='2x single (model), '+str(max_specific_pressure_loss)+' Pa/m') + break + +ax.set(xlabel='Internal diameter [mm]', + ylabel='Capacity [kW]') + +ax.grid() + +ax.set(xlim=(0, 1000),ylim=(10, 8e5)) +ax.legend() + +# fig.savefig("test.png") +plt.show() + +# ***************************************************************************** +# ***************************************************************************** \ No newline at end of file diff --git a/examples/script_pipe_losses.py b/examples/script_pipe_losses.py index 1f2478bfa9448a305ca49aef1989da81a4aa96bb..821188f01f7d2f25732ecefc1ac51912c49f601a 100644 --- a/examples/script_pipe_losses.py +++ b/examples/script_pipe_losses.py @@ -653,7 +653,7 @@ for max_specific_pressure_loss in list_max_specific_pressure_loss: fig, ax = plt.subplots() -fig.set_size_inches(15,10) +fig.set_size_inches(12,8) model_string_ids = ['-STD','-RE','-TWIRE'] @@ -736,9 +736,8 @@ for tech_index, _twin_pipe_tuples in twin_pipe_tuples_per_tech.items(): markersize=10, label='isoplus, 1x twin (model)') -ax.set(xlabel='Nominal diameter (DN)', - ylabel='Specific heat losses [W/m]', - title='Specific heat losses as a function of pipe diameter') +ax.set(xlabel='Internal diameter [mm]', + ylabel='Specific heat losses [W/m]') ax.set(xlim=(0, 1000),ylim=(5, 100)) ax.grid(which='both') @@ -750,73 +749,64 @@ plt.show() # ***************************************************************************** # ***************************************************************************** -# plot of the pipe heat capacity as a function of the diameter +# twin pipes only fig, ax = plt.subplots() -fig.set_size_inches(15,10) -cpdt = 4187*(dh_flow_temperature-dh_return_temperature)*(1000/3600)/1000 # m in tons per hour; cpdt has to be in J/Kg - -max_specific_pressure_loss = 80 - -# single pipe -ax.semilogy( - [d for d in m_pipes], - [cpdt*m[0] for d, m in m_pipes.items()], - 'go-', - markersize=10, - label='isoplus, 2x single, 60 Pa/m (datasheet)' - ) - -# single pipe -ax.semilogy( - [d for d in m_pipes], - [cpdt*m[1] for d, m in m_pipes.items()], - 'ro-', - markersize=10, - label='isoplus, 2x single, 80 Pa/m (datasheet)' - ) +fig.set_size_inches(12,8) -for max_specific_pressure_loss in list_max_specific_pressure_loss: - - # the friction factor is correct at DN600 but not the RE and the fluid speed - - # model, single - for tech_index, _single_pipe_tuples in single_pipe_tuples_per_tech.items(): - _indices = [list_single_pipe_tuples.index(pipe_tuple) for pipe_tuple in _single_pipe_tuples] - ax.semilogy( - [1000*list_single_pipes[index].d_int for index in _indices], - [dict_single_capacity[max_specific_pressure_loss][list_single_pipe_tuples.index(pipe_tuple)]/1e3 - for pipe_tuple in _single_pipe_tuples], - # [1000*pipe.d_int for pipe in list_single_pipes], - # [dict_single_capacity[max_specific_pressure_loss][i]/1e3 - # for i, pipe_tuple in enumerate(list_single_pipe_tuples)], - 'gx', - markersize=10, - label='isoplus, 2x single (model)') - break - - # [dict_single_trench[max_specific_pressure_loss].nmls_supply - # for pipe_tuple in _single_pipe_tuples] - +model_string_ids = ['-STD','-RE','-TWIRE'] +category_captions = {'-STD': 'S1','-RE': 'S2','-TWIRE': 'S3'} -# ax.semilogy([1000*pipe.d_int for pipe in list_twin_pipes], -# [dict_twin_capacity[max_specific_pressure_loss][i]/1e3 -# for i, pipe_tuple in enumerate(list_twin_pipe_tuples)], -# 'k^', -# markersize=10, -# label='isoplus, 1x twin (model)') +style_category_twin_official = { + 0: 'bo-', + 1: 'bx-', + 2: 'bd-' + } -ax.set(xlabel='Nominal diameter (DN)', - ylabel='Capacity [kW]', - title='Specific heat losses as a function of pipe diameter') +style_category_twin_model = { + 0: 'ko-', + 1: 'kx-', + 2: 'kd-' + } -ax.grid() +twin_pipe_tuples_per_tech = { + i: [pipe_tuple for pipe_tuple in list_twin_pipe_tuples if model_string_ids[i] in pipe_tuple[3]] + for i, _str in enumerate(model_string_ids) + } +# official + +for max_specific_pressure_loss in list_max_specific_pressure_loss: + for tech_index, _twin_pipe_tuples in twin_pipe_tuples_per_tech.items(): + _indices = [list_twin_pipe_tuples.index(pipe_tuple) for pipe_tuple in _twin_pipe_tuples] + ax.semilogy( + [1000*list_twin_pipes[index].d_int for index in _indices], + [u_pipes[pipe_tuple]*(temperature_fluid_bulk-ground_temperature) + for pipe_tuple in _twin_pipe_tuples], + style_category_twin_official[tech_index], + markersize=10, + label='twin pipe, '+category_captions[model_string_ids[tech_index]]+' series (datasheet)' + ) +# model, twin +for tech_index, _twin_pipe_tuples in twin_pipe_tuples_per_tech.items(): + _indices = [list_twin_pipe_tuples.index(pipe_tuple) for pipe_tuple in _twin_pipe_tuples] + ax.semilogy([1000*list_twin_pipes[index].d_int for index in _indices], + [dict_twin_heat_transfer_rate[max_specific_pressure_loss][list_twin_pipe_tuples.index(pipe_tuple)] + for pipe_tuple in _twin_pipe_tuples], + style_category_twin_model[tech_index], + markersize=10, + label='twin pipe, '+category_captions[model_string_ids[tech_index]]+' series (model)') + +ax.set(xlabel='Internal diamater [mm]', + ylabel='Specific heat losses [W/m]') + +ax.set(xlim=(10, 220),ylim=(5, 20)) +ax.grid(which='both') ax.legend() # fig.savefig("test.png") plt.show() # ***************************************************************************** -# ***************************************************************************** \ No newline at end of file +# ***************************************************************************** \ No newline at end of file