2016-05-13 102 views
2

我想改变Seaborn boxplot中的框的外观。我希望所有的框都是透明的,并且要从列表中指定框边框。这里是我一起工作的代码:Seaborn boxplot box从Python列表中分配自定义边缘颜色

import numpy as np 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 
fig, ax = plt.subplots() 

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD')) 
df['E'] = [1,2,3,1,1,4,3,2,3,1] 

sns.boxplot(x=df['E'],y=df['C']) 

# Plotting the legend outside the plot (above) 
box = ax.get_position() 
ax.set_position([box.x0, box.y0 + box.height * 0.1, box.width, box.height * 0.9]) 
handles, labels = ax.get_legend_handles_labels() 
leg = plt.legend(handles[0:2], labels[0:2], 
           loc='upper center', bbox_to_anchor=(0.5, 1.10), ncol=2) 
plt.show() 

post显示了如何改变一个单框的颜色和箱体edgecolor。但是,我想根据这样的列表分配框边框颜色,如box_line_col = ['r','g',b','purple']。上面的代码会在图中生成4个框 - 我想从第一个(最左边的)框开始并继续到最后一个(最右边的)框,分配自定义框边缘颜色。

是否可以从列表中指定盒子边缘颜色,同时保持盒子本身透明(facecolor = white)?

+1

[This](http://stackoverflow.com/questions/36874697/how-to-edit-properties-of-whiskers-fliers-caps-etc-in-seaborn-boxplot/36893152#36893152)回答我的问题类似的问题可以帮助你。 – dsholes

回答

2

通过框和循环设置颜色应该工作。在你的代码的结束,之前plt.show()地址:

box_line_col = ['r','g','b','purple'] 

for i,box_col in enumerate(box_line_col): 
    mybox = g.artists[i] 
    mybox.set_edgecolor(box_col) 
    mybox.set_fccecolor(None) #or white, if that's what you want 

    # If you want the whiskers etc to match, 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 = g.lines[j] 
     line.set_color(box_col) 
     line.set_mfc(box_col) 
     line.set_mec(box_col) 

plt.show() 

,第一部分是基于晶须着色方向从this post来到你引用的帖子和和。