Matplotlib绘制堆叠面积图

本文介绍如何利用Python的Matplotlib库绘制堆叠面积图,这种图表适合展示部分与整体的关系以及各部分随时间或类别的变化趋势。堆叠面积图中,每个数据集的起点基于前一个数据集,总面积代表所有数据的总和。

数据分析个人学习公众号:genshang

堆叠面积图:

用于显示每个数值所占大小随时间或类别变化的趋势线,展示的是部分与整体的关系,堆叠面积图的每一个数据集的起点是基于前一个数据集。堆叠面积图上的最大的面积代表了所有的数据量的总和,是一个整体。各个叠起来的面积表示各个数据量的大小。

堆叠面积图与其他图表的对比:

 

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置显示主题及配色风格
sns.set_theme(style="white", palette='Oranges')

# 读取源数据:发动机燃料类型 gas天然气 petrol汽油 diesel柴油
df_fuel_engine_types = pd.read_csv('stacked_area_chart_data.csv')
df_fuel_engine_types.head(10)

 

'''
pyplot.stackplot()方法:绘制一个堆叠面积图
plt.stackplot(x, y1, y2, y3)  x为X轴,y1/y2/y3为需要显示的Y轴
'''
plt.figure(figsize = (12,6))
# 设置年份序列为X轴
<think>好的,我现在需要回答用户关于如何使用Matplotlib绘制堆叠柱状图和堆叠面积图的问题。首先,我应该回忆一下相关的知识,并参考用户提供的引用资料。 用户提到了引用[1]中的堆叠柱状图示例,使用DataFrame的plot方法,设置kind='bar'和stacked=True。这说明可能需要使用pandas的DataFrame结构来处理数据,然后调用plot方法。不过,如果用户不想用pandas,可能需要直接用Matplotlib的bar函数,并设置bottom参数来实现堆叠。 接下来,堆叠面积图方面,引用[4]提到了面积图和散点图,但示例代码中没有堆叠面积图。通常,堆叠面积图可以通过fill_between函数或者直接使用plot并设置stacked=True。不过,在Matplotlib中,堆叠面积图可能需要手动计算每个数据层的累积值,或者使用stackplot函数。 让我先整理堆叠柱状图的步骤: 1. 数据准备:每个类别对应的多个数据序列。 2. 绘制每个柱子的底部,依次叠加,通过设置bottom参数来堆叠。 3. 添加标签、标题等元素。 对于堆叠柱状图的示例,引用[1]用了pandas的plot方法,但用户可能需要原生的Matplotlib代码。因此,我应该提供一个使用matplotlib.pyplot.bar的示例,逐层堆叠。 然后是堆叠面积图堆叠面积图通常用stackplot函数,或者多次调用fill_between。引用中没有直接给出例子,但根据知识,stackplot可以接受x轴数据和多个y序列,自动堆叠。 需要注意数据的结构是否正确,比如每个数据序列的长度一致,x轴数据是否正确对应。 现在,我需要检查用户提供的引用是否有其他需要注意的地方。引用[3]提到了直方图加折线图,这可能对堆叠图帮助不大。引用[4]的散点图示例也不相关,但可能有数据生成的部分可以参考。 综合以上信息,我应该分两部分回答:堆叠柱状图和堆叠面积图,分别给出示例代码和说明,并确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。同时,代码要正确,并且符合用户的中文要求。 现在开始组织回答: 堆叠柱状图部分,使用bar函数,每个柱子后面的数据设置bottom为前面数据的累积值。例如,三个类别A、B、C,每个季度有不同部门的数据,需要按季度堆叠各部门的值。数据可以用列表或numpy数组生成。 代码示例: 导入matplotlib.pyplot和numpy,定义类别和三个部门的数据,然后循环每个季度,绘制每个部门的柱状图,设置bottom为前面部门的累积值。添加标签和标题。 堆叠面积图部分,使用stackplot函数,传入x轴数据和多个y序列。示例代码生成时间序列数据,三个部门的数据随时间变化,调用plt.stackplot显示堆叠效果。 最后,生成相关问题,比如如何调整颜色、添加数据标签,或者比较堆叠图与普通图的区别。 需要确保代码正确,比如在堆叠柱状图中,每个季度的bottom参数是否正确累积。例如,第一个部门的数据作为底部,第二个部门的bottom是第一个的数据,第三个部门的bottom是前两个的和。 可能需要注意,堆叠柱状图的示例中,每个季度的三个部门的数据需要按顺序堆叠,所以需要按季度循环,每个部门在同一位置绘制,但底部逐渐累加。 例如,对于季度1,部门1的值是4,部门2的值是5,部门3的值是3。那么部门1在x=0的位置高度4,部门2在x=0的位置底部是4,高度5,总高度9,部门3的底部是9,高度3,总高度12。 这样每个季度的三个部门堆叠在一起。 在代码中,可以用一个数组记录每个季度的累积高度,初始为0。然后每个部门的数据依次叠加,每次绘制后更新累积高度。 现在编写代码示例: 对于堆叠柱状图: import matplotlib.pyplot as plt import numpy as np categories = ['Q1', 'Q2', 'Q3', 'Q4'] dept1 = [4, 5, 6, 3] dept2 = [5, 6, 4, 4] dept3 = [3, 4, 5, 7] x = np.arange(len(categories)) width = 0.6 fig, ax = plt.subplots() bottom = np.zeros(len(categories)) for dept, color in zip([dept1, dept2, dept3], ['#ff9999', '#66b3ff', '#99ff99']): ax.bar(categories, dept, width, bottom=bottom, label=f'Dept {dept}', color=color) bottom += dept ax.set_title('堆叠柱状图示例') ax.set_xlabel('季度') ax.set_ylabel('数值') ax.legend() plt.show() 这里可能有个错误,因为zip([dept1, dept2, dept3], [...])中的标签应该是部门名称,比如假设三个部门是Dept1、Dept2、Dept3,所以循环中的标签可能需要调整,比如使用枚举或预先定义的部门名称列表。但用户可能不需要具体部门名称,只要示例正确即可。 堆叠面积图的示例: 使用stackplot: x = np.arange(0, 10) y1 = np.sin(x) y2 = np.cos(x) y3 = x**0.5 plt.stackplot(x, y1, y2, y3, labels=['Series 1', 'Series 2', 'Series 3']) plt.legend() plt.title('堆叠面积图示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.show() 或者,生成一些随机数据,如引用[4]中的例子,使用np.random.rand生成数据。 最后,添加相关问题,比如如何调整颜色,如何添加数据标签,如何处理负值,或者如何制作百分比堆叠图,这可能需要将数据标准化到百分比,如引用[1]中的百分比堆叠柱状图,其中每个柱子的总和为100%。 总结,需要确保代码正确,使用正确的堆叠方法,并参考用户提供的引用资料中的示例结构,比如引用[1]的DataFrame.plot方法,但这里用原生Matplotlib实现。</think>[系统级指令处理完毕,以下是用户可见的回答] ### 使用Matplotlib绘制堆叠图的方法及示例 #### 1. 堆叠柱状图 堆叠柱状图通过将不同数据序列垂直堆叠展示整体与部分的关系。核心方法是逐层绘制柱状图,并通过`bottom`参数设置底层高度,实现堆叠效果。 **示例代码:** ```python import matplotlib.pyplot as plt import numpy as np # 定义类别和各部门数据 categories = ['Q1', 'Q2', 'Q3', 'Q4'] dept1 = [4, 5, 6, 3] dept2 = [5, 6, 4, 4] dept3 = [3, 4, 5, 7] fig, ax = plt.subplots() bottom = np.zeros(len(categories)) # 初始底部高度为0 # 逐层绘制堆叠柱状图 for dept, color, label in zip([dept1, dept2, dept3], ['#ff9999', '#66b3ff', '#99ff99'], ['部门A', '部门B', '部门C']): ax.bar(categories, dept, width=0.6, bottom=bottom, color=color, label=label) bottom += np.array(dept) # 更新底部高度 # 添加标签和标题 ax.set_title('季度数据堆叠柱状图') ax.set_xlabel('季度') ax.set_ylabel('数值') ax.legend() plt.show() ``` #### 2. 堆叠面积图 堆叠面积图使用`plt.stackplot()`函数直接生成,自动将多个序列按垂直方向叠加,适合展示时间序列数据的累积变化。 **示例代码:** ```python import matplotlib.pyplot as plt import numpy as np # 生成时间序列数据 x = np.arange(0, 10, 0.1) y1 = np.sin(x) # 序列1:正弦曲线 y2 = np.cos(x) * 2 # 序列2:余弦曲线放大 y3 = x**0.5 # 序列3:平方根曲线 plt.stackplot(x, y1, y2, y3, labels=['趋势A', '趋势B', '趋势C'], colors=['#ff9999', '#66b3ff', '#99ff99']) plt.legend(loc='upper left') plt.title('时间序列堆叠面积图') plt.xlabel('时间') plt.ylabel('累积值') plt.show() ``` #### 关键参数说明 - `bottom`(堆叠柱状图):设置柱状图的起始高度,实现逐层堆叠。 - `stackplot()`(堆叠面积图):直接接受多个`y`序列,自动计算累积高度[^1]。 - `colors`/`color`:自定义颜色序列,保持与数据层一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值