Matplotlib如何绘制不同颜色、不同透明度的并列直方图?
多数据集并列直方图绘制(带独立颜色与透明度)
需求:将多个数据集绘制成并列直方图,每个数据集需拥有独立的颜色和透明度(alpha)值。
遇到的问题
第一次尝试代码
colors = ['red', 'green', 'blue'] alphas = [1.0, 0.7, 0.3] plt.hist([data1, data2, data3], bins = 15, label=['Data 1', 'Data 2', 'Data 3'], color = colors, alpha = alphas)
直接传入alpha列表时触发报错:
alpha must be numeric or None, not <class 'list'>
第二次尝试(循环绘制)
改用循环逐个绘制后,得到的是重叠的直方图,而非需求中的并列样式:
datas = [data1, data2, data3] colors = ['red', 'green', 'blue'] alphas = [1.0, 0.7, 0.3] labels = ['Data 1', 'Data 2', 'Data 3'] plt.savefig('images/bla.png') for data, label, color, alpha in zip(datas, labels, colors, alphas): plt.hist(data, bins=10, label=label, color=color, alpha=alpha)
解决方案
要实现并列直方图且保留每个数据集的独立颜色与透明度,需要:
- 统一所有数据集的bins范围,确保柱子对齐
- 在循环绘制时,通过调整柱子位置和宽度,实现并列效果
正确代码示例
import matplotlib.pyplot as plt import numpy as np # 模拟测试数据(可替换为实际数据集) data1 = np.random.normal(0, 1, 1000) data2 = np.random.normal(2, 1, 1000) data3 = np.random.normal(4, 1, 1000) datas = [data1, data2, data3] colors = ['red', 'green', 'blue'] alphas = [1.0, 0.7, 0.3] labels = ['Data 1', 'Data 2', 'Data 3'] # 计算所有数据的统一区间,生成对齐的bins all_data = np.concatenate(datas) bins = np.histogram_bin_edges(all_data, bins=15) bin_width = bins[1] - bins[0] # 设置单根柱子的宽度,留出并列间隙 rwidth = 0.25 # 循环绘制每个数据集的并列柱子 for i, (data, label, color, alpha) in enumerate(zip(datas, labels, colors, alphas)): # 调整每个数据集的柱子起始位置,实现并列排列 plt.hist(data, bins=bins, label=label, color=color, alpha=alpha, histtype='bar', rwidth=rwidth, align='edge', left=bins[:-1] + i * rwidth * bin_width) plt.legend() plt.title('并列直方图(独立颜色与透明度)') plt.savefig('images/bla.png') plt.show()
关键说明
- 统一bins:确保所有数据集的柱子基于相同的区间范围,避免错位
left参数:通过偏移每个数据集的柱子起始位置,实现并列布局rwidth:控制单根柱子的宽度,防止并列时出现重叠- 循环内单独指定
alpha和color,满足每个数据集的独立样式需求
内容的提问来源于stack exchange,提问作者Selphiron
相关产品推荐
相关产品推荐

