数据可视化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在数据分析全流程中数据可视化是连接“枯燥数据”与“深刻洞见”的桥梁。它能帮助我们直观理解数据人脑处理图形的速度远快于数字。一张优秀的图表能让你瞬间洞察数据的分布趋势、相关关系及异常点。辅助模型选择通过可视化我们可以更准确地判断数据特征从而选择最合适的分析方法或机器学习模型。遵循“奥卡姆剃刀原理”如无必要勿增实体。虽然 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的HelloWorld1.4 认识Matplotlib图像结构一张Matplotlib图表看似简单实则由多个层次化的组件构成。理解其结构对于进行复杂的定制至关重要。Figure (画布): 整个图像的“大画板”是所有绘图元素的顶级容器。一个Figure可以包含一个或多个Axes。Axes (绘图区/坐标系): 真正进行数据绘制的区域包含了x轴(xaxis)、y轴(yaxis)、刻度(ticks)、标签(labels)以及我们绘制的图形本身。不要把它和“axis”轴混淆一个Axes包含了两个或三个对于3D图Axis对象。1.5 拓展知识点Matplotlib三层结构从更专业的角度看Matplotlib的架构可以分为三层从底层到顶层分别是容器层 (Container Layer): 这是最外层的用户接口。我们平时接触最多的就是这一层主要包括Canvas (画板层): 实际进行绘制的后端对象例如FigureCanvasAgg它知道如何将图像渲染成PNG文件。我们通常不需要直接操作它。Figure (画布层): 我们上面提到的“大画板”用来容纳和管理多个坐标系。Axes (绘图区/坐标系): 核心绘图区域数据的展示舞台。辅助显示层 (Artist Layer): 这一层包含了所有你在图上能看到的元素比如线条(Line2D)、文本(Text)、图例(Legend)、坐标轴(Axis)等。它们都是Artist的子类。我们调用plot()等函数时实际上就是在创建和修改这些Artist对象。图像层 (Primitive Layer): 这是Matplotlib的底层核心负责处理图形的渲染和绘制与具体的GUI工具包如Tkinter, Qt进行交互。2 折线图(plot)与基础绘图功能折线图是最基础也是最常用的图表之一非常适合用来展示数据随某个连续变量通常是时间变化的趋势。2.1 折线图绘制与图片保存让我们来画一个更精致的折线图并学习如何设置画布属性和保存图片。importmatplotlib.pyplotasplt# 准备数据模拟一周7天的气温变化单位℃xrange(1,8)# x轴数据周一到周日用1-7表示y[18,20,19,22,21,23,24]# y轴数据一周的温度# 1. 创建画布设置画布大小和清晰度# figsize设置画布大小为10x6英寸, dpi设置图像清晰度为80数值越大越清晰figplt.figure(figsize(10,6),dpi80)# 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系统为例安装字体: 下载你喜欢的中文字体如“微软雅黑”、“思源黑体”。Windows: 双击字体文件(.ttf/.ttc)点击“安装”即可完成。Ubuntu: 双击字体文件安装或将其复制到/usr/share/fonts/目录下然后执行sudo fc-cache -f -v刷新字体缓存。删除matplotlib缓存文件:找到Matplotlib的缓存目录并删除其中的.json缓存文件缓存会保存旧的字体配置删除后重新运行代码即可加载新字体。可以通过以下代码找到目录位置import matplotlib print(matplotlib.get_cachedir())在代码中指定字体:最推荐的方法是在代码中动态设置这样你的代码在任何环境下都能正确运行无需修改系统全局配置。importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 假设你的字体文件路径Windows系统微软雅黑默认路径如下无需修改my_fontfont_manager.FontProperties(fnameC:/Windows/Fonts/msyh.ttc,size12)# 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,fontpropertiesmy_font)# 设置x轴、y轴标签和标题均应用中文字体plt.xlabel(星期,fontpropertiesmy_font)plt.ylabel(温度 (℃),fontpropertiesmy_font)plt.title(未来一周气温变化图,fontpropertiesmy_font)# 显示图形plt.show()2.3 多个坐标系显示 - plt.subplots()当我们需要在一张大画布上画多个子图比如同时展示正弦、余弦函数时面向对象的画图方法plt.subplots()就派上用场了。它能更好地控制每个子图的细节比传统的plt.subplot()更简洁、更易维护。importmatplotlib.pyplotaspltimportnumpyasnp# 创建一个1行2列的子图布局nrows行数ncols列数# fig是整个画布对象, axes是一个包含两个Axes子图对象的numpy数组figure,axesplt.subplots(nrows1,ncols2,figsize(12,5))# --- 在第一个子图(axes[0])上画正弦函数 ---x1np.linspace(0,10,100)# 生成0到10之间的100个等距点连续数据y1np.sin(x1)# 计算每个x1对应的正弦值axes[0].plot(x1,y1,colorblue,labelsin(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--,alpha0.5)# 显示网格线线型为虚线透明度0.5# --- 在第二个子图(axes[1])上画余弦函数 ---x2np.linspace(0,10,100)# 生成0到10之间的100个等距点y2np.cos(x2)# 计算每个x2对应的余弦值axes[1].plot(x2,y2,colorred,labelcos(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--,alpha0.5)# 显示网格线# 调整子图之间的间距避免标签重叠plt.tight_layout()# 展示图像plt.show()2.4 折线图的应用场景展示事物或指标随时间的变化状况如股票价格、气温变化、网站用户访问量、产品销量等。绘制各种数学函数图像如正弦、余弦、指数函数、线性函数等直观展示函数的变化特性。3 常见图形种类及应用除了折线图Matplotlib还能绘制多种常用图表不同图表对应不同的数据分析场景掌握它们能让你的数据可视化更具针对性。3.1 常见图形种类及意义折线图 (plot): 查看数据趋势随连续变量的变化规律。散点图 (scatter): 探索变量之间的关系或规律如相关性。柱状图 (bar): 进行不同类别数据的统计与对比如不同产品的销量对比。直方图 (histogram): 查看数据的分布状况如学生成绩分布、电影时长分布。饼图 (pie): 展示不同部分的占比如各季度销售额占比、用户来源占比。3.2 散点图绘制 (scatter)散点图用于展示两个变量之间的关系每个点代表一个数据样本通过点的分布可以直观判断两个变量是否存在相关性正相关、负相关或无相关。importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体解决中文显示问题my_fontfont_manager.FontProperties(fnameC:/Windows/Fonts/msyh.ttc,size11)# 准备数据假设我们有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,s50,colorskyblue,alpha0.7,edgecolorsblack)# 设置标题和标签应用中文字体plt.title(学生身高与体重关系散点图,fontpropertiesmy_font)plt.xlabel(身高 (cm),fontpropertiesmy_font)plt.ylabel(体重 (kg),fontpropertiesmy_font)# 显示网格线便于观察数据分布plt.grid(True,linestyle--,alpha0.5)# 显示图形plt.show()从上图可以初步判断身高和体重可能存在正相关关系——身高越高体重通常也越大。4 柱状图 (bar)柱状图非常适合比较不同类别的数据量通过柱子的高度直观反映各类别数据的差异常用于分类统计对比场景如不同产品销量、不同地区收入、不同电影票房等。4.1 柱状图绘制importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体解决中文显示问题my_fontfont_manager.FontProperties(fnameC:/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,width0.5,color[red,orange,blue,gray])# 设置标题和标签应用中文字体plt.title(中国电影票房总榜 Top 4,fontpropertiesmy_font,fontsize14)plt.ylabel(票房亿元,fontpropertiesmy_font,fontsize12)plt.xticks(fontpropertiesmy_font,fontsize11)# 设置x轴刻度字体电影名称# 在柱子上方添加数值标签直观显示票房数据foriinrange(len(movies)):plt.text(i,box_office[i]0.5,str(box_office[i])亿,hacenter,fontpropertiesmy_font)# hacenter表示水平居中# 显示网格线只显示y轴方向更清晰plt.grid(True,axisy,linestyle--,alpha0.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)# 设置随机种子保证每次运行生成的数据一致timenp.random.randint(60,180,100)# 计算组距和组数组距设为15分钟即每15分钟为一组group_distance15# 组距# 生成组数范围从最小值到最大值组距步长为组距确保包含所有数据binsrange(min(time),max(time)group_distance,group_distance)# 创建画布plt.figure(figsize(10,6))# 绘制直方图x电影时长bins分组范围color柱子颜色edgecolors柱子边框颜色plt.hist(time,binsbins,colorlightgreen,edgecolorsblack,alpha0.7)# 设置标题和标签plt.xlabel(Movie Duration (minutes),fontsize12)plt.ylabel(Frequency (count),fontsize12)plt.title(Distribution of Movie Durations,fontsize14)# 让x轴刻度与分组对齐更直观展示每组的范围plt.xticks(bins,rotation45)# 显示网格线只显示y轴便于观察频次plt.grid(True,axisy,linestyle--,alpha0.5)# 显示图形plt.show()从直方图可以看出电影时长主要集中在哪个区间比如120-135分钟从而了解电影时长的整体分布特征。6 饼图 (pie)饼图用于展示各个部分占总体的百分比适用于“整体-部分”关系的可视化场景如各季度销售额占比、各部门人员占比、各产品营收占比等。饼图的核心是“占比”所有部分的百分比之和必须为100%。importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# 设置中文字体解决中文显示问题my_fontfont_manager.FontProperties(fnameC:/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,labelsquarters,autopct%1.2f%%,textprops{fontproperties:my_font},colors[#ff9999,#66b3ff,#99ff99,#ffcc99],explode(0,0.05,0,0))# 突出第二季度轻微偏移# 设置标题应用中文字体plt.title(年度销售额季度占比,fontpropertiesmy_font,fontsize14)# 保证饼图是正圆避免因画布比例导致饼图变形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的核心是“灵活定制”掌握基础绘制方法后可通过调整参数让图表更美观、更具可读性。