2016-04-26 63 views
4

我已經使用Seaborn軟件包創建了帶有覆蓋條紋圖的嵌套boxplot。我已經看到有關如何編輯屬性individual boxesall boxes使用由sns.boxplot生成的ax.artists屬性。如何在Seaborn boxplot中編輯晶須,傳單,帽子等的屬性

是否有任何方式使用類似的方法編輯晶須,帽子,飛行物等屬性?目前,我有在_BoxPlotter()類在seaborn的restyle_boxplot方法手動編輯值 - > categorical.py文件從默認的情節得到想要的情節:

默認打印: Default Plot

所希望的描繪: Desired Plot

這裏是我的參考代碼:

sns.set_style('whitegrid') 

fig1, ax1 = plt.subplots() 


ax1 = sns.boxplot(x="Facility", y="% Savings", hue="Analysis", 
      data=totalSavings) 

plt.setp(ax1.artists,fill=False) # <--- Current Artist functionality 

ax1 = sns.stripplot(x="Facility", y="% Savings", hue="Analysis", 
        data=totalSavings, jitter=.05,edgecolor = 'gray', 
        split=True,linewidth = 0, size = 6,alpha = .6) 

ax1.tick_params(axis='both', labelsize=13) 
ax1.set_xticklabels(['Test 1','Test 2','Test 3','Test 4','Test 5'], rotation=90) 
ax1.set_xlabel('') 
ax1.set_ylabel('Percent Savings (%)', fontsize = 14) 


handles, labels = ax1.get_legend_handles_labels() 
legend1 = plt.legend(handles[0:3], ['A','B','C'],bbox_to_anchor=(1.05, 1), 
        loc=2, borderaxespad=0.) 
plt.setp(plt.gca().get_legend().get_texts(), fontsize='12') 
fig1.set_size_inches(10,7) 

回答

4

你需要編輯Line2D對象,它們存儲在ax.lines中。

繼承人創建一個boxplot的腳本(基於示例here),然後編輯線條和藝術家到您的問題中的樣式(即沒有填充,所有線和標記相同的顏色等)

您也可以修復圖例中的矩形修補程序,但您需要使用ax.get_legend().get_patches()

我也繪製了第二個軸上的原始boxplot作爲參考。

import matplotlib.pyplot as plt 
import seaborn as sns 

fig,(ax1,ax2) = plt.subplots(2) 

sns.set_style("whitegrid") 
tips = sns.load_dataset("tips") 

sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set1", ax=ax1) 
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set1", ax=ax2) 

for i,artist in enumerate(ax2.artists): 
    # Set the linecolor on the artist to the facecolor, and set the facecolor to None 
    col = artist.get_facecolor() 
    artist.set_edgecolor(col) 
    artist.set_facecolor('None') 

    # Each box has 6 associated Line2D objects (to make the whiskers, fliers, etc.) 
    # Loop over them here, and use the same colour as above 
    for j in range(i*6,i*6+6): 
     line = ax2.lines[j] 
     line.set_color(col) 
     line.set_mfc(col) 
     line.set_mec(col) 

# Also fix the legend 
for legpatch in ax2.get_legend().get_patches(): 
    col = legpatch.get_facecolor() 
    legpatch.set_edgecolor(col) 
    legpatch.set_facecolor('None') 

plt.show() 

enter image description here

+0

真棒,非常感謝你! – dsholes

+0

您能否提供一個如何更改盒子子集的線條顏色的示例?另外,你說每個補丁有6行,我看到了完整的列表,但現在根本找不到它......我將如何改變晶須和邊緣,讓中間值和傳送者保持原樣? – branwen85

+0

在18個月前的回答中,你可以提出很多問題...你可能最好問一個新問題 – tom