You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于嵌套列表绘制多个独立直方图的问题求助

解决独立分组条形图绘制问题

我来帮你搞定这个问题!你当前的代码存在两个核心问题:一是误用了plt.hist()(这个函数是用来绘制统计直方图的,而你需要的是对应标签的条形图);二是没有为每组数据创建独立的绘图区域,导致所有条形都叠加在了同一个画布上,无法看到独立的分组效果。

下面提供两种可行的解决方案,你可以根据需求选择:

方案一:为每组数据生成独立窗口画布

这种方式会为每组数据单独弹出一个绘图窗口,适合需要单独查看每组细节的场景:

import numpy as np
import matplotlib.pyplot as plt

# 你的原始数据
param_main_list = [['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5']]
main_list = [[1107, 64, 129, 64, 67], 
             [1223, 34, 129, 62, 244, 56, 136, 48, 128, 43, 180], 
             [1345, 47, 96, 63, 241, 79, 97, 82, 108, 62, 134], 
             [648, 35, 111, 78, 131, 56, 86, 28, 47, 64, 151]]

# 遍历每组数据,创建独立画布
for idx in range(len(main_list)):
    # 创建新的绘图画布,设置尺寸
    plt.figure(figsize=(10, 6))
    # 获取当前组的标签和数值
    current_labels = param_main_list[idx]
    current_values = main_list[idx]
    # 绘制条形图(替换错误的plt.hist())
    plt.bar(current_labels, current_values, color='skyblue')
    # 旋转x轴标签,避免文字重叠
    plt.xticks(rotation=45, ha='right')
    # 添加标题和轴标签,提升可读性
    plt.title(f'Group {idx+1} Parameter Values')
    plt.xlabel('Parameter Names')
    plt.ylabel('Value')
    # 自动调整布局,防止标签被截断
    plt.tight_layout()
    # 显示当前组的图表
    plt.show()

方案二:将所有分组图放在同一画布的子图中

如果需要同时对比所有分组的数据,可以用子图布局把所有图表整合在同一个页面:

import numpy as np
import matplotlib.pyplot as plt

# 你的原始数据
param_main_list = [['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5'], 
                   ['Para_length', 'Question1', 'Answer1', 'Question2', 'Answer2', 'Question3', 'Answer3', 'Question4', 'Answer4', 'Question5', 'Answer5']]
main_list = [[1107, 64, 129, 64, 67], 
             [1223, 34, 129, 62, 244, 56, 136, 48, 128, 43, 180], 
             [1345, 47, 96, 63, 241, 79, 97, 82, 108, 62, 134], 
             [648, 35, 111, 78, 131, 56, 86, 28, 47, 64, 151]]

# 创建2行2列的子图网格,设置整体画布尺寸
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(16, 12))
# 将二维子图数组展平为一维,方便遍历
axes = axes.flatten()

# 遍历每个子图,绘制对应分组的数据
for idx, ax in enumerate(axes):
    current_labels = param_main_list[idx]
    current_values = main_list[idx]
    # 在当前子图上绘制条形图
    ax.bar(current_labels, current_values, color='lightgreen')
    # 设置子图标题和轴标签
    ax.set_title(f'Group {idx+1}', fontsize=12)
    ax.set_xlabel('Parameters', fontsize=10)
    ax.set_ylabel('Values', fontsize=10)
    # 旋转x轴标签并缩小字号,避免拥挤
    ax.tick_params(axis='x', rotation=45, labelsize=8)

# 自动调整子图间距,优化显示效果
plt.tight_layout()
plt.show()

关键知识点总结

  • 区分条形图和直方图:plt.bar()用于展示分类标签对应的值,是你需要的类型;plt.hist()用于展示数据的统计分布,不适合你的场景。
  • 独立绘图区域:必须为每组数据创建新的plt.figure()或者分配子图,否则后续绘制的内容会覆盖之前的图表。
  • 可读性优化:添加标题、轴标签,旋转过长的x轴标签,能让图表更易理解。

内容的提问来源于stack exchange,提问作者andro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:12:09