从零开始学matplotlib画图(三): 堆积图

2023-11-01

堆积图常用于综合展示不同分类的指标趋势以及它们的总和的趋势。比如说,我们想看一下过去二十年来中国人口总量的变化趋势,同时,我们又想看一下男、女性人口各自的变化趋势,甚至我们还想看一下它们各自占比的变化趋势,这时,我们就可以用堆积图来更高效、更简洁地展示出来。


欢迎大家关注我的个人博客【数洞】 【备用站】

我们举这样一个例子,有一个班里有20名学生,它们的编号分别是0-19,y1、y2、y3分别代表本次月考他们的语文、数学和英语的成绩,我们想观察这些学生的总成绩以及各科成绩的情况。

1. 堆积柱状图

首先,我们使用堆积柱状图来达到我们的目的:

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(0, 20, 20)
y1 = np.random.randint(50, 100, 20)
y2 = np.random.randint(50, 100, 20)
y3 = np.random.randint(50, 100, 20)

# 堆积柱状图
plt.bar(x, y1, color='r', label='语文')
plt.bar(x, y2, bottom=y1, color='g', label='数学')
plt.bar(x, y3, bottom=y1+y2, color='c', label='英语')

# 显示范围
plt.xlim(-2, 22)
plt.ylim(0, 280)

# 添加图例
plt.legend(loc='upper right')
plt.grid(axis='y', color='gray', linestyle=':', linewidth=2)

plt.show()

可以看到,有四位同学的总成绩高于250分,还有些同学严重偏科,另外有一个同学平均下来在及格线下方……大家不同太为他担心,因为这些都是随机生成的数据。

我们还可以将柱子横过来:

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(0, 20, 20)
y1 = np.random.randint(50, 100, 20)
y2 = np.random.randint(50, 100, 20)
y3 = np.random.randint(50, 100, 20)

# 堆积柱状图
plt.barh(x, y1, color='r', label='语文')
plt.barh(x, y2, left=y1, color='g', label='数学')
plt.barh(x, y3, left=y1+y2, color='c', label='英语')

# 显示范围
plt.ylim(-2, 22)
plt.xlim(0, 300)

# 添加图例
plt.legend(loc='lower right')

plt.show()

我们需要将bottom参数的名字改成left,这样更符合我们的视觉认知,其他参数上没有什么分别。

2. 堆积折线图

这次,我们假设小明参加了20次月考,我们想看下他的总成绩以及语数外三科成绩的变化趋势。

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
# 假设一个班里有20名学生,x代表他们的编号,y1/y2/y3分别是他们本次月考的成绩。
x = np.linspace(0, 20, 20)
y1 = np.random.randint(50, 100, 20)
y2 = np.random.randint(50, 100, 20)
y3 = np.random.randint(50, 100, 20)

# 堆积柱状图
plt.stackplot(x, y1, y2, y3, baseline='zero', labels=['语文', '数学', '英语'], colors=['r', 'g', 'c'])

# 显示范围
plt.xlim(-2, 22)
plt.ylim(0, 300)

# 添加图例和网格线
plt.legend(loc='upper right')
plt.grid(axis='y', color='gray', linestyle=':', linewidth=2)

plt.show()

嗯……小明的成绩太不稳定了,不过还好,平均成绩还没到过及格线以下。从这张图里边,我们看不到明显的上升或者下降的趋势。

这样我们看到了成绩的变化趋势,但是我们不能清楚地分辨小明哪科成绩更好,哪科成绩是短板,因此我们需要看一下小明的总成绩中各科成绩占比的变化趋势。

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
# 假设一个班里有20名学生,x代表他们的编号,y1/y2/y3分别是他们本次月考的成绩。
x = np.linspace(0, 20, 20)
y1 = np.random.randint(50, 100, 20)
y2 = np.random.randint(50, 100, 20)
y3 = np.random.randint(50, 100, 20)

# 计算百分比
y1p = y1 / (y1 + y2 + y3)
y2p = y2 / (y1 + y2 + y3)
y3p = y3 / (y1 + y2 + y3)

# 比例堆积柱状图
plt.stackplot(x, y1p, y2p, y3p, baseline='zero', labels=['语文', '数学', '英语'], colors=['r', 'g', 'c'])

# 显示范围
plt.xlim(0, 20)
plt.ylim(0, 1)

# 添加图例
plt.legend(loc='upper right')
plt.grid(axis='y', color='gray', linestyle=':', linewidth=2)

plt.show()

由于这里各科的成绩都是我们随机生成的,所以我们从图中并不能看出来小明的强弱势科目,但这种表现方式非常实用。比如我们要分析用户结构的变化趋势、分析内容类型分布的趋势等。这种图形相当于在饼图的基础上增加了时间序列的维度,将多个饼图拉伸开来,连接到一起。

今天我们展示了如何绘制堆积柱状图和堆积折线图(面积图),之后这一系列文章每一期会专门针对一个点来进行分享,确保每次大家能用十来分钟就学会一项新的实用技能,这样才不负咱们“功利主义”的“美名”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始学matplotlib画图(三): 堆积图 的相关文章

  • 向二元 kdeplot 添加标签

    我喜欢 Seaborn 的例子多个双变量 KDE 图 https seaborn pydata org examples multiple joint kde html 但我希望在该示例中使用标准 matplotlib 图例而不是自定义标签
  • 使用三个一维数组绘制等值线图

    正如标题所示 我想使用三个一维数组绘制等高线图 这么说吧 x np array 1 2 3 and y np array 1 2 3 and z np array 20 21 45 为了在 matplotlib 中绘制等高线图 我对x an
  • 如何并排绘制具有相同 X 坐标的条形图(“闪避”)

    import matplotlib pyplot as plt gridnumber range 1 4 b1 plt bar gridnumber 0 2 0 3 0 1 width 0 4 label Bar 1 align cente
  • 我可以使用文本叠加执行类似 imsave() 的操作吗?

    我在用imsave 依次制作许多 PNG 我将它们合并为 AVI 并且我想添加移动文本注释 我用ImageJ http imagej nih gov ij features html制作 AVI 或 GIF 我不需要轴 数字 边框或任何东西
  • 在一张图中同时绘制两个截面强度

    我有一个形状数组 512 512 看起来像 行 x 列 y 密度 z 数组的数量 0 012825 0 020408 0 022976 0 015938 0 02165 0 024357 0 036332 0 031904 0 025462
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • matplotlib 中的固定大小矩形?

    Is there any way to plot a rectangle spanning the entire length of the X axis but with a fixed and static height of say
  • 为什么 Jupyter Notebook 在更新绘图时会创建重复的绘图

    我正在尝试在 Jupyter Notebook 中绘制每秒更新一次的绘图 现在 我只有一个可以运行的简单代码 matplotlib inline import time import pylab as plt import numpy as
  • 如何计算python 2D散点占用面积

    我使用 matplotlib 绘制了这两个 2000 个点的序列 从图片上看 前2000点占用的面积比后2000点要小 但如果我想定量计算2000个点的第一序列和第二序列占用了多少面积 该怎么办 我真的很感谢任何帮助 建议或意见 非常感谢
  • 如何绘制日期和月份

    我有一张随时间变化的每日趋势图表 年份与此处无关 我只想显示日期和月份 我知道你可以显示年份和月份 但事实并非如此 我尝试创建一个名为 Day Month 的新变量 import datetime as dt df Day df date
  • 删除网格线,但保留框架(matplotlib 中的 ggplot2 样式)

    使用 Matplotlib 我想删除图中的网格线 同时保留框架 即轴线 我已经尝试过下面的代码和其他选项 但我无法让它工作 如何在删除网格线的同时保留框架 我这样做是为了在 matplotlib 中重现 ggplot2 图 我在下面创建了一
  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • Matplotlib:Gridspec 或 plt.subplot2grid 的 OOP 等效项是什么

    要在可以具有列跨度和行跨度的表中排列子图 Matplotlib 的 Pyplot API 使用 http matplotlib org users gridspec html http matplotlib org users gridsp
  • 基于 Unix ASCII 的命令行图表/绘图工具

    有没有好的命令行 UNIX 图表 绘图 绘图工具 我正在寻找能够在 ASCII 图表上绘制 xy 点的东西 澄清一下 我正在寻找能够以 ASCII 格式输出图形 如 ascii art 风格 的东西 这样我就可以在交互式 shell 会话中
  • Matplotlib:以数据坐标中给定的宽度绘制线条

    我试图弄清楚如何绘制具有数据单位宽度的线条 例如 在下面的代码片段中 我希望宽度为 80 的线的水平部分始终从 y 40 延伸到 y 40 标记 并且即使坐标系的限制也保持这种状态改变 有没有办法用 matplotlib 中的 Line2D
  • 绘制到图像对象

    我可以保存一个图imshow 因为它返回一个图像对象 如下所示 image plt imshow list interpolation None 后来我想创建其中许多图像的动画 将其保存在列表中并将其渲染为视频 如果这种方法很愚蠢 请告诉我
  • 尽管 ioff() 和 matplotlib.use('Agg'),Pyplot“无法连接到 X 服务器 localhost:10.0”

    我有一段代码 它被不同的函数调用 为我执行一些计算 然后将输出绘制到文件中 鉴于整个脚本可能需要一段时间才能运行更大的数据集 并且由于我可能想在给定时间分析多个数据集 所以我开始它screen然后断开连接并关闭我的腻子会话 并在第二天再检查
  • matplotlibplot_曲面图

    matplotlib 教程提供了如何绘制球面的一个很好的示例 from mpl toolkits mplot3d import Axes3D import matplotlib pyplot as plt import numpy as n
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo

随机推荐

  • Vue-引用组件,不显示

    引用了Header vue 组件到页面 结果不显示 原因 这是语义化的词会导致无法解析 解决方法 1 使用组件是小写 把首字母大写 2 换个组件名字
  • Batch与Patch 代表什么

    Batch是批量的大小 就是你训练的时候每次输入多少张图片 Patch是图像块的大小 比如说原图1024 1024 随机从图中裁剪出256 256大小的块 就是patch 更准确来说 patch 指一个二维图片中的其中一个小块 即一张二维图
  • cuda编程性能 分析工具 nvprof的使用

    ubuntu环境上 安装cuda 会自动安装一些工具nvcc nvprof nvcc gdb 1 编译生成可执行文件 2 nvprof test 可以把性能分析数据输出到文件中 nvprof test o test nvvp 可以把在nvi
  • C++的三种实例化对象方式

    一 隐式创建 class CEmployee private int age int id public CEmployee cout lt lt 这是构造函数 lt lt endl CEmployee int id this gt id
  • C++ Qt常用面试题整理(不定时更新)

    目录 1 Qt基础知识 1 Qt信号槽机制的优势和不足 2 static和const的使用 3 指针常量 常量指针 常指针常量 4 指针和引用的异同 5 如何理解多态 6 虚函数表 7 常用数据结构 8 Tcp 2 C 基础 1 C语言和C
  • react项目路由组件懒加载和路由传值方式

    项目实战 使用useRoutes配置路由 结合插槽配置用户登录检测 用户登录成功进入login 直接系统主界面 路由模块抽离 整体代码外移 path admin element
  • IGBT选型和设计注意事项

    认识IGBT IGBT 绝缘栅双极型晶体管 是由 BJT 双极型三极管和绝缘栅型场效应管 MOS 组成的复合全控型电压驱动式功率半导体器件 兼有 MOSFET 金氧半场效晶体管的高输入阻抗和电力晶体管 GTR 的低导通压降两方面的优点 具有
  • 谷歌地图-----添加文本标注

    由于谷歌地图没有直接的类似百度地图API中的BMap Label 方法 var label new google maps Marker label color FFF 文本颜色 fontSize 14px 文本字体大小 text 我的文本
  • P5[3-1]GPIO输出端口(简介+结构+配置+电路+软件设计原理)

    注 GPIO命名是GPIOA GPIOB 每个GPIO都有16个引脚 PA0 PA1 PA15 寄存器就是特殊的存储器 内核通过APB2总线对寄存器进行读写 完成输出电平和读取电平功能 每一位对应一个引脚 输出寄存器写1 对应引脚输出高电平
  • Js 正则 大于0的数

    const reg 1 9 d d 1 6 0 d 1 6 以下正则也是正确的 const reg d 1 9 0 d 1 6 0 d 1 6 大于0 小数不限 const reg 1 9 0 9 0 d 1 9 d
  • vue中使用el-table组件进行分页多选,回显、切换分页记住上一页所勾选和取消的选项

    需求 1 table表格多选 并且切换分页之后能记住上一页的选项 2 回显数据 切换分页之后再切换回来依然能回显数据 3 点击选项 未保存数据 切换页面后再切换回来初始化数据勾选状态 4 全选 取消全选数据正常变化 5 使用了dialog来
  • IDEA隐藏不想看见的文件

    比如我在使用idea创建spring boot工程时会出现图中箭头指向的文件 但是我又不想看到它们 可以通过设置将其隐藏 单击文件 打开设置 在搜索框中输入File Types然后打开 在箭头所指的地方下面的输入框中输入你要隐藏的文件名 也
  • 函数对象简述

    使用方式 函数与函数对象 函数指针与函数对象 使用方式 函数对象 简而言之 就是类对于 运算符的重载 使我们可以像使用函数那样使用对象 示例如下 ifndef TOOBIG H define TOOBIG H template
  • 【完全开源】小安派-Audio 外置音频开发板

    目录 一 概述 二 系统框图 三 电源管理模块 四 外置语音模块 五 GPIO引脚设计 六 资料 一 概述 小安派 Audio AiPi Audio 是安信可团队专门为Ai M61 32S设计的音频驱动开发板 搭配BL618芯片 其外置ES
  • PyCharm中导入库的方法

    两种方法 1 搜索添加 列表中是已经存在的库 若需要添加库 点击 搜索 待库安装完成 即可使用 2 利用终端命令 输入代码 回车 即可完成 numpy库为例 我的是已经存在了
  • 【抽样技术】CH2 简单随机抽样

    目录 前言 一 定义 二 概述 1 总体 2 单元 3 抽样比 4 样本抽取原则 5 在抽样理论中的地位与作用 三 参数估计 1 参数表示 2 对总体特征的估计思路 3 对总体均值的估计 1 引理 2 对总体均值的估计 4 方差和协方差的估
  • ROS2学习笔记(三)从turtlesim学习ROS2主题

    从turtlesim学习ROS2主题 前言 学习ROS2的路 并不能通过学习ROS1代替 因为ROS2的 内核 不同于ROS1 必须认认真真从头开始重新学习 Ubuntu版本 20 04 ROS版本 Foxy 学习笔记回顾 ROS2学习笔记
  • Teamviewer检测为商业用途的解决方案

    Teamviewer检测为商业用途的解决方案 注意 Teamviewer远程链接需要两台计算机参与 需要在两台计算机上都安装Teamviewer软件 所以在链接中出现被检测到商业用途 并不知道到底是哪一台计算机上的电脑出现问题 所以如果按照
  • solr之lucene全文检索的基本原理

    一 总论 根据http lucene apache org java docs index html定义 Lucene是一个高效的 基于Java的全文检索库 所以在了解Lucene之前要费一番工夫了解一下全文检索 那么什么叫做全文检索呢 这
  • 从零开始学matplotlib画图(三): 堆积图

    堆积图常用于综合展示不同分类的指标趋势以及它们的总和的趋势 比如说 我们想看一下过去二十年来中国人口总量的变化趋势 同时 我们又想看一下男 女性人口各自的变化趋势 甚至我们还想看一下它们各自占比的变化趋势 这时 我们就可以用堆积图来更高效