from typing import Optional
import pandas as pd
import plotly.graph_objects as go
[docs]
def plot_parallel(data: pd.DataFrame, color: Optional[str] = None, title: Optional[str] = None) -> go.Figure:
"""Create an interactive parallel plot
Useful to explore multi-dimensional data like mass-composition data
Args:
data: Dataframe to plot
color: Optional color variable
title: Optional plot title
Returns:
"""
# Kudos: https://stackoverflow.com/questions/72125802/parallel-coordinate-plot-in-plotly-with-continuous-
# and-categorical-data
categorical_columns = data.select_dtypes(include=['category', 'object'])
col_list = []
for col in data.columns:
if col in categorical_columns: # categorical columns
values = data[col].unique()
value2dummy = dict(zip(values, range(
len(values)))) # works if values are strings, otherwise we probably need to convert them
data[col] = [value2dummy[v] for v in data[col]]
col_dict = dict(
label=col,
tickvals=list(value2dummy.values()),
ticktext=list(value2dummy.keys()),
values=data[col],
)
else: # continuous columns
col_dict = dict(
range=(data[col].min(), data[col].max()),
label=col,
values=data[col],
)
col_list.append(col_dict)
if color is None:
fig = go.Figure(data=go.Parcoords(dimensions=col_list))
else:
fig = go.Figure(data=go.Parcoords(dimensions=col_list, line=dict(color=data[color])))
fig.update_layout(title=title)
return fig