import pandas as pd import plotly.graph_objects as go def generate_height_range_barplot(dataFrame: pd.DataFrame, id_column: str, features: list[str], color_dict: dict[str, str], title: str, xaxis_title: str, yaxis_title: str, legend_title: str, height: float = 1000, width: float = 3800) -> go.Figure: ''' Returns a bar plot for each species, showing the height range, i.e. height features of each species, after generating a melted data table for these features. Parameters: ------------------------------------------------------------------------------------------------------------ dataFrame: Name of a pandas DataFrame(two-dimensional, size-mutable, potentially heterogeneous tabular data) id_column: Name of the dataFrame's column to be used as the id column of the melted dataFrame features: List of the dataFrame Height columns to be visualized color_dict: Custom dictionary for the features, containing the colors for each feature title: Title of the barplot xaxis_title: Title of the x-axis yaxis_title: Title of the y-axis legend_title: Title of the barplot's legend height: Height of the plot; default is 1000 width: Width of the plot; default is 3800 ------------------------------------------------------------------------------------------------------------ ''' # Melt the DataFrame to long format for plotting melted_data = pd.melt(dataFrame, id_vars = [id_column], value_vars = features, var_name = "HeightType", value_name = "Height") # Combine "Höhe min(cm)" and "Höhe max(cm)" into a new column melted_data["Combined_Height"] = melted_data.groupby(id_column)["Height"].transform("sum") # Sort the DataFrame by "HeightType" and "Combined_Height" in ascending order melted_data = melted_data.sort_values(["HeightType", "Combined_Height"]) # Create traces for the barplot traces = [] for height_type, color in color_dict.items(): height_data = melted_data[melted_data["HeightType"] == height_type] trace = go.Bar( x = height_data[id_column], y = height_data["Height"], name = height_type, marker_color = color) traces.append(trace) # Create barplot's layout layout = go.Layout( height = height, width = width, title = dict(text = title, font = dict(size = 28, family = "Times New Roman")), xaxis = dict(title = xaxis_title, titlefont = dict(size = 20, family = "Times New Roman"), tickfont = dict(size = 16, family = "Times New Roman")), yaxis = dict(title = yaxis_title, titlefont = dict(size = 20, family = "Times New Roman"), tickfont = dict(size = 18, family = "Times New Roman")), legend = dict( title = dict(text = legend_title, font = dict(family = "Times New Roman", size = 20)), traceorder = "normal", font = dict(family = "Times New Roman", size = 17) ), xaxis_tickangle = -45) # Create figure fig = go.Figure(data = traces, layout = layout) return fig