数据可视化--使用matplotlib绘制高级图表

article/2025/8/27 2:07:47

目录

一、绘制等高线图

contour()

二、绘制矢量场流线图

 streamplot()

三、绘制棉棒图

 stem()

四、绘制哑铃图

五、绘制甘特图

六、绘制人口金字塔图

barh()

七、绘制漏斗图

 简易版漏斗图

八、绘制桑基图

 Sankey()---创建桑基图

add()---添加桑基图的选项

finish()---返回桑基图绘制完成的对象

桑基子图包含以下字段

九、绘制树状图

dendrogram()---将层次聚类数据绘制为树状图

linkage()---将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类

十、绘制华夫饼图

pywaffle的安装 

pywaffle的使用


一、绘制等高线图

等高线图是地形图上高程相等的相邻各点所连成的闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照一定的比例缩绘到图纸上,常见于山谷、山峰或梯度下降算法的场景。

等高线图包含三个主要的信息,分别为坐标点的x值、坐标点y值以及坐标点的高度。假设坐标点的高度为h,则h、x、y之间的关系如下所示:

contour()

contour([X, Y,]Z, [levels,]**kwargs)

X,Y:表示坐标点的网格数据。

Z:表示坐标点对应的高度数据。

levels:表示等高线的数量。若levels为n,则说明绘制n+1条等高线。

colors:表示不同高度的等高线颜色。

cmap:表示颜色映射表。

linewidths:表示等高线的宽度。

linestyles:表示等高线的线型。 

需要注意的是,参数X、Y需要接收网格数据,即以坐标矩阵批量地描述点的位置。numpy模块的meshgrid()函数可以生成网格数据。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义计算高程的函数
def calcu_elevation(x, y):return np.sin(np.sqrt(x**2 + y**2))
# 生成网格数据
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
x_grid, y_grid = np.meshgrid(x, y)
# 创建图形和子图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 绘制等高线
con = ax.contour(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, colors='black')
# 填充等高线的颜色
ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper)
# 为等高线添加文字标签
ax.clabel(con, inline=True, fmt='%1.1f', fontsize=10)
# 添加标题和标签
ax.set_title('等高线图示例', fontsize=15)
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
# 添加颜色条
cbar = plt.colorbar(ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper))
cbar.set_label('高程', fontsize=12)
# 显示网格线
plt.grid(True, linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

 

二、绘制矢量场流线图

矢量场流线图可以表现矢量场的流态,常见于科学和自然学科中的磁场、万有引力和流体运动等场景。

矢量场流线图包含多条带有箭头的线条,其中线条的长度表示矢量场的强度,箭头的方向表示矢量场的方向。此外,矢量场的强度也可以使用线条的密度来表示。

 streamplot()

streamplot(x, y, u, v, density=1, linewidth=None, col=None, cmap=None, norm=None,  arrowsize=1, arrowstyle='-|>', minlength=0.1, transform=None, zorder=None,  start_points=None, maxlength=4.0, integration_direction='both', *, data=None)

x,y:表示间距均匀的网格数据。

u,v:表示(x,y)速率的二维数组。

density:表示流线的密度。

linewidth:表示流线的宽度。

arrowsize:表示箭头的大小。

arrowstyle:表示箭头的类型。

minlength:表示流线的最小长度。

maxlength:表示流线的最大长度。

import numpy as np
import matplotlib.pyplot as plt
y, x = np.mgrid[0:5:50j, 0:5:50j]
u = x
v = y
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制矢量场流线图
ax.streamplot(x, y, u, v)
plt.show()

三、绘制棉棒图

棉棒图亦称为火柴杆图、大头针图或棒棒糖图,由线段(茎)与标记符号(茎头,默认为圆点)连接而成,其中线段表示数据点到基线的距离,标记符号表示数据点的数值。

棉棒图是柱形图或条形图的变形,主要用于比较标记符号的相对位置,而非比较线段的长度。

 stem()

stem([x,] y, linefmt=None, markerfmt=None, basefmt=None, bottom=0,  label=None, use_line_collection=False, data=None)

x,y:表示茎的x值和茎头的y值。

linefmt:表示茎属性的字符串。

markerfmt:表示茎头属性的字符串。

basefmt:表示基线属性的字符串。

bottom:表示基线的y值。 label:表示应用于图例的标签。

use_line_collection:若设为True,则将棉棒图的所有线段存储到一个LineCollection类对象中;若设为False,则将棉棒图的所有线段存储到列表中。

四、绘制哑铃图

哑铃图亦称为DNA图(图表横着看像哑铃,竖着看像DNA),主要用于展示两个数据点之间的变化。

哑铃图可以看作散点图与线型图的组合,适用于比较各种项目“前”与“后”的位置及项目的等级排序的场景。

五、绘制甘特图

甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。甘特图一般以时间为横轴,项目为纵轴,可以直观地展示每个项目的进展情况,便于管理者了解项目的剩余任务及评估工作进度。

使用pyplot的barh()函数可以绘制一个甘特图,只需要给该函数的left参数传值,指定每个矩形条的x坐标即可。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]# 数据定义
tasks = np.array(['报告提交', '数据分析', '数据录入', '实地执行', '问卷确定', '试访', '问卷设计', '项目确定'])
y_positions = np.arange(1, 9)
durations = np.array([0.5, 1.5, 1, 3, 0.5, 1, 1, 2])
start_times = np.array([7.5, 6, 5.5, 3, 3, 2, 1.5, 0])# 创建图形和子图
fig, ax = plt.subplots(1, 1, figsize=(12, 8))# 定义颜色映射(可以根据任务类型分配不同颜色)
colors = ['#CD5C5C', '#3CB371', '#4169E1', '#FFA500', '#9370DB', '#87CEFA', '#DDA0DD', '#90EE90']# 绘制甘特图条形
bars = ax.barh(y_positions, durations, left=start_times, color=colors, alpha=0.8, edgecolor='black')# 移除顶部和右侧的边框
[ax.spines[i].set_visible(False) for i in ['top', 'right']]# 设置左侧和底部边框样式
ax.spines['left'].set_linewidth(1.5)
ax.spines['bottom'].set_linewidth(1.5)# 设置y轴刻度标签和范围
plt.yticks(y_positions, tasks, ha='right', fontsize=12)
plt.ylim(0, 9)# 设置x轴刻度和范围
plt.xticks(np.arange(0, 11, 1), fontsize=10)
plt.xlim(0, 10)# 添加标题
plt.title('项目执行时间安排甘特图', fontsize=16, pad=20)# 添加x轴标签
plt.xlabel('时间(天)', fontsize=12, labelpad=10)# 为每个任务添加数据标签
for i, (start, duration, bar) in enumerate(zip(start_times, durations, bars)):ax.text(start + duration/2, y_positions[i], f'{duration}天', ha='center', va='center', color='white', fontweight='bold')# 添加网格线(水平方向)
plt.grid(axis='x', linestyle='--', alpha=0.7)# 添加图例
legend_elements = [Patch(facecolor=colors[i], edgecolor='black', label=tasks[i]) for i in range(len(tasks))]
ax.legend(handles=legend_elements, loc='upper right', bbox_to_anchor=(1.3, 1), title='任务')# 调整布局
plt.tight_layout()# 显示图形
plt.show()

 

六、绘制人口金字塔图

人口金字塔图是指用类似古埃及金字塔的形象描述人口年龄与性别分布状况的图形,用于表现人口的现状及其发展类型。人口金字塔图一般以年龄为纵轴、以人口数为横轴,按年龄自然顺序自下而上在纵轴左侧和右侧绘制并列的横向矩形条,纵轴左侧为男,右侧为女。

barh()

七、绘制漏斗图

漏斗图亦称为倒三角图,它将数据呈现为几个阶段,每个阶段的占比总计为100%,从一个阶段到另一阶段的数据自上而下逐渐降低。漏斗图通过展示业务各阶段数据的变化,可以帮助运营人员快速发现问题,适用于业务流程较为规范、周期长、环节多的流程分析的场景。

 简易版漏斗图

 

 

八、绘制桑基图

桑基图亦称为桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,用于展示数据的“流动”变化。

桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表着数据流量的大小,且所有主支宽度的总和等于所有分支宽度的总和,常见于能源、材料成分等场景或金融领域。

 Sankey()---创建桑基图

Sankey(ax=None, scale=1.0, unit='', format='%G', gap=0.25, radius=0.1,  shoulder=0.03, offset=0.15, head_angle=100, margin=0.4,  tolerance=1e-06, **kwargs)

ax:若不提供该参数,会创建一个新的坐标轴。

scale:表示流量比例因子比例调整分支的宽度。

unit:表示与流量相关的物理单位的字符串。若设为None,则不会做数量标记。

gap:表示进入或离开顶部或底部的分支之间的间距,默认为0.25。

add()---添加桑基图的选项

add(self, patchlabel='', flows=None, orientations=None, labels='',  trunklength=1.0, pathlengths=0.25, prior=None, connect=(0, 0), rotation=0, **kwargs)

patchlabel:表示位于图表中心的标签。

flows:表示流量数据的数组,其中投入数据为正值,产生数据为负值。

orientations:表示流的方向列表或用于所有流的单个方向,可以取值为0(从左侧输入、右侧输出)、1(从顶部到顶部)或-1(从底部到底部)。

labels:表示流的标签列表或用于所有流的单个标签。

trunklength:表示输入组和输出组的基之间的长度。

finish()---返回桑基图绘制完成的对象

桑基子图包含以下字段

patch:表示桑基子图的轮廓。

flows:表示流量值(输入为正,输出为负)。

angles:表示箭头角度的列表。

tips:表示流路径的尖端或凹陷位置的数组,其中每一行是一个(x, y)。

text:表示中心标签的Text实例。

texts:表示流分支标签的Text实例。

九、绘制树状图

树状图亦称为树枝状图,是一种通过树状结构描述父子成员层次结构的图形。树形图的形状一般是一个上下颠倒的树,其根部是一个没有父成员的根节点,之后从根节点开始是用线连接子成员,使子成员变为子节点,直至线的末端为没有子成员的树叶节点为止。树状图用于说明成员之间的关系和连接,常见于分类学、进化科学、企业组织管理等领域。

dendrogram()---将层次聚类数据绘制为树状图

dendrogram(Z, p=30, truncate_mode=None, color_threshold=None, get_leaves=True, orientation='top', labels=None, count_sort=False, distance_sort=False, show_leaf_counts=True, **kwargs)

Z:表示编码层次聚类的链接矩阵。

truncate_mode:表示截断的模式,用于压缩因观测矩阵过大而难以阅读的树状图,可以取值为None(不执行截断,默认)、'lastp'、'level'。

color_threshold:表示颜色阈值。

labels:表示节点对应的文本标签。

linkage()---将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类

linkage(y, method='single', metric='euclidean', optimal_ordering=False)

y:可以是一维距离向量或二维的坐标矩阵。

method:表示计算类簇之间距离的方法,常用的取值可以为'single'、 'complete'、 'average'和'ward‘,其中'single'表示将类簇与类簇之间最近的距离作为类簇间距; 'complete' 表示将类簇与类簇之间最远的距离作为类簇间距;'average'表示将类簇与类簇之间的平均距离作为类簇间距;'ward‘表示将每个类簇的方差最小化作为类簇间距。

十、绘制华夫饼图

华夫饼图亦称为直角饼图,它是饼图的变体,可以直观地展示部分与整体的比例。

华夫饼图一般由100个方格组成,其中每个方格代表1%,不同颜色的方格代表不同的分类,常见于比较同类型指标完成比例的场景,比如电影上座率、公司业务实际完成率等。

pywaffle的安装 

pip install pywaffle

 以上命令执行后,若命令提示符窗口出现如下字样,说明pywaffle包安装完成

安装完成后,在提示符的后面输入python,之后输入如下导入语句进行验证:

from pywaffle import Waffle

执行以上语句后,若命令提示符窗口没有出现任何错误信息,说明pywaffle安装成功,否则说明安装失败。

pywaffle的使用

pywaffle是Python中专门绘制华夫饼图的包,它提供了一个继承自Figure的子类Waffle,通过将Waffle类传递给figure()函数的FigureClass参数,即可创建一个华夫饼图。关于figure()函数中创建华夫饼图的常用参数的含义如下:

FigureClass:可以是Figure类或Figure子类。

rows:表示华夫饼图的行数。

columns:表示华夫饼图的列数。

values:表示数据,可以接收数组或字典。若values参数接收一个字典,则将字典的键作为华夫饼图的图例项。

colors:表示每个分类数据的颜色列表。

vertical:表示是否按垂直方向绘制华夫饼图,默认为False。

title:表示标题,可以接收一个字典,其中字典的键为title()函数的关键字参数。

legend:表示图例,可以接收一个字典,其中字典的键为legend()函数的关键字参数。


http://www.hkcw.cn/article/IIRCsZojZX.shtml

相关文章

[Windows] 摸鱼小工具:隐藏软件(重制版)

由吾爱大神写的摸鱼工具: 数据存放路径为C:\Users\用户名\AppData\Local\HideSoft,如果不想用时,删除软件及此路径下的HideSoft文件夹。如添加了开机启动,删除启动菜单文件夹的快捷方式即可,或者删除前在软件中取消设置…

模块化集成建筑(MiC建筑):颠覆传统的未来建造革命

传统建筑行业长期面临"高污染、高能耗、低效率"的困境。施工现场粉尘飞扬、建材浪费严重、人工依赖度高,这些痛点制约着行业现代化进程。而MiC技术通过将建筑分解为标准化模块,彻底颠覆了传统建造模式。 在海南海口刚刚落幕的第二十一届国际绿…

【文献阅读】Hierarchical Reinforcement Learning: A ComprehensiveSurvey

Acm Computing Surveys (csur) 1区 2021年 分层强化学习:全面综述 分层强化学习(HRL)能够将具有挑战性的长时决策任务自主分解为更简单的子任务。在过去几年里,HRL 研究领域取得了显著发展,产生了大量方法。为了系…

鸿蒙网络数据传输案例实战

一、案例效果截图 二、案例运用到的知识点 核心知识点 网络连接管理:connection模块HTTP数据请求:http模块RPC数据请求:rcp模块文件管理能力:fileIo模块、fileUri模块 其他知识点 ArkTS 语言基础V2版状态管理:Comp…

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频,可能总有些时候会多录制一段时间,但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数,比如剪映就不支持mkv格式的导出,导出成mp4格式的视频就会变得很…

Python 电脑桌面——牛马工作量监控大屏

开源地址:https://gitee.com/beautiful_corridors/niuma Python 工作量监控大屏 基于 Python PySide6 开发的实时工作量监控桌面应用,提供美观的大屏显示界面。 功能特性 📊 实时监控 键盘输入统计: 实时统计按键次数,显示平…

界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现自定义遥测?

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 .NET As…

t009-线上代驾管理系统

项目演示地址 摘 要 使用旧方法对线上代驾管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在线上代驾管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题…

测试Bug篇

本节概要: 软件测试的生命周期 bug的概念 buh要素 bug等级 bug生命周期 对于bug的定级与开发发生冲突如何解决 一、 软件测试的⽣命周期 软件测试贯穿于软件的整个生命周期,针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个生命周期。 软…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.2 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用。 dataframe<-data.frame( Surfacec(74,64,60,92…

无人机报警器探测模块技术解析!

一、运行方式 1. 频谱监测与信号识别 全频段扫描&#xff1a;模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段&#xff0c;覆盖遥控、图传及GPS导航信号。 多路分集技术&#xff1a;采用多传感器阵列&#xff0c;通过信号加权合并提升信噪比&#xff0c;…

从本地到云端:Code App+SSH协议在iPad开发中的性能优化实战

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 在春日的公园长椅上&#xff0c;当编程灵感突然闪现时&a…

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack实战 (下)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)&#xff0c;其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>}&#xff0c;所以L(n.data) 是一个异步函数…

2025年05月29日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;11898今日star数&#xff1a;2379项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

Python自动化之selenium语句——打开、关闭浏览器和网页

目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件&#xff0c;输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…

实时操作系统在脑机接口中的技术平衡:满足实时性与 AI 算力需求

在当今医疗科技蓬勃发展的时代&#xff0c;实时操作系统&#xff08;RTOS&#xff09;正逐渐成为医疗设备领域中不可或缺的关键技术。随着脑机接口等前沿技术的飞速发展&#xff0c;对实时性和算力的双重需求达到了前所未有的高度&#xff0c;而 RTOS 在其中扮演着至关重要的角…

循环神经网络(RNN)模型

一、概述 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种专门设计用于处理序列数据&#xff08;如文本、语音、时间序列等&#xff09;的神经网络模型。其核心思想是通过引入时间上的循环连接&#xff0c;使网络能够保留历史信息并影响当前输出。 …

【stm32开发板】原理图设计(电源部分)附:设计PCB流程

一、PCB设计流程 二、操作步骤 1.新建工程 文件→新建→工程 2.命名工程 保存后进入该页面 自生成了一个原理图和PCB 3.新建图页及重命名 右键第一个图页&#xff0c;选择新建图页 右键选择重命名可以为图页改名 4.取消设计规则的22项 5.原理图尺寸调整 如果觉得原理图框的…

MCP入门实战(极简案例)

MCP简介 MCP(Model Context Protocol,模型上下文协议)2024年11月底由 Antbropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。 Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使AI模型与API无缝交互,而Al Agent是一个…

SCL语言两台电机正反转控制程序从选型、安装到调试全过程的详细步骤指南(下)

阶段三&#xff1a;PLC 编程 (SCL 语言)&#xff08;为了学会结构体和I/O映射可能看着有点复杂&#xff0c;多电机控制及维护好修改&#xff09; 程序结构思路&#xff1a; 1. 定义清晰的数据结构 (STRUCT) 来管理每台电机的所有变量&#xff08;输入、输出、状态、互锁条件&…