如何用Python绘制同类别双列数据对比直方图?技术求助
按材料状态类别对比析出物数量的直方图绘制方案
你的原始代码仅单独绘制了两列数据的整体直方图,没有按MaterialState类别分组,因此无法展示类别维度的对比。以下是两种可实现需求的方案:
方式一:分面子图展示各材料状态的分布对比
该方案为每个材料状态生成独立子图,在子图中同时展示手动标注和流水线生成的析出物数量分布:
%matplotlib inline import matplotlib.pyplot as plt import pandas as pd # 获取所有唯一的材料状态类别(任选一列即可,两类别的取值一致) material_states = df['MaterialState_manual'].unique() # 根据类别数量设置画布布局 fig, axes = plt.subplots(nrows=len(material_states)//2 + 1, ncols=2, figsize=(12, 8)) axes = axes.flatten() for idx, state in enumerate(material_states): # 筛选对应类别的两类数据 manual_data = df[df['MaterialState_manual'] == state]['Precipitates_manual'] pipeline_data = df[df['MaterialState_pipeline'] == state]['Precipitates_pipeline'] # 在子图中绘制重叠直方图,通过透明度区分两组数据 axes[idx].hist(manual_data, bins=10, alpha=0.5, label='Manual') axes[idx].hist(pipeline_data, bins=10, alpha=0.5, label='Pipeline') axes[idx].set_title(f'Material State: {state}') axes[idx].legend() axes[idx].set_xlabel('Precipitate Count') axes[idx].set_ylabel('Frequency') # 隐藏多余的空白子图(若类别数量为奇数) for idx in range(len(material_states), len(axes)): axes[idx].axis('off') plt.tight_layout() plt.show()
方式二:分组并排柱状直方图
若希望同一类别下的两组数据以并排柱状形式对比分布统计,可采用此方案:
%matplotlib inline import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 需先安装:pip install seaborn # 将数据转换为长格式,便于分组处理 melted_df = pd.melt(df, id_vars=['MaterialState_manual'], value_vars=['Precipitates_manual', 'Precipitates_pipeline'], var_name='Data Source', value_name='Precipitate Count') # 绘制分组直方图 plt.figure(figsize=(14, 8)) sns.histplot(data=melted_df, x='Precipitate Count', hue='Data Source', col='MaterialState_manual', bins=10, alpha=0.7, multiple='dodge') # 设置为并排柱状模式 plt.tight_layout() plt.show()
关键提示
- 核心逻辑是先按
MaterialState类别筛选数据,再分别绘制对应类别的两组析出物数量分布 - 可根据实际数据分布调整
bins参数(直方图区间数量),优化图表清晰度 - 第一种方案适合逐个分析单类别的分布差异,第二种方案更直观对比同一类别下两组数据的分布
内容的提问来源于stack exchange,提问作者Zia
相关产品推荐
相关产品推荐

