2015-07-19 7 views
6

Próbuję ustawić spację między działkami (między zielonymi i pomarańczowymi skrzynkami) utworzonymi za pomocą modułumodułu Python sns.boxplot(). Proszę zobaczyć na załączonym wykresie, że zielone i pomarańczowe pola subplotowe są ze sobą powiązane, co sprawia, że ​​wizualnie nie jest to najbardziej atrakcyjne.Ustaw spację między działkami w Pythonie Wykresy wygenerowały zagnieżdżone pola z Seabornem?

Nie możesz znaleźć sposobu, aby to zrobić, każdy może znaleźć sposób (kod dołączony)?

Seaborn Boxplots

import numpy as np 
import pandas as pd 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import seaborn as sns 
tips = sns.load_dataset("tips") 
sns.set(style="ticks", palette='Set2', font='Roboto Condensed') 
sns.set_context("paper", font_scale=1.1, rc={"lines.linewidth": 1.1}) 
g=sns.factorplot(x="time", y="total_bill", hue="smoker", 
       col="day", data=tips, kind="box", size=4, aspect=0.5, 
       width=0.8,fliersize=2.5,linewidth=1.1, notch=False,orient="v") 
sns.despine(trim=True) 
g.savefig('test6.png', format='png', dpi=600) 

Seaborn dokumentacja boxplot jest tutaj: http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.boxplot.html

Odpowiedz

0

Running niebezpieczeństwo, że nie jest już potrzebne, znalazłem rozwiązanie tego problemu. Podczas rysowania boxplots bezpośrednio za pomocą matplotlib, rozmieszczenie skrzynek można kontrolować za pomocą słów kluczowych width i . Jednak podczas przechodzenia słowa kluczowego positions do sns.factorplot(kind='box',...), dostaje

TypeError: boxplot() got multiple values for keyword argument 'positions' 

Aby obejść ten problem, można ustawić szerokości „ręcznie” po Wykres pudełkowy został stworzony pudełka. Jest to nieco żmudne, ponieważ skrzynki są przechowywane jako PatchPatches w poszczególnych instancjach Axes instancji FacedGrid, która jest zwracana przez sns.factorplot. Zamiast prostej składni , które mają Rects, używają wierzchołków do definiowania narożników, co wymaga nieco więcej obliczeń, gdy chce się dostosować ramki. Poza wszystkim innym, PathPatches zwrócony przez matplotlib.boxplot zawiera dodatkowy (ignorowany) wierzchołek dla kodu Path.CLOSEPOLY, który jest ustawiony na (0,0) i jest najlepiej ignorowany. Oprócz ramki pozioma linia oznaczająca medianę jest teraz zbyt szeroka i wymaga również dostosowania.

Poniżej zdefiniować funkcję, która dostosowuje szerokości pól generowanych przez przykładowy kod PO za (uwaga dodatkowy import):

from matplotlib.patches import PathPatch 
def adjust_box_widths(g, fac): 
    """ 
    Adjust the withs of a seaborn-generated boxplot. 
    """ 

    ##iterating through Axes instances 
    for ax in g.axes.flatten(): 

     ##iterating through axes artists: 
     for c in ax.get_children(): 

      ##searching for PathPatches 
      if isinstance(c, PathPatch): 
       ##getting current width of box: 
       p = c.get_path() 
       verts = p.vertices 
       verts_sub = verts[:-1] 
       xmin = np.min(verts_sub[:,0]) 
       xmax = np.max(verts_sub[:,0]) 
       xmid = 0.5*(xmin+xmax) 
       xhalf = 0.5*(xmax - xmin) 

       ##setting new width of box 
       xmin_new = xmid-fac*xhalf 
       xmax_new = xmid+fac*xhalf 
       verts_sub[verts_sub[:,0] == xmin,0] = xmin_new 
       verts_sub[verts_sub[:,0] == xmax,0] = xmax_new 

       ##setting new width of median line 
       for l in ax.lines: 
        if np.all(l.get_xdata() == [xmin,xmax]): 
         l.set_xdata([xmin_new,xmax_new]) 

wywołanie tej funkcji z

adjust_box_widths(g, 0.9) 

daje następujący wynik :

seaborn boxplot with adjusted box width

Powiązane problemy