web-dev-qa-db-de.com

Mehrere Boxplots in Seaborn zeichnen?

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?

6
Jane Sully

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()

 enter image description here

13
Parfait
# 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()

Boxplot Beispiel

0