2016-02-21 5 views
14

Eines der coolsten Dinge, die Sie leicht in seaborn machen können, ist boxplot + stripplot Kombination:Seaborn boxplot + stripplot: doppelte Legende

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 

tips = sns.load_dataset("tips") 

sns.stripplot(x="day", y="total_bill", hue="smoker", 
data=tips, jitter=True, 
palette="Set2", split=True,linewidth=1,edgecolor='gray') 

sns.boxplot(x="day", y="total_bill", hue="smoker", 
data=tips,palette="Set2",fliersize=0) 

plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.); 

boxplot+stripplot

Leider, wie Sie oben sehen können, es produziert Doppel Legende, eine für Boxplot, eine für Stripplot. Offensichtlich sieht es lächerlich und überflüssig aus. Aber ich kann keinen Weg finden, um stripplot Legende loszuwerden und nur boxplot Legende verlassen. Wahrscheinlich kann ich Artikel von plt.legend irgendwie löschen, aber ich kann es in der Dokumentation nicht finden.

Antwort

18

Sie können get what handles/labels should exist in der Legende, bevor Sie tatsächlich die Legende selbst zeichnen. Sie zeichnen dann die Legende nur mit den spezifischen, die Sie möchten.

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 

tips = sns.load_dataset("tips") 

sns.stripplot(x="day", y="total_bill", hue="smoker", 
data=tips, jitter=True, 
palette="Set2", split=True,linewidth=1,edgecolor='gray') 

# Get the ax object to use later. 
ax = sns.boxplot(x="day", y="total_bill", hue="smoker", 
data=tips,palette="Set2",fliersize=0) 

# Get the handles and labels. For this example it'll be 2 tuples 
# of length 4 each. 
handles, labels = ax.get_legend_handles_labels() 

# When creating the legend, only use the first two elements 
# to effectively remove the last two. 
l = plt.legend(handles[0:2], labels[0:2], bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

example plot

+0

Awesome! Danke, Mann! –

1

ich hinzufügen möchten, wenn Sie Nebenhandlungen verwenden, könnte die Legende Handhabung etwas problematisch sein. Der obige Code, der übrigens eine sehr schöne Figur darstellt (@Sergey Antopolskiy und @Ffisegydd), wird die Legende nicht in einen Subplot verschieben, der sehr stur erscheint. Siehe Code über Nebenhandlungen angepasst:

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 

tips = sns.load_dataset("tips") 

fig, axes = sns.plt.subplots(2,2) 

sns.stripplot(x="day", y="total_bill", hue="smoker", 
       data=tips, jitter=True, palette="Set2", 
       split=True,linewidth=1,edgecolor='gray', ax = axes[0,0]) 

ax = sns.boxplot(x="day", y="total_bill", hue="smoker", 
       data=tips,palette="Set2",fliersize=0, ax = axes[0,0]) 

handles, labels = ax.get_legend_handles_labels() 

l = plt.legend(handles[0:2], labels[0:2], bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

duplicated legend

Die ursprüngliche Legende bleibt. Um sie zu löschen, können Sie diese Zeile hinzu:

axes[0,0].legend(handles[:0], labels[:0]) 

corrected legend