如何用Seaborn创建以french和flemish为X轴、year为hue的直方图?
解决方案
你的需求本质是绘制分组柱状图(而非传统意义上的直方图,直方图用于展示连续数据的分布),原代码无法实现的原因有两个:一是数据为宽格式,Seaborn无法同时将french和flemish作为X轴的分类项;二是histplot默认统计频数,而非直接展示列的数值大小。
步骤1:将宽格式数据转换为长格式
使用pandas的melt函数,把french和flemish合并为一个分类列,同时保留年份和对应数值:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 转换数据格式 df_long = df.melt( id_vars='year', # 保留作为分组依据的列 var_name='region', # 新分类列的名称(对应french/flemish) value_name='value' # 数值列的名称 )
步骤2:绘制分组柱状图
方法1:使用barplot(更适合展示分类数据的数值)
这是最贴合你需求的方式:
sns.barplot( data=df_long, x='region', # X轴为地区分类(french/flemish) y='value', # Y轴为对应数值 hue='year', # 按年份分组 dodge=True # 分组柱状图错开显示 ) plt.title('French vs Flemish Values by Year') plt.show()
方法2:使用histplot(若坚持用该函数)
需要指定stat='identity'来直接展示数值,而非统计频数:
sns.histplot( data=df_long, x='region', y='value', hue='year', multiple='dodge', stat='identity', # 关键参数:直接使用数据中的数值 shrink=.8 ) plt.title('French vs Flemish Values by Year') plt.show()
两种方法都会生成X轴为french和flemish、按年份分组、Y轴显示对应数值的图表。
内容的提问来源于stack exchange,提问作者user20494840
相关产品推荐
相关产品推荐

