def __produceFigure(FSCPsCols: list, plotFSCP: pd.DataFrame, plotFSCPSteel: pd.DataFrame, plotLines: pd.DataFrame, plotLinesSteel: pd.DataFrame, config: dict):
    fig = make_subplots(rows=2, cols=2, subplot_titles=ascii_lowercase, shared_yaxes=True, horizontal_spacing=0.025, vertical_spacing=0.1)
    traces = __addFSCPTraces(plotFSCP, plotLines, len(FSCPsCols), config['refFuelTop'], config)
    for (id, trace) in traces:
        for (j, col) in enumerate(FSCPsCols[id]):
            if j:
                trace.showlegend = False
            fig.add_trace(trace, row=1, col=col)
    traces = __addFSCPTraces(plotFSCPSteel, plotLinesSteel, len(FSCPsCols), config['refFuelBottom'], config)
    for (id, trace) in traces:
        for (j, col) in enumerate(FSCPsCols[id]):
            trace.showlegend = False
            fig.add_trace(trace, row=2, col=col)
    cpTrajData = __computeCPTraj(config['co2price_traj']['years'], config['co2price_traj']['values'], config['n_samples'])
    traces = __addCPTraces(cpTrajData, config)
    for trace in traces:
        for (i, j) in [(0, 0), (0, 1), (1, 0), (1, 1)]:
            if (i or j):
                trace.showlegend = False
            fig.add_trace(trace, row=(i + 1), col=(j + 1))
    for (i, j) in [(0, 0), (0, 1), (1, 0), (1, 1)]:
        fig.add_hline(0.0, line_width=config['global']['lw_thin'], line_color='black', row=(i + 1), col=(j + 1))
    annotationStyling = dict(xanchor='center', yanchor='middle', showarrow=False, bordercolor='black', borderwidth=2, borderpad=3, bgcolor='white')
    for i in range(2):
        axisNumb = (str((i + 1)) if i else '')
        blueTech = config['annotationLabels']['blueTechs'][i]
        fig.add_annotation(x=0.5, xref=f'x{axisNumb} domain', y=1.15, yref=f'y{axisNumb} domain', text=f'Blue H<sub>2</sub> from {blueTech}', **annotationStyling)
    for i in range(2):
        axisNumb = (str((i + 2)) if i else '')
        application = config['annotationLabels']['applications'][i]
        fig.add_annotation(x=(- 0.17), xref=f'x{axisNumb} domain', y=0.5, yref=f'y{axisNumb} domain', text=f'{application}', textangle=(- 90), **annotationStyling)
    __addAnnotations(fig, cpTrajData, plotLines, plotLinesSteel, config)
    __addAnnotationArrows(fig, config)
    __addAnnotationsLegend(fig, config)
    fig.update_layout(xaxis=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis2=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis3=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis4=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), yaxis=dict(title=config['labels']['fscp'], range=[config['plotting']['fscp_min'], config['plotting']['fscp_max']]), yaxis3=dict(title=config['labels']['fscp_steel'], range=[config['plotting']['fscp_min'], config['plotting']['fscp_max']]), margin_l=180.0, margin_b=520.0)
    return fig
def __produceFigure(FSCPsCols: list, plotFSCP: pd.DataFrame, plotFSCPSteel: pd.DataFrame, plotLines: pd.DataFrame, plotLinesSteel: pd.DataFrame, config: dict):
    fig = make_subplots(rows=2, cols=2, subplot_titles=ascii_lowercase, shared_yaxes=True, horizontal_spacing=0.025, vertical_spacing=0.1)
    traces = __addFSCPTraces(plotFSCP, plotLines, len(FSCPsCols), config['refFuelTop'], config)
    for (id, trace) in traces:
        for (j, col) in enumerate(FSCPsCols[id]):
            if j:
                trace.showlegend = False
            fig.add_trace(trace, row=1, col=col)
    traces = __addFSCPTraces(plotFSCPSteel, plotLinesSteel, len(FSCPsCols), config['refFuelBottom'], config)
    for (id, trace) in traces:
        for (j, col) in enumerate(FSCPsCols[id]):
            trace.showlegend = False
            fig.add_trace(trace, row=2, col=col)
    cpTrajData = __computeCPTraj(config['co2price_traj']['years'], config['co2price_traj']['values'], config['n_samples'])
    traces = __addCPTraces(cpTrajData, config)
    for trace in traces:
        for (i, j) in [(0, 0), (0, 1), (1, 0), (1, 1)]:
            if (i or j):
                trace.showlegend = False
            fig.add_trace(trace, row=(i + 1), col=(j + 1))
    for (i, j) in [(0, 0), (0, 1), (1, 0), (1, 1)]:
        fig.add_hline(0.0, line_width=config['global']['lw_thin'], line_color='black', row=(i + 1), col=(j + 1))
    annotationStyling = dict(xanchor='center', yanchor='middle', showarrow=False, bordercolor='black', borderwidth=2, borderpad=3, bgcolor='white')
    for i in range(2):
        axisNumb = (str((i + 1)) if i else )
        blueTech = config['annotationLabels']['blueTechs'][i]
        fig.add_annotation(x=0.5, xref=f'x{axisNumb} domain', y=1.15, yref=f'y{axisNumb} domain', text=f'Blue H<sub>2</sub> from {blueTech}', **annotationStyling)
    for i in range(2):
        axisNumb = (str((i + 2)) if i else )
        application = config['annotationLabels']['applications'][i]
        fig.add_annotation(x=(- 0.17), xref=f'x{axisNumb} domain', y=0.5, yref=f'y{axisNumb} domain', text=f'{application}', textangle=(- 90), **annotationStyling)
    __addAnnotations(fig, cpTrajData, plotLines, plotLinesSteel, config)
    __addAnnotationArrows(fig, config)
    __addAnnotationsLegend(fig, config)
    fig.update_layout(xaxis=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis2=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis3=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), xaxis4=dict(title=config['labels']['time'], range=[config['plotting']['t_min'], config['plotting']['t_max']]), yaxis=dict(title=config['labels']['fscp'], range=[config['plotting']['fscp_min'], config['plotting']['fscp_max']]), yaxis3=dict(title=config['labels']['fscp_steel'], range=[config['plotting']['fscp_min'], config['plotting']['fscp_max']]), margin_l=180.0, margin_b=520.0)
    return fig