Ausgabe
Ich möchte Boxplots mit Seaborn in Pandas zeichnen, weil es eine schönere Art ist, Daten zu visualisieren, aber ich bin nicht allzu vertraut damit. Ich habe drei Datenrahmen, die unterschiedliche Metriken sind, und ich möchte die verschiedenen Metriken vergleichen. Ich werde die Dateipfade durchlaufen, um auf sie zuzugreifen.
for path in paths:
df = pd.read_csv(path)
Die dfs für jede der Metriken sind separat und sehen etwa so aus (wobei …. ausgefüllte Datenwerte angibt). 1, 2, 3, 4, 5 sind die Spaltennamen und geben verschiedene Versuche an:
1 2 3 4 5
0 ..............
1 ..............
2 ..............
3 ..............
4 ..............
Ich möchte alle Diagramme für die Versuche 1, 2, 3, 4, 5 und jede der 3 Metriken nebeneinander haben, wobei alle ersten Versuchsdiagramme für die drei Metriken auf der linken Seite wären, dann alle zweiten Versuchsdiagramme wäre rechts davon, und so weiter.
Wie könnte ich das in Seaborn machen? Ich weiß, dass ich für jede Metrik einzeln ein Diagramm erstellen kann, indem ich den Pfad durchlaufe und die Boxplot-Funktion wie folgt verwende:
sns.boxplot(data=df)
Wie kann ich jedoch die Diagramme der anderen Metriken nebeneinander in dasselbe Diagramm einfügen?
Lösung
Erwägen Sie, zuerst eine Gruppierungsspalte wie Trial für jeden entsprechenden Datenrahmen zuzuweisen, dann pd.concat
Ihre Datenrahmen und schließlich pd.melt
die Daten für einen Indikator-/Wert-Datenrahmen in Längsrichtung, bevor Sie mit Seaborn zeichnen. Unten demonstriert mit zufälligen Daten:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
np.random.seed(44)
# DATAFRAMES WITH TRIAL COLUMN ASSIGNED
df1 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=1)
df2 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=2)
df3 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=3)
cdf = pd.concat([df1, df2, df3]) # CONCATENATE
mdf = pd.melt(cdf, id_vars=['Trial'], var_name=['Number']) # MELT
print(mdf.head())
# Trial Number value
# 0 1 1 -0.750615
# 1 1 1 -1.715070
# 2 1 1 -0.963404
# 3 1 1 0.360856
# 4 1 1 -1.190504
ax = sns.boxplot(x="Trial", y="value", hue="Number", data=mdf) # RUN PLOT
plt.show()
plt.clf()
plt.close()
Beantwortet von – Parfait
Antwort geprüft von – Jay B. (FixError Admin)