[Python] Python Bar Chart Bug

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

  1. Stack

    Stack Membro Participativo

    I am new to python and with the help of Chatgpt I have created the code below.

    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np

    # Load your data
    df_diff = pd.read_csv("incremental_price_differences.csv") # Contains *_diff columns
    df_rank = pd.read_csv("Power_Prices_Ranked.csv")

    techs = ["CCGT", "Hydrogen CCGT", "OCGT", "Hydrogen OCGT", "Engine", "CCS", "Elec_SMP"]

    # Merge DataFrames
    df = df_diff.merge(df_rank, on=["Date", "Hour"], suffixes=("_diff", "_rank"))
    df = df.sort_values("Hour")

    color_map = {
    "CCGT": "#1f77b4",
    "Hydrogen CCGT": "#ff7f0e",
    "OCGT": "#2ca02c",
    "Hydrogen OCGT": "#d62728",
    "Engine": "#9467bd",
    "CCS": "#8c564b",
    "Elec_SMP": "#e377c2",
    }
    plotted_techs = set()

    fig, ax = plt.subplots(figsize=(20, 6)) # Increase figure width

    # Loop hour-by-hour
    for _, row in df.iterrows():
    hour = row["Hour"]
    tech_info = [(tech, row[f"{tech}_diff"], int(row[f"{tech}_rank"])) for tech in techs]
    tech_info_sorted = sorted(tech_info, key=lambda x: x[2])

    bottom = 0
    for tech, value, _ in tech_info_sorted:
    label = tech if tech not in plotted_techs else None
    ax.bar(hour, value, bottom=bottom, color=color_map[tech], label=label)
    bottom += value
    plotted_techs.add(tech)

    ax.set_xlabel("Hour")
    ax.set_ylabel("£/MWh")
    ax.set_title("Power Technology Prices Per Hour")

    # Show only every 50th hour label
    unique_hours = sorted(df["Hour"].unique())
    step = 50 # Changed from 5 to 50
    ticks = [h for h in unique_hours if h % step == 0] # Only show hours that are multiples of 50
    ax.set_xticks(ticks)

    ax.set_ylim(0, 1000)
    ax.legend(title="Technology", bbox_to_anchor=(1.05, 1), loc="upper left")

    # Rotate x-axis labels
    ax.tick_params(axis='x', labelrotation=45)
    plt.tight_layout()
    plt.show()


    The aim of the code is to take the 'incremental_price_differences' which has data formatted like the below,

    [​IMG]

    and create a bar chart for every hour but the order of the bars should be based on the 'Power_Prices_Ranked' file, formatted like the below,

    [​IMG]

    The problem is that there are too many x-axis labels making the graph unreadable, see the image below,

    [​IMG]

    I have tried to edit the code to resolve this but no matter what I do the labels stay the same. The issue also occurs when I try to set the y_lim which also has no effect.

    Why is my fix for the labels not working? How can I resolve the issue? Is there a better way to write my code?

    Kind regards,

    Joshua Dunn

    Continue reading...

Compartilhe esta Página