多类别化学元素分析数据的箱线图与小提琴图绘制求助
不同类别元素分布对比图绘制方案
数据预处理
你当前的宽格式数据表(首列为类别,其余列对应各元素分析数据)需要先转换为长格式,适配seaborn绘图要求:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 替换category为你实际的类别列名 df_long = df.melt( id_vars='category', var_name='element', value_name='content' )
绘制箱线图
单画布多元素并列展示
plt.figure(figsize=(18, 7)) sns.boxplot( data=df_long, x='element', y='content', hue='category' ) plt.xticks(rotation=45, ha='right') plt.xlabel('元素') plt.ylabel('分析含量') plt.legend(title='类别', bbox_to_anchor=(1.01, 1), loc='upper left') plt.tight_layout() plt.show()
按元素分面展示
如果元素数量多,单画布太拥挤可以用分面布局:
g = sns.FacetGrid( df_long, col='element', col_wrap=4, # 每行4个子图,可自行调整 sharey=False, # 每个子图y轴独立适配范围 height=3 ) g.map( sns.boxplot, 'category', 'content', order=df['category'].unique() ) g.set_titles('{col_name}') g.set_axis_labels('类别', '含量') plt.tight_layout() plt.show()
绘制小提琴图
和箱线图逻辑一致,替换绘图函数即可:
# 单画布版本 plt.figure(figsize=(18, 7)) sns.violinplot( data=df_long, x='element', y='content', hue='category', cut=0, # 截断小提琴边界到数据实际范围 inner='box' # 内部嵌套箱线图,同时展示两个图的特征 ) plt.xticks(rotation=45, ha='right') plt.xlabel('元素') plt.ylabel('分析含量') plt.legend(title='类别', bbox_to_anchor=(1.01, 1), loc='upper left') plt.tight_layout() plt.show()
注意事项
- 如果你的原始数据列名和示例不同,替换代码中对应的列名字符串即可
- 可以通过
palette参数自定义配色,通过figsize、height调整画布和子图尺寸 - 元素数量过多时优先选择分面布局,避免单图信息太密集看不清细节
内容的提问来源于stack exchange,提问作者EVS_93
相关产品推荐
相关产品推荐

