Ich möchte Boxplots mit Seaborn in Pandas plotten, da dies eine schönere Art ist, Daten zu visualisieren, aber ich bin damit nicht allzu vertraut. Ich habe drei Datenframes, bei denen es sich um unterschiedliche Metriken handelt, und ich möchte die verschiedenen Metriken vergleichen. Ich werde die Dateipfade durchlaufen, um darauf zuzugreifen.
for path in paths:
df = pd.read_csv(path)
Die DFS-Werte für die einzelnen Metriken sind separat und sehen in etwa wie folgt aus (wobei das ... ausgefüllte Datenwerte angibt). 1, 2, 3, 4, 5 sind die Spaltennamen und zeigen 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 sich alle ersten Testplots für die drei Metriken auf der linken Seite befinden, dann alle zweiten Testplots wäre rechts davon und so weiter.
Wie könnte ich das in Seaborn tun? Ich weiß, dass ich für jede Metrik ein Diagramm erstellen kann, indem Sie den Pfad durchlaufen und die Boxplot-Funktion wie folgt verwenden:
sns.boxplot(data=df)
Wie kann ich jedoch die Diagramme der anderen Metriken nebeneinander in das gleiche Diagramm einfügen?
Erwägen Sie zunächst, für jeden entsprechenden Datenrahmen eine Gruppierungsspalte wie Trial zuzuordnen, dann pd.concat
Ihre Datenrahmen und schließlich pd.melt
die Daten für einen Indikator/Wert-Datenrahmen mit langer Länge, bevor Sie mit Seaborn plotten. Nachfolgend wird mit zufälligen Daten demonstriert:
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()
# libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from random import randint, gauss
# create a DataFrame
df = pd.DataFrame({
'Sensations':[randint(1,3) for i in range(300)]
})
df['Temperature'] = df['Sensations'].map(lambda x: gauss(0.8/x,0.1)*40)
df['Sensations'] = df['Sensations'].map({1:'hot',2:'normal',3:'cold'})
# create plot
ax = sns.boxplot(x="Sensations", y="Temperature", data=df)
# show plot
plt.show()