2015-07-19 17 views
6

Sto provando a impostare uno spazio tra i boxplot (tra le caselle verde e arancione) creati con Python Seaborn del modulo sns.boxplot(). Si prega di vedere in allegato il grafico, che i sottotrammi verde e arancione sono incollati l'uno all'altro, rendendolo visivamente non il più accattivante.Impostare lo spazio tra i riquadrati di box in Python I grafici hanno generato plot di caselle annidati con Seaborn?

Non riesci a trovare un modo per farlo, chiunque potrebbe trovare un modo (codice allegato)?

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) 

Il Seaborn documentazione boxplot è qui: http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.boxplot.html

risposta

0

Esecuzione del pericolo che questo non è più necessaria, ho trovato una soluzione a questo problema. Quando si disegna boxplots direttamente con matplotlib, la disposizione delle scatole può essere controllata con le parole chiave width e position. Tuttavia, quando si passa la parola chiave positions-sns.factorplot(kind='box',...), si ottiene una

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

Per ovviare a questo, si può impostare la larghezza di 'manualmente' dopo è stata creata la boxplot le scatole. Questo è un po 'noioso, perché le caselle vengono memorizzate come PatchPatches all'interno delle singole istanze di FacedGrid restituite da sns.factorplot. Invece della semplice sintassi (x,y,width,height) che Rects ha, PathPatches utilizza i vertici per definire gli angoli, il che comporta un po 'più di calcolo quando si desidera regolare le caselle. Oltre a tutto il resto, lo PathPatches restituito da matplotlib.boxplot contiene un vertice aggiuntivo (ignorato) per il codice Path.CLOSEPOLY, che è impostato su (0,0) ed è meglio ignorarlo. Oltre alla scatola, la linea orizzontale che segna la mediana è ora troppo larga e deve essere anch'essa regolata.

Qui di seguito ho definire una funzione che consente di regolare la larghezza delle caselle generati dal codice di esempio del PO (notare l'importazione extra):

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

chiamare questa funzione con

adjust_box_widths(g, 0.9) 

ha pronunciato la seguente uscita :

seaborn boxplot with adjusted box width

Problemi correlati