2015-10-20 11 views
10

Kiedyś tworzyłem wszystkie moje wątki, używając matplotlib, aż do niedawna odkryłem seaborn. Szczególnie interesujące mnie było to, że pozwala dzielić skrzypce w celu porównania danej zmiennej hue.skrzypiec seaborn: zmiana koloru skrzypiec, nazwy osi, legenda

Cóż, moim głównym problemem jest to, że nie wiem, co mam zmodyfikować w celu zmiany skrzypcowe kolory, osie imiona lub miejsce legendy gdzie chcę.

Oto przykład Śledziłem z seaborn:

import seaborn as sns 
    tips = sns.load_dataset("tips") 
    sns.set(style="ticks", palette="colorblind") 
    g = sns.FacetGrid(tips, col="time", size=4, aspect=.75) 
    g = g.map(sns.violinplot, "sex", "total_bill", "smoker", inner=None, linewidth=1, scale="area", split=True, width=0.75).despine(left=True).add_legend(title="smoker") 
    g.savefig(os.path.join(options.output_dir, "figures", "violinplots.png")) 

A oto figura wyjście violinplots.png:

enter image description here

Chociaż wolałbym jak coś takiego:

enter image description here

Podsumowując:

  • użycie white i blue kolory
  • zastąpić osie names
  • zapisu leftmost y axis tylko
  • zrobić własny legend with the blue category only

Z góry dziękuję. Każda pomoc będzie mile widziane.


na wypadek gdyby ktoś był zainteresowany, tutaj jest jak w końcu rozwiązany figurę dzięki MrPedru22:

import seaborn as sns 
tips = sns.load_dataset("tips") 
sns.set(context="paper", palette="colorblind", style="ticks") 
g = sns.FacetGrid(tips, col="time", sharey=False, size=4, aspect=.5) 
g = g.map(seaborn.violinplot, "sex", "total_bill", "smoker", cut=0, inner=None, split=True, palette={"No": "#4477AA", "Yes": "white"}, saturation=1).despine(left=True) 
# Set axis labels & ticks # 
g.fig.get_axes()[0].set_xlabel("Lunch") 
g.fig.get_axes()[1].set_xlabel("Dinner") 
g.fig.get_axes()[0].set_xticklabels(["Male", "Female"]) 
g.fig.get_axes()[1].set_xticklabels(["Male", "Female"]) 
g.fig.get_axes()[0].set_ylabel("Total bill") 
g.fig.get_axes()[0].set_yticks(range(0, 80, 10)) 
g.fig.get_axes()[1].set_yticks([]) 
g.fig.get_axes()[0].spines["left"].set_visible(True) 
# Set legend # 
handles, labels = g.fig.get_axes()[0].get_legend_handles_labels() 
g.fig.get_axes()[0].legend([handles[1]], ["Non-smoker"], loc='upper left') 
# Fixing titles # 
g.fig.get_axes()[0].set_title("") 
g.fig.get_axes()[1].set_title("") 
g.plt.show() 

enter image description here

+1

Czy przeczytałeś dokument? A potem spróbować czegoś? – jrjc

+1

Tak, oczywiście, byłem na nim przez cały weekend, dlatego pytam. Dla kolorów skrzypiec: Zmieniłem zarówno kolor w sns.violinplot, jak i paletę w sns.set() przez własną paletę kolorów. Kiedy tworzę paletę kolorów dwóch kolorów, po prostu ignoruje drugi kolor. Używa pierwszego koloru i jaśniejszej wersji tego koloru. To samo, jeśli zdefiniuję kolor. Dla legendy, teoretycznie powinna umieścić legendę na zewnątrz, ale ignoruje ją. Nazwy i oś mogę zastąpić ilustratorem, więc to nie jest taka wielka sprawa. Ale jestem naprawdę sfrustrowany kolorami. – ofornes

+0

Na przykład to ty usuwasz oś za pomocą 'despine (left = True)'. Domyślam się, że nie przeczytałeś wystarczająco dokumentu. Jeśli tylko kolor ma znaczenie, spróbuj ograniczyć pytanie tylko do części kolorystycznej i pokaż nam, co próbujesz, wtedy ktoś może odpowiedzieć. – jrjc

Odpowiedz

5

Oto kilka odpowiedzi:

import seaborn as sns 
tips = sns.load_dataset("tips") 
sns.set(style="ticks", palette="colorblind") 
g = sns.FacetGrid(tips, col="time", size=4, aspect=.75) 
g = g.map(sns.violinplot, "sex", "total_bill", "smoker", palette={"No": "b", "Yes": "w"}, inner=None, linewidth=1, scale="area", split=True, width=0.75).despine(left=True) 
g.fig.get_axes()[0].legend(title= 'smoker',loc='upper left') 
g.set_axis_labels('lunch','total bill') 
sns.plt.show() 
+0

Jeśli dobrze rozumiem, oba wykresy skrzypiec są pod 'g.fig'. Tak więc, na przykład, jeśli chcę uzyskać dostęp do dowolnego elementu na lewym skrajnym wykresie skrzypiec, który byłby przez zero ('g.fig.get_axes() [0]'), w przeciwnym razie przez 1 siekierę ('g.fig. get_axes() [1] '), prawda? – ofornes

+0

Tak, to prawda. Tak więc, chcąc zastąpić seks w porze lunchu i kolacji, można to zrobić za pomocą 'g.fig.get_axes() [0] .set_xlabel (" lunch ")' i 'g.fig.get_axes() [1]. set_xlabel ("dinner") ' – MrPedru22

+0

Czy masz pojęcie, jak połączyć oba x kolce, jakby były jedną osią? – ofornes