在用 matplotlib.pyplot.hist 画分布图时,若总分布由几个分量组成(如高斯混合),想用不同颜色标识出来,方便看到各分量占比,参考 [1]。
效果:
- 分布由两个分量(x、y)组成;
- 左上:总分布;
- 右上:总分布,y 轴用 log scale;
- 左下:并列展示两个分量分布;
- 右下:总分布,但堆叠展示两个分量分布,用不同颜色标识。
Code
- 给 hist 传多个数组(tuple/list),label、color 也是相应的顺序;
- 设
stacked=True
是堆叠,False 是并列。
import numpy as np
import matplotlib.pyplot as plt
# 示例分布,分 x、y 两分量,且数量不同(10000 和 20000)
x = np.random.randn(10000) # 正太分布
y = np.random.uniform(low=x.min(), high=x.max(), size=[20000]) # 均匀分布
z = np.concatenate((x, y)) # 总分布
cmap = plt.get_cmap('viridis')
fig, ax = plt.subplots(2, 2, figsize=(15, 15))
# 左上。似乎排在前面的数组会画先,从而出现在底部
ax[0][0].hist(z, bins=100, label="x and y", color=cmap(0.25))
# 右上。y 轴用 log scale
ax[0][1].hist(z, bins=100, label="x and y", color=cmap(0.25), log=True)
# 左下,并列
ax[1][0].hist((x, y), bins=100, label=("x", "y"))
# 右下,堆叠
ax[1][1].hist((x, y), bins=100, label=("x", "y"), stacked=True)
# 图例
for i in range(len(ax)):
for j in range(len(ax[0])):
ax[i][j].legend(fancybox=True, framealpha=0) # 透明图例
plt.tight_layout()
fig.savefig("test.png", bbox_inches='tight')
plt.close(fig)