seaborn绘制小提琴图时showfliers=False无效,如何去除异常值?
问题原因
sns.violinplot本身不直接识别showfliers参数,这个参数是sns.boxplot的专属参数。你在violinplot里设置的showfliers=False不会被传递到内部默认绘制的迷你箱线图中,所以异常值还是会显示。
解决方法
这里给两种常用方案,你可以根据需求选择:
方案1:仅隐藏异常值点,不修改原始数据
通过参数设置异常值标记为不可见,仅需修改绘图代码即可:
# 把原来的sns.violinplot行替换成下面的代码 sns.violinplot( data=df, # 控制异常值标记样式,设置为不可见 flierprops={"marker": "", "alpha": 0} )
如果你使用的是v0.12及以上版本的seaborn,更规范的写法是通过box_kws传递箱线图参数:
sns.violinplot( data=df, box_kws={ "flierprops": {"marker": "", "alpha": 0} } )
方案2:预处理过滤原始数据的异常值,从根源移除
如果你希望统计、绘图都完全排除异常值,可以用IQR规则先过滤每列的异常值,再绘图:
def make_violin(in_matrix, save_path): df = pd.read_csv(str(in_matrix), index_col=False) # 先去掉0值 df = df[(df != 0).all(1)] # 按列过滤异常值(IQR规则) def filter_outliers(series): q1 = series.quantile(0.25) q3 = series.quantile(0.75) iqr = q3 - q1 lower = q1 - 1.5 * iqr upper = q3 + 1.5 * iqr # 异常值替换为NaN,绘图时会自动忽略 return series.where((series >= lower) & (series <= upper)) # 只对数值类型的样本列应用过滤 num_cols = df.select_dtypes(include='number').columns df[num_cols] = df[num_cols].apply(filter_outliers) # 后续绘图代码不需要额外调整参数 plt.figure(figsize=(20, 10), dpi=300) sns.violinplot(data=df) plt.title("Read Counts of Individual ENSG") plt.xlabel("Samples") plt.ylabel("Read Count") plt.savefig(os.path.join(str(save_path), 'all_reads_matrix_violin.pdf'))
内容的提问来源于stack exchange,提问作者vegal35866
相关产品推荐
相关产品推荐

