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

如何用Matplotlib将不同flag分组的直方图并列展示

实现按Flag分组的列数据直方图并列展示

当然可以实现每列对应不同Flag值的直方图并列展示,以下是两种常用的实现方式:

方法一:使用Matplotlib手动布局子图

通过Matplotlib的子图网格,为每个特征列和Flag值组合分配独立子图,直接对比分布:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成示例数据
np.random.seed(0)
df = pd.DataFrame({'col1' : np.random.uniform(size = 100),
                  'col2' : np.random.uniform(size = 100),
                  'col3' : np.random.uniform(size = 100),
                  'flag' : np.random.choice([0,1], 100)})

# 创建3行2列的子图布局,适配3个特征列+2种Flag值
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 10))
feature_cols = ['col1', 'col2', 'col3']
flag_values = [0, 1]

# 遍历特征列和Flag值绘制直方图
for row_idx, col in enumerate(feature_cols):
    for col_idx, flag in enumerate(flag_values):
        ax = axes[row_idx, col_idx]
        # 筛选对应Flag的数据
        filtered_data = df[df['flag'] == flag][col]
        ax.hist(filtered_data, bins=15, alpha=0.7)
        ax.set_title(f'{col} - flag={flag}')
        ax.set_xlabel('数值')
        ax.set_ylabel('频数')

# 自动调整子图间距,避免标签重叠
plt.tight_layout()
plt.show()

这个方案会生成3行2列的图表,每行对应一个特征列,左右两个子图分别展示该列下flag=0和flag=1的数据分布,直观对比差异。

方法二:使用Seaborn快速实现(推荐)

Seaborn的FacetGrid或catplot可以更简洁地实现分组可视化,无需手动管理子图:

import seaborn as sns

# 将宽表转换为长表格式,适配Seaborn的分组逻辑
df_long = df.melt(id_vars='flag', value_vars=['col1', 'col2', 'col3'], 
                  var_name='特征列', value_name='数值')

# 使用FacetGrid绘制分组直方图
g = sns.FacetGrid(df_long, row='特征列', col='flag', margin_titles=True)
g.map(sns.histplot, '数值', bins=15, alpha=0.7)
g.set_axis_labels('数值', '频数')
plt.tight_layout()
plt.show()

或者用更简洁的catplot:

sns.catplot(data=df_long, x='数值', col='flag', row='特征列', 
            kind='hist', bins=15, alpha=0.7)
plt.tight_layout()
plt.show()

Seaborn会自动处理子图布局、标题和标签,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Karthik S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:53:18