BBBA-flowers / utils /generate_horizontal_boxplot.py
elenamedea
publish public version 1.0
573a558
Raw
History Blame Contribute Delete
2.87 kB
import pandas as pd
import plotly.graph_objects as go
def generate_horizontal_boxplot(dataFrame: pd.DataFrame, id_column: str, features: list[str],
color_dict: dict[str, str], title: str, yaxis_title: str, xaxis_title: str,
height: float = 900, width: float = 2600) -> go.Figure:
'''
Returns a boxplot for Height data features (columns), 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 boxplot
yaxis_title: Title of the y-axis
xaxis_title: Title of the x-axis
height: Height of the plot; default is 900
width: Width of the plot; default is 2600
------------------------------------------------------------------------------------------------------------
'''
# Melt the DataFrame to long format for plotting
melted_data = pd.melt(dataFrame, id_vars = [id_column], value_vars = features,
var_name = "Height(cm)", value_name = "Height")
# Sort the DataFrame by "HeightType" and "Height" in ascending order
melted_data = melted_data.sort_values([id_column, "Height"])
# Create traces for the horizontal box plot
traces = []
for height_type, color in color_dict.items():
height_data = melted_data[melted_data["Height(cm)"] == height_type]
trace = go.Box(
y = height_data["Height(cm)"], x = height_data["Height"], name = height_type,
boxpoints = "all", marker_color = color, orientation = "h")
traces.append(trace)
# Create boxplot's layout
layout = go.Layout(
height = height,
width = width,
title = dict(text = title, font = dict(size = 28, 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")),
xaxis = dict(title = xaxis_title, titlefont = dict(size = 20, family = "Times New Roman"), tickfont = dict(size = 18, family = "Times New Roman")),
legend = dict(
title = dict(text = xaxis_title, font = dict(family = "Times New Roman", size = 20)),
traceorder = "normal",
font = dict(family = "Times New Roman", size = 17)))
# Create figure
fig = go.Figure(data = traces, layout = layout)
return fig