pandas 如何在 Seaborn boxplot 中编辑胡须、传单、帽子等的属性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36874697/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to edit properties of whiskers, fliers, caps, etc. in Seaborn boxplot
提问by dsholes
I have created a nested boxplot with an overlayed stripplot using the Seaborn package. I have seen answers on stackoverflow regarding how to edit boxproperties both for individual boxesand for all boxesusing ax.artists generated by sns.boxplot.
我使用 Seaborn 包创建了一个带有重叠带状图的嵌套箱线图。我已经在 stackoverflow 上看到了有关如何使用 sns.boxplot 生成的 ax.artists为单个框和所有框编辑框属性的答案。
Is there any way to edit whisker, cap, flier, etc. properties using a similar method? Currently I have to manually edit values in the restyle_boxplot
method of the _BoxPlotter()
class in the seaborn -> categorical.py file to get from the default plot to the desired plot:
有没有办法使用类似的方法编辑胡须、帽、传单等属性?目前,我必须手动编辑seaborn -> categorical.py 文件中类的restyle_boxplot
方法中的值,_BoxPlotter()
以从默认图获取所需的图:
Here is my code for reference:
这是我的代码供参考:
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)
回答by tmdavison
You need to edit the Line2D
objects, which are stored in ax.lines
.
您需要编辑Line2D
存储在ax.lines
.
Heres a script to create a boxplot (based on the example here), and then edit the lines and artists to the style in your question (i.e. no fill, all the lines and markers the same colours, etc.)
这是创建箱线图的脚本(基于此处的示例),然后将线条和艺术家编辑为您问题中的样式(即没有填充,所有线条和标记的颜色相同等)
You can also fix the rectangle patches in the legend, but you need to use ax.get_legend().get_patches()
for that.
您还可以修复图例中的矩形补丁,但您需要使用ax.get_legend().get_patches()
它。
I've also plotted the original boxplot on a second Axes, as a reference.
我还在第二个轴上绘制了原始箱线图,作为参考。
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()