news 2026/7/17 19:23:13

Python数据可视化王者:Matplotlib从入门到精通

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据可视化王者:Matplotlib从入门到精通

数据可视化:Matplotlib 入门指南

摘要: 在数据分析的征途中,仅仅得到一堆冰冷的数字是远远不够的。如何将数据以直观、清晰的方式呈现出来,让隐藏在数据背后的故事一目了然?这就是数据可视化的魅力所在。本文将带你深入学习 Python 中最经典、最强大的数据可视化库——Matplotlib,从 HelloWorld 开始,逐步掌握折线图、散点图、柱状图等核心图表的绘制技巧,为你开启数据可视化的大门。


1. Matplotlib 之 HelloWorld

让我们从最基础的部分开始,揭开 Matplotlib 的神秘面纱。

1.1 什么是 Matplotlib?

简单来说,Matplotlib 是一个专门用于画二维图表的 Python 库

它的名字拆解开来,很好地揭示了其核心功能:

  • Mat: 源于Matrix(矩阵)。在数据科学中,数据通常以矩阵形式存在(如二维表格)。Matplotlib 擅长将这些数据转化为可视化图形。
  • Plot: 意为“画图”。
  • Lib: 代表Library(库)。

背景小知识:Matplotlib 的设计深受著名科学计算软件MATLAB的影响。因此,如果你有 MATLAB 使用经验,会发现 Matplotlib 的许多函数和概念倍感亲切。


1.2 为什么要学习 Matplotlib?

在数据分析全流程中,数据可视化是连接“枯燥数据”与“深刻洞见”的桥梁。它能帮助我们:

  1. 直观理解数据:人脑处理图形的速度远快于数字。一张优秀的图表能让你瞬间洞察数据的分布趋势、相关关系及异常点
  2. 辅助模型选择:通过可视化,我们可以更准确地判断数据特征,从而选择最合适的分析方法或机器学习模型。
  3. 遵循“奥卡姆剃刀原理”
    • 如无必要,勿增实体
    • 虽然 D3.js 或 Echarts 非常强大,但在 Python 生态内,直接在同一个环境下完成数据处理与绘图,能极大简化工作流,避免技术栈切换的成本。

1.3 实现一个简单的 Matplotlib 画图

话不多说,让我们编写代码,亲手绘制第一张图表:

importmatplotlib.pyplotasplt# 1. 准备数据x=[1,2,3,4,5]y=[10,20,15,25,30]# 2. 创建画布并绘图plt.plot(x,y)# 3. 设置基本信息plt.title("HelloWorld: My First Plot")# 标题plt.xlabel("X-Axis")# X 轴标签plt.ylabel("Y-Axis")# Y 轴标签# 4. 显示图表plt.show()

运行以上代码,你将看到一个窗口弹出一张简单的折线图。恭喜你,完成了Matplotlib的HelloWorld!

1.4 认识Matplotlib图像结构

一张Matplotlib图表,看似简单,实则由多个层次化的组件构成。理解其结构对于进行复杂的定制至关重要。

  • Figure (画布): 整个图像的“大画板”,是所有绘图元素的顶级容器。一个Figure可以包含一个或多个Axes。

  • Axes (绘图区/坐标系): 真正进行数据绘制的区域,包含了x轴(xaxis)、y轴(yaxis)、刻度(ticks)、标签(labels)以及我们绘制的图形本身。不要把它和“axis”(轴)混淆,一个Axes包含了两个(或三个,对于3D图)Axis对象。

1.5 拓展知识点:Matplotlib三层结构

从更专业的角度看,Matplotlib的架构可以分为三层,从底层到顶层分别是:

  1. 容器层 (Container Layer): 这是最外层的用户接口。我们平时接触最多的就是这一层,主要包括:

    • Canvas (画板层): 实际进行绘制的后端对象,例如FigureCanvasAgg,它知道如何将图像渲染成PNG文件。我们通常不需要直接操作它。

    • Figure (画布层): 我们上面提到的“大画板”,用来容纳和管理多个坐标系。

    • Axes (绘图区/坐标系): 核心绘图区域,数据的展示舞台。

  2. 辅助显示层 (Artist Layer): 这一层包含了所有你在图上能看到的元素,比如线条(Line2D)、文本(Text)、图例(Legend)、坐标轴(Axis)等。它们都是Artist的子类。我们调用plot()等函数时,实际上就是在创建和修改这些Artist对象。

  3. 图像层 (Primitive Layer): 这是Matplotlib的底层核心,负责处理图形的渲染和绘制,与具体的GUI工具包(如Tkinter, Qt)进行交互。

2 折线图(plot)与基础绘图功能

折线图是最基础也是最常用的图表之一,非常适合用来展示数据随某个连续变量(通常是时间)变化的趋势。

2.1 折线图绘制与图片保存

让我们来画一个更精致的折线图,并学习如何设置画布属性和保存图片。

importmatplotlib.pyplotasplt# 准备数据(模拟一周7天的气温变化,单位:℃)x=range(1,8)# x轴数据:周一到周日(用1-7表示)y=[18,20,19,22,21,23,24]# y轴数据:一周的温度# 1. 创建画布(设置画布大小和清晰度)# figsize设置画布大小为10x6英寸, dpi设置图像清晰度为80(数值越大越清晰)fig=plt.figure(figsize=(10,6),dpi=80)# 2. 绘制图形(折线图,可添加颜色、线型等参数,此处用默认设置)plt.plot(x,y)# 3. 保存图片到本地(需在plt.show()之前调用,否则保存为空图)# 可以保存为多种格式,如.png, .jpg, .svg, .pdf,推荐用.png(清晰度高、体积小)plt.savefig("./line_chart_temperature.png")# 4. 显示图形(弹出窗口展示绘制好的折线图)plt.show()

关键参数说明:

  • figsize: 一个元组,(宽度, 高度),单位是英寸。

  • dpi: Dots Per Inch,每英寸的点数,数值越高,图像越清晰,文件也越大。

2.2 中文显示问题解决

Matplotlib默认的字体不支持中文,直接在图中使用中文会显示为方框(□□□)。解决这个问题需要三步:安装中文字体 → 删除缓存 → 修改配置,以下是详细操作和最便捷的代码级解决方案。

以Windows和Linux系统为例:

  1. 安装字体: 下载你喜欢的中文字体(如“微软雅黑”、“思源黑体”)。

    • Windows: 双击字体文件(.ttf/.ttc),点击“安装”即可完成。

    • Ubuntu: 双击字体文件安装,或将其复制到/usr/share/fonts/目录下,然后执行sudo fc-cache -f -v刷新字体缓存。

  2. 删除matplotlib缓存文件:
    找到Matplotlib的缓存目录并删除其中的.json缓存文件(缓存会保存旧的字体配置,删除后重新运行代码即可加载新字体)。可以通过以下代码找到目录位置:import matplotlib print(matplotlib.get_cachedir())

  3. 在代码中指定字体:
    最推荐的方法是在代码中动态设置,这样你的代码在任何环境下都能正确运行,无需修改系统全局配置。

importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 假设你的字体文件路径(Windows系统微软雅黑默认路径如下,无需修改)my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc",size=12)# Windows专用# 准备数据(中文标签的x轴数据)x=["周一","周二","周三","周四","周五","周六","周日"]y=[18,20,19,22,21,23,24]# 一周气温数据# 创建画布plt.figure(figsize=(10,6))# 绘制折线图(x轴用1-7占位,后续替换为中文标签)plt.plot(range(1,8),y)# 设置x轴刻度标签,并应用中文字体(关键步骤)plt.xticks(range(1,8),x,fontproperties=my_font)# 设置x轴、y轴标签和标题,均应用中文字体plt.xlabel("星期",fontproperties=my_font)plt.ylabel("温度 (℃)",fontproperties=my_font)plt.title("未来一周气温变化图",fontproperties=my_font)# 显示图形plt.show()

2.3 多个坐标系显示 - plt.subplots()

当我们需要在一张大画布上画多个子图(比如同时展示正弦、余弦函数)时,面向对象的画图方法plt.subplots()就派上用场了。它能更好地控制每个子图的细节,比传统的plt.subplot()更简洁、更易维护。

importmatplotlib.pyplotaspltimportnumpyasnp# 创建一个1行2列的子图布局(nrows=行数,ncols=列数)# fig是整个画布对象, axes是一个包含两个Axes子图对象的numpy数组figure,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,5))# --- 在第一个子图(axes[0])上画正弦函数 ---x1=np.linspace(0,10,100)# 生成0到10之间的100个等距点(连续数据)y1=np.sin(x1)# 计算每个x1对应的正弦值axes[0].plot(x1,y1,color='blue',label='sin(x)')# 绘制正弦曲线,设置颜色和标签axes[0].set_title("Sine Wave")# 注意:面向对象方法用set_title()设置标题axes[0].set_xlabel("x")# 设置x轴标签axes[0].set_ylabel("sin(x)")# 设置y轴标签axes[0].legend()# 显示图例(对应plot中的label参数)axes[0].grid(True,linestyle='--',alpha=0.5)# 显示网格线,线型为虚线,透明度0.5# --- 在第二个子图(axes[1])上画余弦函数 ---x2=np.linspace(0,10,100)# 生成0到10之间的100个等距点y2=np.cos(x2)# 计算每个x2对应的余弦值axes[1].plot(x2,y2,color='red',label='cos(x)')# 绘制余弦曲线,设置颜色和标签axes[1].set_title("Cosine Wave")# 设置子图标题axes[1].set_xlabel("x")# 设置x轴标签axes[1].set_ylabel("cos(x)")# 设置y轴标签axes[1].legend()# 显示图例axes[1].grid(True,linestyle='--',alpha=0.5)# 显示网格线# 调整子图之间的间距(避免标签重叠)plt.tight_layout()# 展示图像plt.show()

2.4 折线图的应用场景

  • 展示事物或指标随时间的变化状况:如股票价格、气温变化、网站用户访问量、产品销量等。

  • 绘制各种数学函数图像:如正弦、余弦、指数函数、线性函数等,直观展示函数的变化特性。

3 常见图形种类及应用

除了折线图,Matplotlib还能绘制多种常用图表,不同图表对应不同的数据分析场景,掌握它们能让你的数据可视化更具针对性。

3.1 常见图形种类及意义

  • 折线图 (plot): 查看数据趋势(随连续变量的变化规律)。

  • 散点图 (scatter): 探索变量之间的关系或规律(如相关性)。

  • 柱状图 (bar): 进行不同类别数据的统计与对比(如不同产品的销量对比)。

  • 直方图 (histogram): 查看数据的分布状况(如学生成绩分布、电影时长分布)。

  • 饼图 (pie): 展示不同部分的占比(如各季度销售额占比、用户来源占比)。

3.2 散点图绘制 (scatter)

散点图用于展示两个变量之间的关系,每个点代表一个数据样本,通过点的分布可以直观判断两个变量是否存在相关性(正相关、负相关或无相关)。

importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体(解决中文显示问题)my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc",size=11)# 准备数据:假设我们有30个学生的身高和体重数据(模拟真实场景)height=[155,158,160,162,165,168,170,172,175,178,156,161,163,166,169,171,173,176,179,180,157,159,164,167,170,172,174,177,181,182]weight=[45,48,50,52,55,58,60,62,65,68,46,51,53,56,59,61,63,66,69,72,47,49,54,57,60,62,64,67,70,73]# 创建画布plt.figure(figsize=(10,6))# 绘制散点图(x=身高,y=体重,可设置点的大小、颜色、透明度)plt.scatter(height,weight,s=50,color='skyblue',alpha=0.7,edgecolors='black')# 设置标题和标签(应用中文字体)plt.title("学生身高与体重关系散点图",fontproperties=my_font)plt.xlabel("身高 (cm)",fontproperties=my_font)plt.ylabel("体重 (kg)",fontproperties=my_font)# 显示网格线(便于观察数据分布)plt.grid(True,linestyle='--',alpha=0.5)# 显示图形plt.show()

从上图可以初步判断,身高和体重可能存在正相关关系——身高越高,体重通常也越大。

4 柱状图 (bar)

柱状图非常适合比较不同类别的数据量,通过柱子的高度直观反映各类别数据的差异,常用于分类统计对比场景(如不同产品销量、不同地区收入、不同电影票房等)。

4.1 柱状图绘制

importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体(解决中文显示问题)my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")# 准备数据:中国电影票房总榜Top4(数据为模拟,贴合真实票房排名)movies=["战狼2","哪吒之魔童降世","流浪地球","复仇者联盟4"]box_office=[56.8,50.3,46.8,42.5]# 单位:亿元# 创建画布(设置大小,避免中文标签被截断)plt.figure(figsize=(10,6))# 绘制柱状图(x=电影名称,y=票房,width=柱子宽度,color=柱子颜色)plt.bar(movies,box_office,width=0.5,color=['red','orange','blue','gray'])# 设置标题和标签(应用中文字体)plt.title("中国电影票房总榜 Top 4",fontproperties=my_font,fontsize=14)plt.ylabel("票房(亿元)",fontproperties=my_font,fontsize=12)plt.xticks(fontproperties=my_font,fontsize=11)# 设置x轴刻度字体(电影名称)# 在柱子上方添加数值标签(直观显示票房数据)foriinrange(len(movies)):plt.text(i,box_office[i]+0.5,str(box_office[i])+"亿",ha='center',fontproperties=my_font)# ha='center'表示水平居中# 显示网格线(只显示y轴方向,更清晰)plt.grid(True,axis='y',linestyle='--',alpha=0.5)# 显示图形plt.show()

5 直方图 (histogram)

直方图是观察数据分布的神器,它与柱状图很像,但有本质区别,很多人容易混淆两者的用法。直方图专注于展示连续型数据的分布特征,而柱状图专注于离散类别的对比

5.1 直方图介绍

绘制直方图需要理解两个核心概念:

  • 组数 (bins): 在统计数据时,我们把连续的数据按照不同的范围分成几个组,分成的组的个数称为组数。

  • 组距: 每一组两个端点的差,即每组数据的范围宽度。

示例: 假设我们有一批学生身高数据,最高175.5cm,最矮150.5cm。如果我们想以5cm为组距来统计,那么应该分多少组?

求组数: (175.5 - 150.5) / 5 = 25 / 5 = 5 组。

这5组分别是:[150.5, 155.5), [155.5, 160.5), [160.5, 165.5), [165.5, 170.5), [170.5, 175.5]。

5.2 直方图与柱状图的对比

特征直方图 (Histogram)柱状图 (Bar Chart)
1. 目的展示连续型数据的分布比较离散类别数据的大小
2. X轴定量数据(连续的数值,如身高、时长)分类数据(类别标签,如电影名称、地区)
3. 柱子间隔柱子之间无间隔(因为数据连续,各组之间无缝衔接)柱子之间有间隔(因为类别独立,需区分不同类别)
4. 柱子宽度宽度可以不一致(代表不同组距,组距不同时宽度不同)宽度必须一致(保证类别对比的公平性)

5.3 直方图绘制

假设我们有一组电影的时长数据,我们想看看这些电影时长的分布情况(比如大多数电影的时长集中在哪个范围)。

importmatplotlib.pyplotaspltimportnumpyasnp# 随机生成100部电影的时长数据 (分钟),范围在60-180分钟之间(符合真实电影时长)np.random.seed(42)# 设置随机种子,保证每次运行生成的数据一致time=np.random.randint(60,180,100)# 计算组距和组数(组距设为15分钟,即每15分钟为一组)group_distance=15# 组距# 生成组数范围(从最小值到最大值+组距,步长为组距,确保包含所有数据)bins=range(min(time),max(time)+group_distance,group_distance)# 创建画布plt.figure(figsize=(10,6))# 绘制直方图(x=电影时长,bins=分组范围,color=柱子颜色,edgecolors=柱子边框颜色)plt.hist(time,bins=bins,color='lightgreen',edgecolors='black',alpha=0.7)# 设置标题和标签plt.xlabel("Movie Duration (minutes)",fontsize=12)plt.ylabel("Frequency (count)",fontsize=12)plt.title("Distribution of Movie Durations",fontsize=14)# 让x轴刻度与分组对齐(更直观展示每组的范围)plt.xticks(bins,rotation=45)# 显示网格线(只显示y轴,便于观察频次)plt.grid(True,axis='y',linestyle='--',alpha=0.5)# 显示图形plt.show()

从直方图可以看出,电影时长主要集中在哪个区间(比如120-135分钟),从而了解电影时长的整体分布特征。

6 饼图 (pie)

饼图用于展示各个部分占总体的百分比,适用于“整体-部分”关系的可视化场景(如各季度销售额占比、各部门人员占比、各产品营收占比等)。饼图的核心是“占比”,所有部分的百分比之和必须为100%。

importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体(解决中文显示问题)my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")# 准备数据:某公司年度销售额季度占比(四个季度占比之和为100%)quarters=["第一季度","第二季度","第三季度","第四季度"]sales=[25.5,30.2,22.3,22.0]# 各季度销售额占比(单位:%)# 创建画布(饼图建议用正方形画布,保证饼图为正圆)plt.figure(figsize=(8,8))# 绘制饼图(关键参数说明)# x: 各部分占比数据# labels: 各部分的标签(季度名称)# autopct: 用于在图上显示百分比,格式化字符串 '%1.2f%%' 表示保留2位小数并显示%# textprops: 设置标签和百分比的字体属性(应用中文字体)# colors: 自定义饼图颜色(可选)# explode: 突出显示某一部分(可选,此处不突出,设为(0,0,0,0))plt.pie(sales,labels=quarters,autopct='%1.2f%%',textprops={'fontproperties':my_font},colors=['#ff9999','#66b3ff','#99ff99','#ffcc99'],explode=(0,0.05,0,0))# 突出第二季度(轻微偏移)# 设置标题(应用中文字体)plt.title("年度销售额季度占比",fontproperties=my_font,fontsize=14)# 保证饼图是正圆(避免因画布比例导致饼图变形)plt.axis('equal')# 显示图形plt.show()

关键参数说明:

  • autopct='%1.2f%%': 格式化百分比显示,%1.2f表示浮点数保留2位小数,最后两个%%表示输出一个实际的%符号。

  • plt.axis('equal'): 必加参数,保证饼图为正圆,否则会因画布比例变成椭圆。

  • explode: 可选参数,用于突出某一部分(如示例中突出第二季度),参数长度与labels一致,数值越大,突出越明显。

7 核心图表总结

本文重点讲解了Matplotlib中5种核心图表的绘制方法、核心用途及关键要点,以下用表格形式进行汇总,方便快速查阅和记忆:

图表类型核心用途关键要点适用数据类型
折线图 (plot)展示数据随连续变量的变化趋势1. 用plt.plot()绘制;2. 可设置figsize、dpi调整画布;3. 中文需指定字体连续型数据(如时间、温度)
散点图 (scatter)探索两个变量之间的相关性1. 用plt.scatter()绘制;2. 可设置点的大小、颜色、透明度;3. 适合展示样本分布两个连续型变量(如身高&体重)
柱状图 (bar)对比不同类别的数据量差异1. 用plt.bar()绘制;2. 柱子宽度一致、有间隔;3. 可添加数值标签增强可读性离散类别+数值(如电影&票房)
直方图 (histogram)展示连续型数据的分布特征1. 用plt.hist()绘制;2. 需设置bins(组数/分组范围);3. 柱子无间隔单一连续型数据(如电影时长、成绩)
饼图 (pie)展示各部分占总体的百分比1. 用plt.pie()绘制;2. 需加plt.axis(‘equal’)保证正圆;3. autopct显示百分比占比数据(各部分和为100%)

总结:选择图表的核心原则是“贴合数据类型+匹配分析目的”,根据数据是连续型/离散型、分析需求是看趋势/对比/分布/占比,选择对应的图表即可。Matplotlib的核心是“灵活定制”,掌握基础绘制方法后,可通过调整参数让图表更美观、更具可读性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 19:22:40

Mac睡眠耗电问题深度分析与优化方案

1. Mac睡眠耗电问题概述作为一名长期使用MacBook Pro的开发者,我注意到一个困扰许多用户的问题:合盖睡眠后的异常电量消耗。我的M1 Pro机型在8小时睡眠后经常出现10-15%的电量下降,这显然不符合苹果官方宣称的"全天候待机"性能。通…

作者头像 李华
网站建设 2026/7/17 19:16:59

LoadingIndicators.WPF:8种WPF加载动画的终极指南

LoadingIndicators.WPF:8种WPF加载动画的终极指南 【免费下载链接】LoadingIndicators.WPF A collection of loading indicators for WPF 项目地址: https://gitcode.com/gh_mirrors/lo/LoadingIndicators.WPF LoadingIndicators.WPF是一个为WPF应用程序提供…

作者头像 李华
网站建设 2026/7/17 19:15:57

公司金融四大基石:投资回报、增长、风险与资本成本的价值分析框架

在投资股票、选择职业机会或评估商业项目时,很多人习惯凭直觉或追逐市场热点,但真正能穿越周期、持续创造回报的决策,往往建立在系统性的价值分析框架之上。《价值:公司金融的四大基石》这本书提炼了公司金融中最核心的四个原则—…

作者头像 李华
网站建设 2026/7/17 19:14:05

计算机毕业设计之基于Springboot的学业帮扶系统的设计与实现

摘要本研究聚焦高等教育质量提升背景下学业帮扶模式的数字化转型,设计并实现了一套基于Java语言、SpringBoot框架、Vue前端技术及MySQL数据库的学业帮扶系统。针对传统学业帮扶存在的覆盖面窄、时效性差、精准度低等问题,系统采用微服务架构设计&#xf…

作者头像 李华