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

如何在特征重要性柱状图中保持x轴一致的缩放比例?

问题与解决方案:统一特征重要性图的X轴缩放与刻度格式

问题背景

我使用以下函数绘制随机森林模型的特征重要性:

def plot_feature_importance(imp_df):
    imp_df.columns = ['feature', 'feature_importance']
    plt.figure(figsize=(15,16))
    b = sns.barplot(x = 'feature_importance', y ='feature', data = imp_df, orient = 'h', color = 'royalblue') 
    b.set_xlabel("feature importance", fontsize=30)
    b.set_ylabel("feature", fontsize=30)
    b.tick_params(labelsize=26)

    plt.title("Random Forest feature importance", fontsize=35)
    plt.tight_layout()

但调用该函数绘制两组模型数据时,X轴缩放比例不一致,且需要将X轴刻度统一设置为两位小数格式,以便直观对比两张图的特征重要性。

两组测试数据如下:

数据集1

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data1 =\
{'feature': ['sp_max', 'sp_p85', 'sp_mean', 'sp_std', 'sp_p75', 'sp_iqr', 'sp_median', 'sp_mad', 'sp_p25', 'br_p85', 'jk_std', 'ac_std', 'sp_min',
             'jk_min', 'jk_p85', 'ac_mad', 'jk_max', 'jk_p75', 'ac_p85', 'br_p75', 'br_iqr', 'ac_mean', 'br_std', 'ac_max', 'jk_iqr', 'ac_min',
             'br_mean', 'ac_p25', 'ac_iqr', 'jk_mad', 'ac_p75', 'jk_mean', 'br_max', 'jk_p25', 'jk_median', 'br_median', 'ac_median', 'br_mad', 'br_p25', 'br_min'],
 'feature_importance': [0.0713905329, 0.0614052325, 0.0537031799, 0.0522208471, 0.0447700292, 0.0365220941, 0.0338786688, 0.0315128429,
                        0.0313193327, 0.0302328929, 0.0277040796, 0.0250055989, 0.0246700799, 0.0241926779, 0.0231924589, 0.0230042172,
                        0.0217812924, 0.0211596946, 0.0209208033, 0.020761991, 0.0199109668, 0.0195804683, 0.0194071674, 0.0192247004,
                        0.0191562826, 0.0190183126, 0.0187932756, 0.0187916575, 0.0186561271, 0.0185529459, 0.0182522133, 0.0178571215,
                        0.0172595608, 0.0161357392, 0.0135001044, 0.0129659029, 0.0121831595, 0.0114491594, 0.00994391099, 1.2677449e-05]}

feature_importance1 = pd.DataFrame(data1)

数据集2

data2 =\
{'feature': ['trip-distance', 'sp_max', 'sp_p85', 'sp_std', 'sp_mean', 'sp_p75', 'sp_iqr', 'sp_median', 'br_p85', 'sp_mad', 'sp_p25',
             'jk_std', 'jk_p85', 'sp_min', 'ac_std', 'jk_min', 'ac_mad', 'jk_p75', 'br_p75', 'ac_p85', 'br_iqr', 'jk_mad', 'jk_max',
             'jk_iqr', 'ac_p25', 'ac_p75', 'ac_iqr', 'ac_mean', 'ac_min', 'br_std', 'ac_max', 'br_mean', 'jk_p25', 'jk_mean', 'br_max',
             'jk_median', 'br_median', 'ac_median', 'br_mad', 'br_p25', 'br_min'],
 'feature_importance': [0.179681943, 0.0626488215, 0.0548207093, 0.0465467404, 0.0462552278, 0.0393529557, 0.0310985549, 0.0298559465,
                        0.0257461545, 0.0254299245, 0.0247697614, 0.0215061763, 0.019717727, 0.0193190652, 0.0192614463, 0.0191363098,
                        0.0187974266, 0.0179852664, 0.0178322731, 0.0172595835, 0.0169402994, 0.0160361741, 0.016030292, 0.0159925654,
                        0.014725113, 0.0146868079, 0.0143054259, 0.0142270777, 0.0139906464, 0.0138775454, 0.0138539903, 0.0134992019,
                        0.0131361466, 0.0129263598, 0.0122852486, 0.0104203687, 0.0101486977, 0.00985276389, 0.00931697107, 0.00671582934,
                        1.04610595e-05]}

feature_importance2 = pd.DataFrame(data2)

修改后的函数

要实现X轴缩放一致且刻度为两位小数,需要在函数中添加两个关键步骤:

  1. 接收统一的X轴上限参数,确保所有图的X轴范围一致;
  2. 使用matplotlib.ticker.FormatStrFormatter设置刻度格式。

修改后的函数如下:

from matplotlib.ticker import FormatStrFormatter

def plot_feature_importance(imp_df, x_max=None):
    imp_df.columns = ['feature', 'feature_importance']
    plt.figure(figsize=(15,16))
    b = sns.barplot(x = 'feature_importance', y ='feature', data = imp_df, orient = 'h', color = 'royalblue') 
    b.set_xlabel("feature importance", fontsize=30)
    b.set_ylabel("feature", fontsize=30)
    b.tick_params(labelsize=26)

    # 设置X轴刻度为两位小数
    b.xaxis.set_major_formatter(FormatStrFormatter('%.2f'))
    
    # 设置统一的X轴范围
    if x_max is not None:
        plt.xlim(0, x_max)
    else:
        # 如果未指定x_max,使用当前数据集的最大值向上取整到两位小数
        max_imp = imp_df['feature_importance'].max()
        plt.xlim(0, round(max_imp + 0.01, 2))

    plt.title("Random Forest feature importance", fontsize=35)
    plt.tight_layout()

使用方式

先计算所有数据集的特征重要性最大值,传递给函数作为统一的X轴上限:

# 计算两个数据集的最大特征重要性
max_imp = max(feature_importance1['feature_importance'].max(), feature_importance2['feature_importance'].max())
# 向上取整到两位小数,让X轴有一点余量
unified_x_max = round(max_imp + 0.01, 2)

# 绘制第一张图
plot_feature_importance(feature_importance1, unified_x_max)

# 绘制第二张图
plot_feature_importance(feature_importance2, unified_x_max)

这样两张图的X轴范围会完全一致,刻度也会显示为两位小数,方便直观对比不同模型的特征重要性。

内容的提问来源于stack exchange,提问作者Amina Umar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:40:22