Seaborn如何循环绘制分类列不同取值对应的直方图子图
原代码问题点
- 直接遍历DataFrame对象时,默认迭代的是列名,不会按
Operator字段自动拆分分组,循环拿到的内容和预期的分组数据完全不符 plt.subplot()的第三个参数要求是从1开始的整数位置索引,原代码用字符串切片做数值计算逻辑完全错误,会直接触发类型报错- 单个子图仅需展示对应Operator的delay分布,不需要设置
hue='Operator'参数,否则会重复绘制全量数据的分组结果
可直接运行的正确实现
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 构造测试数据集 data = { 'Operator':['AB','BC','DE','FG','AB','AB','DE','BC','BC','BC','BC'], 'delay': [22000,25000,27000,35000, 4567, 1893,15373,987,354,1,15] } data = pd.DataFrame(data) # 固定子图展示顺序,和要求的AB、BC、DE、FG对应 operator_list = ['AB', 'BC', 'DE', 'FG'] plt.figure(figsize=(15,10)) for idx, op_name in enumerate(operator_list): # 筛选当前运营商对应的子集数据 current_data = data[data['Operator'] == op_name] # 创建2行2列布局的子图,位置索引从1开始 plt.subplot(2, 2, idx + 1) # 绘制当前分组的delay分布直方图 sns.histplot(data=current_data, x='delay') # 设置子图标题 plt.title(f'Operator {op_name} 延迟分布') # 自动调整子图间距,避免标签重叠 plt.tight_layout() plt.show()
补充说明
- 如果需要在直方图上叠加核密度估计曲线,可以给
sns.histplot()加上kde=True参数 - 如果需要调整分箱数量,可以加
bins=参数值自定义 - 可以根据需要给每个子图单独设置x轴、y轴标签,调整字体大小等样式
内容的提问来源于stack exchange,提问作者limona
相关产品推荐
相关产品推荐

