使用.hist方法绘制直方图出现重叠,80+列数据如何清晰展示?
多列DataFrame直方图无重叠绘制方案
80列以上的数据表可通过pandas自带.hist()方法实现整洁展示,也可选择更灵活的第三方可视化库方案,具体实现如下:
1. 基于pandas .hist()方法的实现
默认调用.hist()未指定布局参数时会自动压缩子图导致重叠,额外指定layout参数自定义子图行列布局,配合plt.tight_layout()自动调整间距即可解决问题:
import math import matplotlib.pyplot as plt # 自定义每行展示的直方图数量,可根据阅读需求调整 per_row = 4 total_features = len(df.columns) rows = math.ceil(total_features / per_row) # 调用hist方法传入布局参数,画布尺寸按子图数量自适应 df.hist( figsize=(per_row * 4, rows * 3), layout=(rows, per_row), xlabelsize=6, ylabelsize=6 ) # 必须调用该方法自动调整子图间距,避免标签、标题重叠 plt.tight_layout() plt.show()
如果觉得单张画布过长,可按批次拆分特征绘制,例如每20个特征输出一张直方图。
2. 更适合多特征场景的替代方案
如果需要更美观的样式或交互能力,可选择以下两种常用方案:
2.1 seaborn分面绘制
将宽表转为长表后用FacetGrid分面绘制,样式自定义能力更强:
import seaborn as sns # 宽表转长表 df_long = df.melt(var_name="特征名称", value_name="特征取值") # 分面绘制直方图 g = sns.FacetGrid( df_long, col="特征名称", col_wrap=4, sharex=False, sharey=False, height=2.5 ) g.map(sns.histplot, "特征取值", bins=15) g.set_titles(col_template="{col_name}") g.tight_layout() plt.show()
2.2 交互式直方图(plotly)
生成可交互的文件,支持单独放大查看某一特征的分布,适合数据探索场景:
import plotly.express as px import math df_long = df.melt(var_name="特征名称", value_name="特征取值") fig = px.histogram( df_long, x="特征取值", facet_col="特征名称", facet_col_wrap=4, width=1200, height=300 * math.ceil(len(df.columns)/4) ) fig.update_layout(margin=dict(l=10, r=10, t=30, b=10)) fig.show()
内容的提问来源于stack exchange,提问作者Kristin
相关产品推荐
相关产品推荐

