[Python] Aligning matplotlib subplots one with stacked bar plot and another with line plot...

Discussão em 'Python' iniciado por Stack, Abril 11, 2025.

  1. Stack

    Stack Membro Participativo

    I have 2 dataframes as follows: df1.to_dict() results in

    {'Peak Demand PES': {2023: 124126.91,
    2025: 154803.41,
    2030: 231494.66,
    2040: 483217.66000000003,
    2050: 1004207.86},
    'Peak Demand TES': {2023: 125724.8,
    2025: 142959.13999999998,
    2030: 186044.99000000002,
    2040: 288307.99,
    2050: 424827.79},
    'Peak Demand DES': {2023: 125263.94,
    2025: 152080.7,
    2030: 219122.6,
    2040: 385960.3,
    2050: 671678.9}}


    df2.to_dict() results in

    {'Biomass PP': {2023: 783.2,
    2025: 840.5,
    2030: 990.5,
    2040: 711.0,
    2050: 167.0},
    'Coal PP': {2023: 51235.8,
    2025: 48912.8,
    2030: 41527.8,
    2040: 24125.8,
    2050: 13409.8},
    'Diesel PP': {2023: 10498.41,
    2025: 10347.69,
    2030: 9020.56,
    2040: 6227.39,
    2050: 3049.75},
    'Geothermal PP': {2023: 1004.4,
    2025: 1074.4,
    2030: 1249.4,
    2040: 1148.4,
    2050: 328.3},
    'HFO PP': {2023: 6462.1,
    2025: 6358.04,
    2030: 5468.59,
    2040: 2521.35,
    2050: 205.58},
    'Large Hydro Dam PP': {2023: 28363.22,
    2025: 32053.86,
    2030: 41259.46,
    2040: 43980.76,
    2050: 32379.44},
    'Natural Gas PP': {2023: 116472.48,
    2025: 110897.38,
    2030: 106429.18000000001,
    2040: 69705.68,
    2050: 8774.35},
    'PumpStorage': {2023: 3721.0,
    2025: 4063.0,
    2030: 4918.0,
    2040: 6498.0,
    2050: 6498.0},
    'Solar PV - Utility PP': {2023: 10422.59,
    2025: 12731.45,
    2030: 18576.6,
    2040: 23338.15,
    2050: 16738.45},
    'Solar Thermal PP': {2023: 1095.0,
    2025: 1095.0,
    2030: 1095.0,
    2040: 670.0,
    2050: nan},
    'Transmission': {2023: 25.83,
    2025: 28.01,
    2030: 33.46,
    2040: 43.76,
    2050: 47.56},
    'Wind PP': {2023: 8193.02,
    2025: 9297.62,
    2030: 12193.52,
    2040: 7261.3,
    2050: 1735.0}}


    I want to create a sub-plot showing df1 as line plot and df2 as stacked bar plot. I tried:

    fig, ax = plt.subplots()

    df1.plot(
    ax = ax,
    zorder = 0,
    marker = "o"
    )

    df2.plot(ax = ax,
    kind = "bar",
    stacked = True,
    color = color_map,
    zorder = 1)

    plt.legend(bbox_to_anchor = (1.1, 1))


    But i don't see the line plot: [​IMG]

    Next, i tried this code:

    import matplotlib.pyplot as plt

    fig, ax = plt.subplots()

    # Plot stacked bars
    df2.plot(kind="bar",
    stacked=True,
    ax=ax,
    color=color_map,
    width=0.8,
    position=0)

    years = df1.index
    offset = 0.5 # try small shifts like -0.2, 0.2, etc.

    for col in df1.columns:
    ax.plot([x for x in range(len(years))],
    df1[col].values,
    label=col,
    linewidth=3,
    linestyle='--',
    marker='o')

    # Adjust legend
    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles, labels, bbox_to_anchor=(1.1, 1))

    plt.ylabel("GW")
    plt.tight_layout()
    plt.show()


    [​IMG] However, the x-axis is not aligned between the 2 sub-plots. How can I fix this?

    Continue reading...

Compartilhe esta Página