matplotlib画堆叠、并列直方图

在用 matplotlib.pyplot.hist 画分布图时,若总分布由几个分量组成(如高斯混合),想用不同颜色标识出来,方便看到各分量占比,参考 [1]。

效果:

  • 分布由两个分量(x、y)组成;
  • 左上:总分布;
  • 右上:总分布,y 轴用 log scale;
  • 左下:并列展示两个分量分布;
  • 右下:总分布,但堆叠展示两个分量分布,用不同颜色标识。

histogram

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)

References

  1. The histogram (hist) function with multiple data sets
  2. matplotlib.pyplot.hist
<think>好的,我现在需要帮助用户解答关于如何使用matplotlib绘制柱状图的问题。用户已经提供了相关的引用资料,我需要结合这些引用内容来组织回答。首先,我得确认用户的需求是什么。用户提到“我想使用matplotlib绘制柱状图的方法或示例”,并且希望看到示例代码。所以,我的回答应该包含基础柱状图的绘制步骤、代码示例,以及可能的扩展类型,比如堆叠、分组或带误差线的柱状图。 接下来,我需要查看用户提供的引用资料,看看里面有哪些有用的信息。引用[3]提到在自定义类中定义draw_bar_chart方法,使用plt.bar函数,并设置轴标签和标题。引用[4]讨论了堆叠和左右分布的柱状图,指出通过控制bar的参数来实现不同效果。引用[1]和[2]则提到了带有误差线的柱状图以及直方图中添加折线图的方法,不过用户的问题主要集中在柱状图上,可能需要重点参考引用[3]和[4]。 首先,我应该从基础柱状图开始。根据引用[3],使用plt.bar函数,设置x_data和y_data,然后添加标签和标题。这部分可以作为基础示例。然后,引用[4]提到堆叠和左右分布,可以通过调整bar的bottom或position参数来实现。比如,堆叠图可以通过设置后续柱子的bottom参数为前一个柱子的高度,而左右分布则可以通过调整x轴的位置,比如每个柱子的x坐标加上一个偏移量。 另外,用户提供的引用[1]提到带有误差线的柱状图,这可能需要在基础柱状图的基础上添加误差线,可以使用plt.errorbar或者在bar函数中使用yerr参数。不过具体实现可能需要查阅matplotlib文档,但根据引用中的信息,可能需要结合示例代码来说明。 现在,我需要组织这些信息,分步骤说明如何绘制基础柱状图,然后扩展到其他类型。每个步骤应包含代码示例和解释,确保用户能够理解参数的作用。同时,要引用正确的引用来源,比如在提到堆叠和左右分布时引用[4],在基础绘图时引用[3]。 可能需要注意的问题包括:代码是否正确,比如是否需要导入matplotlib.pyplot和numpy,是否展示了完整的代码示例,包括显示图表的plt.show()。此外,是否需要解释每个参数的含义,比如x轴数据、高度,颜色等。 还要检查是否有遗漏的部分,比如添加图例、调整刻度标签等,这些在引用[3]和[4]中有提到吗?比如引用[3]提到设置X轴标签,Y轴标签和图表标题,所以在示例代码中应该包含plt.xlabel, plt.ylabel, plt.title等。而引用[4]可能需要说明如何调整柱子的位置,例如使用left参数或调整x坐标。 最后,生成相关问题,可能需要基于用户提供的引用和回答内容,比如如何绘制堆叠柱状图、如何添加误差线、如何自定义颜色等。 现在,我需要确保回答结构清晰,步骤明确,代码正确,并且正确引用相关的引用来源。例如,在基础示例部分引用[3],在堆叠和分组部分引用[4],在误差线部分引用[1]。同时,代码示例需要符合用户的要求,使用中文注释还是英文?根据用户的问题,应该用中文回答,所以代码注释可能需要用中文,或者不加注释,但变量名和文字说明用中文。 可能需要整理代码示例,确保语法正确,比如正确的缩进,正确的函数调用。例如,在堆叠柱状图中,第二个plt.bar的bottom参数设置为第一个柱子的y值。在分组柱状图中,调整x坐标的偏移量,并使用width参数控制柱宽。 最后,生成相关问题,可能需要包括如何调整样式、添加标签、处理大数据集等,基于回答中的内容。</think>### 使用Matplotlib绘制柱状图的步骤与示例 #### 1. 基础柱状图 使用$plt.bar$函数,设置$x$轴数据与柱子的高度,添加标签和标题即可绘制基础柱状图[^3]。 ```python import matplotlib.pyplot as plt x_data = ['A', 'B', 'C', 'D'] y_data = [20, 35, 30, 25] plt.bar(x_data, y_data, color='skyblue', edgecolor='black') plt.xlabel('类别') plt.ylabel('数值') plt.title('基础柱状图示例') plt.show() ``` #### 2. 堆叠柱状图 通过设置`bottom`参数,将多个柱状图按垂直方向堆叠[^4]: ```python y1 = [10, 15, 20, 12] y2 = [5, 8, 10, 7] plt.bar(x_data, y1, label='数据集1') plt.bar(x_data, y2, bottom=y1, label='数据集2') # y2的底部基准为y1的值 plt.legend() plt.title('堆叠柱状图示例') plt.show() ``` #### 3. 分组柱状图 调整$x$轴坐标位置,实现多组数据左右并列显示[^4]: ```python import numpy as np # 生成分组x坐标 x = np.arange(len(x_data)) # [0,1,2,3] width = 0.3 # 柱子宽度 plt.bar(x - width/2, y1, width=width, label='数据集1') plt.bar(x + width/2, y2, width=width, label='数据集2') plt.xticks(x, x_data) # 设置x轴标签 plt.legend() plt.title('分组柱状图示例') plt.show() ``` #### 4. 带误差线的柱状图 通过`yerr`参数添加误差范围,提升数据可视化准确性[^1]: ```python errors = [2, 1.5, 3, 2.5] plt.bar(x_data, y_data, yerr=errors, capsize=5, color='lightgreen') plt.title('带误差线的柱状图') plt.show() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值