如何用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
相关产品推荐
相关产品推荐

