BBBA-flowers / utils /generate_stacked_barplot.py
elenamedea
publish public version 1.0
573a558
Raw
History Blame Contribute Delete
2.4 kB
import pandas as pd
import plotly.graph_objects as go
def generate_stacked_barplot(dataFrame: pd.DataFrame, feature: str, title: str, color_dict: dict[str, str],
legend_title: str, height: float = 1200, width: float = 2600) -> go.Figure:
'''
Returns a stacked bar chart for one data's feature (column).
Parameters:
------------------------------------------------------------------------------------------------------------
dataFrame: Name of a pandas DataFrame(two-dimensional, size-mutable, potentially heterogeneous tabular data)
feature: Name of the dataFrame's column to be visualized
title: Title of the bar chart
color_dict: Custom dictionary for the feature, containing the colors for each value
legend_title: Title of the bar chart's legend
height: Height of the plot; default is 1200
width: Width of the plot; default is 2600
------------------------------------------------------------------------------------------------------------
'''
# Count values for the bar chart
feature_counts = dataFrame[feature].value_counts()
# Create a list of traces for each category
traces = []
for feat in feature_counts.index:
feat_data = dataFrame[dataFrame[feature] == feat]
trace = go.Bar(x = feat_data[feature], y = feat_data.groupby(feature).size(), name = feat, marker_color = color_dict[feat])
traces.append(trace)
# Create layout
layout = go.Layout(
title = title, titlefont = {"size" : 24, "family" : "Times"},
xaxis = dict(title = "Familie", titlefont = dict(size = 20, family = "Times New Roman"), tickfont = dict(size = 16, family = "Times New Roman")),
yaxis = dict(title = "Anzahl", titlefont = dict(size = 20, family = "Times New Roman"), tickfont = dict(size = 16, family = "Times New Roman")),
barmode = "stack"
)
# Create figure
fig = go.Figure(data = traces, layout = layout)
# Update layout
fig.update_layout(
height = height,
width = width,
legend = dict(title = dict(text = legend_title, font = dict(family = "Times New Roman", size = 20)), # Set legend title and its font size
traceorder = "normal", # Set the trace order to "normal" (ascending)
font = dict(family = "Times New Roman", size = 13.5))) # Set legend font size
return fig