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
相关产品推荐
相关产品推荐

