2015-07-19 12 views
6

Python Seaborn modülünün sns.boxplot() ile oluşturulan kutular arasında (yeşil ve turuncu kutular arasında) bir boşluk ayarlamaya çalışıyorum. Grafiğin ekinde, yeşil ve turuncu alt-çizim kutularının birbirine yapıştığını ve görsel olarak en cazip olmadığını görüyoruz.Python'daki kutu noktalar arasındaki boşluğu oluşturunuz.

Bunu yapmanın bir yolu bulamıyor, herkes bir yol bulabilir (kod eklenmiş)?

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 boxplot belgeleri

Seaborn Boxplots

buradadır: http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.boxplot.html

cevap

0

bu artık gerekli olmadığını tehlikeyi Koşu, bu soruna bir çözüm bulduk. boxplots doğrudan matplotlib ile çizim yaparken, kutuların düzenlenmesi width ve position anahtar sözcükleriyle kontrol edilebilir. sns.factorplot(kind='box',...) için positions anahtar kelime geçirerek, ancak, tek

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

Bundan kaçınmak için bir tek kutu 'elle' sonra boxplot oluşturuldu genişlikleri ayarlayabilirsiniz alır. Bu biraz sıkıcıdır, çünkü kutular FacedGridsns.factorplot tarafından döndürülen tekil Axes örneklerinde PatchPatches olarak depolanır. Rects numaralı (x,y,width,height) sözdiziminin yerine, PathPatches, köşeleri tanımlamak için köşeleri kullanır; bu, kutuları ayarlamak istediğinde biraz daha fazla hesaplama gerektirir. Diğer her şeyden önce, matplotlib.boxplot tarafından döndürülen PathPatches,kodu için kodu için ek (yoksayılmış) bir köşe içerir ve en iyi göz ardı edilir. Kutuya ek olarak, medyanı işaret eden yatay çizgi artık çok geniş ve ayarlanması da gerekiyor.

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

adjust_box_widths(g, 0.9) 

ile bu işlevini çağırarak şu çıktıyı verir:

Ben OP'ın örnek kod tarafından üretilen çerçevelerin genişlikleri ayarlayan bir işlev tanımlamak Aşağıda (ekstra ithalat dikkat edin) :

( )
İlgili konular