I’m trying to plot the below summary metric plot using plotly.
data
Model F1_Score Precision Recall Accuracy ROC_AUC CV_Score 0 LogisticRegression 0.815068 0.777778 0.856115 0.739130 0.678058 0.752876 1 K-NearestNeighbors 0.828767 0.790850 0.870504 0.758454 0.699958 0.714476 2 SVM 0.852459 0.783133 0.935252 0.782609 0.702920 0.665067 3 GaussianProcess 0.825503 0.773585 0.884892 0.748792 0.677740 0.665067 4 MLP 0.774436 0.811024 0.741007 0.710145 0.694033 0.735327 5 DecisionTree 0.747170 0.785714 0.712230 0.676329 0.657586 0.692216 6 ExtraTrees 0.859060 0.805031 0.920863 0.797101 0.732490 0.792698 7 RandomForest 0.826667 0.770186 0.892086 0.748792 0.673984 0.778324 8 XGBoost 0.838488 0.802632 0.877698 0.772947 0.718261 0.764025 9 AdaBoostClassifier 0.800000 0.780822 0.820144 0.724638 0.674778 0.728927 10 GBClassifier 0.835017 0.784810 0.892086 0.763285 0.696043 0.754451 11 CatBoost 0.843854 0.783951 0.913669 0.772947 0.699482 0.768787 12 Stacking 0.833333 0.776398 0.899281 0.758454 0.684934 0.787949 13 Voting 0.836120 0.781250 0.899281 0.763285 0.692287 0.778337 14 Bagging 0.855263 0.787879 0.935252 0.787440 0.710273 0.792673
import plotly.graph_objects as go
mark_color = ['rgba(246, 78, 139, 0.6)', 'rgba(58, 71, 80, 0.6)', 'rgba(50, 171, 96, 0.6)', 'rgba(38, 24, 74, 0.6)', 'rgba(155, 83, 109, 0.6)', 'rgba(297, 55, 74, 0.6)']
line_color = ['rgba(246, 78, 139, 1.0)', 'rgba(58, 71, 80, 1.0)', 'rgba(50, 171, 96, 1.0)', 'rgba(38, 24, 74, 1.0)', 'rgba(155, 83, 109, 1.0)', 'rgba(297, 55, 74, 1.0)']
y_labels = ["F1_Score", "Precision", "Recall", "Accuracy", "ROC_AUC", "CV_Score"]
fig = go.Figure()
for i, j in enumerate(y_labels):
fig.add_trace(go.Bar(
y=y_labels,
x=list(scores[j].values),
name=j,
orientation='h',
marker=dict(
color=mark_color[i]
)
))
fig.update_layout(
barmode='stack',
title="Summary Metrics",
xaxis_title="Metric Value",
yaxis_title="Metric Name",
legend_title="Model",
)
fig.show()
So far, I’m able to plot this
I’m unable to add Model Names to the plot. How add Model column as Legend and add all model values into the plot?
Advertisement
Answer
- shape the data frame first
df2 = df.set_index("Model").unstack().to_frame().reset_index() - then it’s a simple case of using Plotly Express
import pandas as pd
import io
import plotly.express as px
df = pd.read_csv(
io.StringIO(
"""Model F1_Score Precision Recall Accuracy ROC_AUC CV_Score
0 LogisticRegression 0.815068 0.777778 0.856115 0.739130 0.678058 0.752876
1 K-NearestNeighbors 0.828767 0.790850 0.870504 0.758454 0.699958 0.714476
2 SVM 0.852459 0.783133 0.935252 0.782609 0.702920 0.665067
3 GaussianProcess 0.825503 0.773585 0.884892 0.748792 0.677740 0.665067
4 MLP 0.774436 0.811024 0.741007 0.710145 0.694033 0.735327
5 DecisionTree 0.747170 0.785714 0.712230 0.676329 0.657586 0.692216
6 ExtraTrees 0.859060 0.805031 0.920863 0.797101 0.732490 0.792698
7 RandomForest 0.826667 0.770186 0.892086 0.748792 0.673984 0.778324
8 XGBoost 0.838488 0.802632 0.877698 0.772947 0.718261 0.764025
9 AdaBoostClassifier 0.800000 0.780822 0.820144 0.724638 0.674778 0.728927
10 GBClassifier 0.835017 0.784810 0.892086 0.763285 0.696043 0.754451
11 CatBoost 0.843854 0.783951 0.913669 0.772947 0.699482 0.768787
12 Stacking 0.833333 0.776398 0.899281 0.758454 0.684934 0.787949
13 Voting 0.836120 0.781250 0.899281 0.763285 0.692287 0.778337
14 Bagging 0.855263 0.787879 0.935252 0.787440 0.710273 0.792673"""
),
sep="s+",
)
df2 = df.set_index("Model").unstack().to_frame().reset_index()
fig = px.bar(
df2,
y="level_0",
x=0,
color="Model",
color_discrete_map={
"LogisticRegression": "#2E91E5",
"K-NearestNeighbors": "#E15F99",
"SVM": "#1CA71C",
"GaussianProcess": "#FB0D0D",
"MLP": "#DA16FF",
"DecisionTree": "#222A2A",
"ExtraTrees": "#B68100",
"RandomForest": "#750D86",
"XGBoost": "#EB663B",
"AdaBoostClassifier": "#511CFB",
"GBClassifier": "#00A08B",
"CatBoost": "#FB00D1",
"Stacking": "#FC0080",
"Voting": "#B2828D",
"Bagging": "#6C7C32",
},
)
fig.update_layout(
title="Summary Metrics",
xaxis_title="Metric Value",
yaxis_title="Metric Name",
legend_title="Model",
)


