如何在Python中绘制指定格式的柱状图?
处理三层嵌套列表的柱状图绘制问题
问题背景
需要分析三层嵌套格式的数据,绘制柱状图展示y_data中10组数据各自的6个数据点(对应标签a到f)。当前尝试的两层循环绘图未成功,核心困惑在于三层嵌套列表的结构处理。
原始数据
x_labels = ['a', 'b', 'c', 'd', 'e', 'f'] y_data = [ [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ] ]
目标图表样式

尝试的代码(未成功)
import matplotlib.pyplot as plt x_labels = ['a', 'b', 'c', 'd', 'e', 'f'] y_data = [ [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ], [ [10], [20], [30], [40], [50], [60] ] ] x_temp = [] y_temp = [] fig, ax = plt.subplots() for i in range(len(y_data)): for j in range(len(y_data[i])): x_temp.append(x_labels[j]) y_temp.append(y_data[i][j]) ax.bar(x_temp, y_temp) plt.show()
问题分析
- 数据结构问题:
y_data最内层是单元素列表(如[10]),直接append到y_temp会传入列表而非数值,导致绘图报错。 - 绘图逻辑问题:原代码把所有数据按x标签堆叠,没有实现每个标签下放置10组柱子的目标。
解决方案
修正后的代码
import matplotlib.pyplot as plt x_labels = ['a', 'b', 'c', 'd', 'e', 'f'] y_data = [ [ [10], [20], [30], [40], [50], [60] ] for _ in range(10) ] # 扁平化数据:提取最内层的数值,把三层结构转为二维数值列表 flattened_y = [[item[0] for item in group] for group in y_data] fig, ax = plt.subplots(figsize=(10, 6)) # 设置柱子宽度,确保同一标签下的10个柱子能并排显示 bar_width = 0.08 # 基础x轴位置 x = range(len(x_labels)) # 循环绘制每组数据的柱子 for i, group_data in enumerate(flattened_y): # 计算每组柱子的偏移量,避免重叠 offset = i * bar_width ax.bar([pos + offset for pos in x], group_data, width=bar_width, label=f'组{i+1}') # 调整x轴刻度位置,使其对齐每组柱子的中间 ax.set_xticks([pos + bar_width*4.5 for pos in x]) ax.set_xticklabels(x_labels) # 添加图表标签和图例 ax.set_xlabel('类别') ax.set_ylabel('数值') ax.set_title('每组数据的类别分布') # 把图例放在图表外侧,避免遮挡数据 ax.legend(loc='upper left', bbox_to_anchor=(1, 1)) plt.tight_layout() plt.show()
关键说明
- 数据扁平化:通过列表推导式将
[[10], [20]]这类结构直接提取为[10, 20],解决数值类型不匹配的问题。 - 柱子偏移处理:给每组数据的柱子设置不同偏移量,确保同一x标签下的10个柱子并排展示,不会互相重叠。
- x轴刻度调整:将刻度位置设置在每组柱子的中间,保证类别标签与对应柱子组对齐。
内容的提问来源于stack exchange,提问作者David777
相关产品推荐
相关产品推荐

