Source code for whatstk.graph.figures.boxplot

"""Boxplot figures."""

from typing import Dict, Optional

import plotly.graph_objs as go
import pandas as pd

from whatstk.utils.utils import COLNAMES_DF


[docs]def fig_boxplot_msglen( df: pd.DataFrame, username_to_color: Dict[str, str] = None, title: str = "", xlabel: Optional[str] = None ) -> go.Figure: """Visualize boxplot. Args: df (pandas.DataFrame): Chat data. username_to_color (dict, optional). Dictionary mapping username to color. Defaults to None. title (str, optional): Title for plot. Defaults to "". xlabel (str, optional): x-axis label title. Defaults to None. Returns: plotly.graph_objs.Figure """ df = df.copy() # Get message lengths df[COLNAMES_DF.MESSAGE_LENGTH] = df[COLNAMES_DF.MESSAGE].apply(lambda x: len(x)) # Sort users by median user_stats = ( df.groupby(COLNAMES_DF.USERNAME) .aggregate({COLNAMES_DF.MESSAGE_LENGTH: "median"})[COLNAMES_DF.MESSAGE_LENGTH] .sort_values(ascending=False) ) # Create a list of traces data = [] for username in user_stats.index: x = df[df[COLNAMES_DF.USERNAME] == username][COLNAMES_DF.MESSAGE_LENGTH] trace = go.Box( y=x.values, showlegend=True, name=username, boxpoints="outliers", marker_color=username_to_color[username] if username_to_color else None, ) data.append(trace) layout = dict(title=title, xaxis=dict(title=xlabel)) fig = go.Figure(data=data, layout=layout) return fig