You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:54:06