尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python图形开发入门:从环境搭建到数据可视化实战

Python图形开发入门:从环境搭建到数据可视化实战 1. 内容整体设计与思路拆解1.1 为什么选择Python做图形开发图形开发这个词乍一听好像离入门很远实际上Python在这块的生态成熟得让人意外。我最早接触Python图形开发是想做一个数据可视化的工具当时在Excel里折腾了半天图表样式转头用Python写了几行代码就出图了那个效率对比太直观了。选Python做图形开发核心原因有三个。第一个是库的覆盖面极广从基础的matplotlib、PIL/Pillow到专业的OpenCV、pygame、turtle甚至3D方向的plotly、mayavi基本上你能想到的图形需求都有现成方案。第二个是语法表达力强同样的图形逻辑用C写可能要几十行Python里几行就能表达清楚试错成本低很多。第三个是社区活跃度高遇到问题搜一下基本都有答案这对新手来说太重要了图形开发里所谓的坑其实大部分都是社区已经趟平的。当然Python图形开发也有自身的短板性能上比不过C和Rust但这对于入门阶段完全够用。我个人的判断是你不需要一上来就学OpenGL、学着色器先把手头的数据、界面、图形需求用Python高效解决等真正遇到性能瓶颈了再往底层走也不迟。1.2 理解图形开发的实际需求很多人以为图形开发就是要做游戏引擎或者写3D渲染其实实践中90%的需求是两类一是数据可视化二是基础GUI界面。数据可视化是Python的强项matplotlib、seaborn、plotly这几个库就是为此而生的后面我会重点展开。GUI方面有tkinterPython自带、PyQt、PySide等方案入门可以先从tkinter开始。从搜索热词里也能看到大家关心的核心词集中在环境搭建、安装教程、画图、坐标轴这些具体问题上说明大部分人是想要一个能跑的、能出图的、能解决实际问题的路径。这篇文章就围绕这条路径展开从环境搭建、库安装到图形绘制每一步都给出可复现的操作和踩坑记录。2. 环境搭建Python安装与开发环境准备2.1 Python解释器的选择与安装步骤环境搭建这块我见的坑比写代码本身还多。很多人一上来就卡在装环境这一步装了删删了装浪费大量时间。这里先给一个明确的结论如果你是一个新手直接装Python 3.10或3.11的官方稳定版就行不要去找什么最新版或者绿色版。具体操作流程是这样的打开Python官网python.org找到Downloads页面选择对应你系统的安装包。Windows用户下载Windows installer64-bitmacOS用户下载macOS installer。双击安装包安装页面的第一屏会有一个非常关键的复选框——Add Python to PATH。这个必须勾上勾上这一步能省掉后面配置环境变量的一大堆麻烦。安装模式选择Install Now就行不需要自定义安装路径除非你的C盘实在没空间。装完后打开命令行Windows是cmd或PowerShellmacOS是Terminal输入python --version能正确输出版本号就说明安装成功。这里补充一个新手常见的困惑Python 2和Python 3的区分。2020年之后Python 2已经停止维护了现在所有的教程、库都是针对Python 3的你看到任何还在讲Python 2的内容直接跳过。2.2 为什么必须配置环境变量刚才说到PATH很多人不理解这是干什么的。简单说环境变量是操作系统用来查找可执行文件的路径列表。你在命令行输入python的时候系统会按照PATH里配置的路径去找python.exe找到了就能运行找不到就报python不是内部或外部命令。如果你安装Python的时候忘了勾选Add Python to PATH后面就有两种补救方案。方案一是重新运行安装包选择Modify把Add Python to PATH勾上。方案二是手动配置环境变量右键此电脑→属性→高级系统设置→环境变量在系统变量的Path里新建两条Python安装目录默认是C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\这个目录下的Scripts子目录也就是...\Python311\Scripts\为什么Scripts目录也要配因为后续用pip安装的第三方库其命令行工具都放在这里。比如装完matplotlib之后你可能需要用到其他命令行工具如果Scripts不在PATH里就会提示找不到命令。2.3 用虚拟环境隔离项目依赖环境搭建里还有一个非常推荐的习惯就是使用虚拟环境。虚拟环境可以理解成一个独立的Python运行空间A项目用了matplotlib 3.7B项目用了matplotlib 3.5两者互不干扰。没有虚拟环境的话所有库都装在全局版本冲突是迟早的事。我推荐的流程是这样# 在项目目录下创建虚拟环境 python -m venv venv # Windows激活虚拟环境 venv\Scripts\activate # macOS/Linux激活虚拟环境 source venv/bin/activate激活后命令行前缀会出现(venv)字样这时候你再用pip安装的所有库都会装到这个独立环境里。项目做完了用deactivate退出。实际操作中我见过很多人在这一步栽跟头忘记激活虚拟环境就直接pip install结果库装到全局去了。你可以在命令行里看一下当前python和pip的路径如果在虚拟环境里路径会指向项目目录下的venv文件夹这是一个很有效的验证方法。2.4 pip加速与第三方库安装pip是Python的包管理器安装第三方库全靠它。国内环境下原版pip源PyPI官方源经常慢到怀疑人生这个时候换一个镜像源就能立竿见影。# 临时指定镜像源安装 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple # 永久配置镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple镜像源的选择清华、阿里云、中科大都可以用我个人一直用清华的稳定性和更新速度都比较可靠。如果你做的项目和学术相关需要较新的包版本镜像源可能会有几天延迟这种情况可以直接从官方源装。3. 图形开发核心库选型指南3.1 matplotlib数据可视化的主力几乎所有Python图形开发的入门教程都会从matplotlib开始它算得上Python数据可视化的基石。matplotlib的强项是绘制静态图表包括折线图、柱状图、散点图、饼图、等高线图、3D图等功能非常全面。它的使用场景是数据分析、科研绘图、报表生成。matplotlib的设计哲学借鉴了MATLAB的绘图风格这对熟悉MATLAB的工程师很友好。底层架构上matplotlib的核心是Figure和Axes两个对象Figure是整张画布Axes是画布上的一幅子图。刚开始接触的时候你也可以不理会这些概念直接使用plt.plot这类快捷函数但后续画复杂图表的时候理解Figure和Axes的关系会让你的思路清晰很多。3.2 Pillow (PIL)图像处理的基础工具Pillow是Python图像处理的入门库支持打开、修改、保存各种格式的图像文件包括JPG、PNG、GIF、BMP等。它的常见用途是图像缩放、裁剪、旋转、滤镜、文字叠加等做图像批量处理脚本的时候非常好用。很多人容易把Pillow和matplotlib搞混其实两者的侧重完全不同。Pillow处理的是已有图片的像素级操作matplotlib处理的是从数据生成图片。3.3 OpenCV进入计算机视觉领域OpenCV的全称是Open Source Computer Vision Library在Python里的使用方式通常写作cv2。它的功能比Pillow强大得多支持人脸识别、物体检测、视频处理、图像变换等。OpenCV的安装需要注意一个问题直接用pip install opencv-python装的是社区维护的版本没有包含全部模块。如果需要视频处理等完整功能可能需要关注扩展模块的安装情况。作为入门我不建议刚装了matplotlib就去学OpenCV这会分散精力。等你把基础绘图练熟了再根据实际需求引入OpenCV会更高效。下面用表格对比一下这三个库的核心定位库名主要用途典型场景入门难度matplotlib数据可视化折线图、柱状图、科研绘图低Pillow图像处理裁剪缩放、格式转换、批量处理低OpenCV计算机视觉人脸识别、视频分析、图像检测中3.4 安装验证与版本检查库装完之后的验证环节很重要。很多人装了之后不验证直接开始敲代码然后报错的时候根本分不清是安装问题还是代码问题。正确的验证方式是这样的# 在命令行进入Python交互模式 python import matplotlib matplotlib.__version__ 3.8.0能正确输出版本号说明安装成功、导入路径正确。如果报ModuleNotFoundError: No module named matplotlib说明包没装上或者装到了另一个Python环境里。这里再次提醒如果你用了虚拟环境一定要先激活再安装否则很容易出现在项目里执行提示找不到模块的问题。我自己的习惯是写一个纯导入的测试文件把常用的图形库都导一遍跑通了再去写实际代码排查问题的范围就缩小了很多。4. 实战图形绘制从第一张图到完整方案4.1 第一张折线图最简代码跑通流程任何图形开发的入门都要先用最少的代码跑通一个完整流程建立正向反馈。第一步不追求好看不追求复杂只求从数据到图片的闭环。这里用最基础的matplotlib画一张折线图代码就几行import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 4, 1, 5, 3] plt.plot(x, y) plt.show()运行这段代码会弹出一个窗口显示一条连接这五个点的折线。这行plt.show()是关键它负责把图渲染到屏幕上。如果运行环境没有图形界面比如纯服务器可以换成plt.savefig(output.png)把图片保存到文件。第一张图跑通之后你的Python图形开发之路就算迈出第一步了。后面的所有技巧都是在这个基础上做增量。4.2 中文乱码问题的彻底解决新手用matplotlib遇到的第一个拦路虎大概率是中文乱码。默认情况下matplotlib不支持中文字体图表的标题、坐标轴标签只要是中文就会显示成一个个方框。这个问题其实是matplotlib的字体配置问题并不是无解的。核心思路是告诉matplotlib用哪个中文字体渲染文本。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示异常原理是font.sans-serif这个参数控制无衬线字体列表把中文字体排在最前面matplotlib在渲染中文的时候就会优先使用它。axes.unicode_minus设置为False是因为切换中文字体后负号偶尔会变成方块关掉unicode的负号渲染能解决这个问题。在不同操作系统上字体名称有差异WindowsSimHei黑体、Microsoft YaHei微软雅黑macOSPingFang SC、Hiragino Sans GBLinuxNoto Sans CJK SC、WenQuanYi Zen Hei如果平台的字体不确定有一个更稳定的方案直接用matplotlib.font_manager指定字体文件路径import matplotlib.pyplot as plt from matplotlib import font_manager # 指定系统中文字体文件的绝对路径 font_path /System/Library/Fonts/PingFang.ttc # 以macOS为例 font_manager.fontManager.addfont(font_path) plt.rcParams[font.family] font_manager.FontProperties(fnamefont_path).get_name()这段代码的逻辑是先把自己想要的字体文件加载进matplotlib的字体管理器然后把字体家族设置为这个加载进来的字体名称。好处是不依赖当前环境的字体名称坏处是需要知道字体文件的路径。4.3 布局与样式一个可以直接抄作业的模板入门之后画出来的图大概率是默认样式的横纵坐标轴、题目、图例都是matplotlib的出厂设置。这种图能用但不够专业。这里分享一个我常用的配置模板可以直接套用import matplotlib.pyplot as plt # 全局样式设置 plt.rcParams[figure.figsize] (10, 6) # 画布尺寸 plt.rcParams[font.sans-serif] [SimHei] # 中文字体 plt.rcParams[axes.unicode_minus] False # 负号 plt.rcParams[font.size] 12 # 全局字号 # 数据准备 x [1, 2, 3, 4, 5, 6] y1 [23, 45, 32, 67, 54, 78] y2 [15, 32, 44, 42, 63, 59] # 创建画布和坐标轴 fig, ax plt.subplots() # 绘制双折线 ax.plot(x, y1, markero, label2023年数据) ax.plot(x, y2, markers, linestyle--, label2024年数据) # 设置标题和标签 ax.set_title(两年数据对比) ax.set_xlabel(月份) ax.set_ylabel(销售额万元) # 网格、图例、布局 ax.grid(True, linestyle--, alpha0.6) ax.legend() fig.tight_layout() # 保存到文件 plt.savefig(comparison.png, dpi150)这套模板有几个值得注意的地方。figure.figsize控制的是画布比例的宽和高单位是英寸默认值是(6.4, 4.8)对于多数场景来说会显得小巧局促调到(10, 6)左右会明显大气一些。marker和linestyle让线形更丰富一张图里有多条线的时候通过不同标记和线型区分是基本素养。grid(True, linestyle--, alpha0.6)给图表加网格线透明度设置在0.5到0.6之间最好看太实会喧宾夺主太浅又起不到参考作用。fig.tight_layout()非常关键它会自动调整子图的边距避免标题或者标签被裁掉所有出图的人都应该习惯性加上这一行。dpi150代表保存图片的分辨率150dpi适合常规使用如果是要印刷或者放入论文建议300dpi否则会出现像素块。4.4 子图绘制的两种方式实际项目中经常需要在一张画布里展示多张图。matplotlib提供了两种方式一次性创建多个子图和动态追加子图。第一种方式plt.subplots适合一次规划好排列方式的情况import matplotlib.pyplot as plt fig, axes plt.subplots(2, 2, figsize(12, 8)) # axes是一个2x2的二维数组 # axes[0][0]表示左上角axes[0][1]表示右上角 # axes[1][0]表示左下角axes[1][1]表示右下角 x [1, 2, 3, 4, 5] # 左上角折线图 axes[0][0].plot(x, [v**2 for v in x]) axes[0][0].set_title(n^2) # 右上角柱状图 axes[0][1].bar([A, B, C], [3, 7, 5]) axes[0][1].set_title(bar) # 左下角散点图 axes[1][0].scatter(x, [2, 5, 3, 8, 6]) axes[1][0].set_title(scatter) # 右下角饼图 axes[1][1].pie([30, 40, 20, 10], labels[甲, 乙, 丙, 丁]) axes[1][1].set_title(pie) fig.tight_layout() plt.show()第二种方式plt.subplot动态追加适合循环中生成子图的场景import matplotlib.pyplot as plt fig plt.figure(figsize(12, 8)) for i in range(1, 7): ax fig.add_subplot(2, 3, i) # 2行3列第i个子图 ax.plot([1, 2, 3], [i, i*2, i*3]) ax.set_title(fplot {i}) fig.tight_layout() plt.show()这两种方式的差异主要体现在索引方式上一个通过数组索引直接定位一个通过编号追加。第一种方式对布局的掌控更细致第二种在循环中更顺手看你具体的使用场景。4.5 保存图片的格式选择与透明背景出图之后保存格式需要视用途而定。PNG格式应用最普遍支持透明背景压缩质量高。SVG格式是矢量图放大不失真适合需要后期在Illustrator或网页中反复调整的场景。PDF格式适合论文投稿很多期刊都要求PDF格式的图表。透明背景是很多人不知道的一个技巧# 保存为带透明背景的PNG plt.savefig(output.png, transparentTrue)这个参数在某些场景下很有用比如制作PPT插图时透明背景的图可以直接嵌入而不显示白色方块视觉效果会自然很多。4.6 坐标轴刻度过密的处理有一个搜索词出现频率很高python画图横坐标太密集。这种情况通常是横坐标标签过多或者是日期数据跨度大默认渲染下标签叠在一起成了一个黑疙瘩。解决思路有三种。第一种是旋转标签给标签一个倾斜角度利用斜向空间plt.xticks(rotation45)第二种是设置刻度步长让matplotlib不要每个点都画标签plt.xticks(range(0, len(x), 10)) # 每隔10个取一个刻度第三种更推荐用MaxNLocator自动控制刻度数量from matplotlib.ticker import MaxNLocator ax plt.gca() ax.xaxis.set_major_locator(MaxNLocator(nbins8))nbins8表示让它在横轴上最多显示8个左右的刻度具体的刻度位置由算法自动选择。我实际用下来这种方式的效果最稳定因为不管是5个数据点还是5000个数据点它都能自动适配。4.7 数据可视化进阶用样式与颜色提升专业感matplotlib的成功之处还在于它的样式系统。官方和社区提供了多款主题样式只需要一行代码就能切换整体风格# 查看所有可用样式 print(plt.style.available) # 使用某个样式 plt.style.use(ggplot) # 多个样式叠加 plt.style.use([seaborn-v0_8, ggplot])我常用的样式有ggplot颜值在线网格和背景配色非常经典适合直接作为默认选择。seaborn-v0_8也非常受欢迎是统计学出身的样式图表里的各个元素都经过了配色打磨。颜色方面手动指定的时候要注意搭配。同一系列的颜色深浅表达层级关系对比色表达对立关系。比如要画一条线突出某个年份可以用深色突出其他年份用浅灰色弱化信息层级一下子就清晰了。5. 进阶实战从数据到图形再进一步5.1 用Pillow做图像处理的入门操作matplotlib的主要能力是把数据变成图但图形开发还有一些场景是操作已有的图片。Pillow这个库场景非常高频比如给图片批量加水印、压缩图集、转换格式。from PIL import Image # 打开图片 img Image.open(input.jpg) # 缩放图片保持宽高比 new_img img.resize((400, 300)) # 直接指定宽高 # 裁剪图片左、上、右、下 cropped img.crop((100, 100, 500, 500)) # 旋转图片 rotated img.rotate(90, expandTrue) # 保存为PNG格式 new_img.save(output.png) # 批量转换格式 import os for fname in os.listdir(images): if fname.endswith(.jpg): im Image.open(os.path.join(images, fname)) im.save(os.path.join(images, fname.replace(.jpg, .png)))img.rotate(90, expandTrue)里的expand参数是个细节如果不加True旋转后的图片尺寸保持不变多出来的区域会被填成黑色或裁掉加了True画布会自适应旋转后的尺寸不会裁切内容。5.2 用OpenCV处理摄像头画面如果你想更进一步把摄像头画面实时显示成有标记的图形OpenCV是绕不开的选择。基础用法如下import cv2 # 打开摄像头0代表默认摄像头 cap cv2.VideoCapture(0) while True: # 读取一帧画面 ret, frame cap.read() if not ret: break # 转成灰度图 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 把灰度图转为彩色再拼接否则无法并排展示 gray_color cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) # 左右拼接原图和灰度图 combined cv2.hconcat([frame, gray_color]) # 显示画面 cv2.imshow(Camera Preview, combined) # 按q键退出 if cv2.waitKey(1) 0xFF ord(q): break # 释放资源 cap.release() cv2.destroyAllWindows()这几个API需要留意。cv2.cvtColor用来转换颜色空间OpenCV里BGR顺序和常规的RGB是反的这是一个经典易错点。cv2.hconcat横向拼接两张尺寸相同的图可以做一个原图-处理后的对比效果非常直观。cv2.waitKey(1)控制画面刷新频率参数是等待的毫秒数1表示每帧等待1毫秒参数过大会让画面变得卡顿。最后的cap.release()和cv2.destroyAllWindows()不能省否则摄像头资源得不到释放下次运行时可能报设备被占用。5.3 turtle库快速体验图形绘制的乐趣如果你想给初学者、孩子或者自己快速建立画图的感觉Python自带的turtle库是绝佳选择。它不需要安装直接用核心就是控制一支画笔在屏幕上移动适合练习循环和函数思维。import turtle t turtle.Turtle() t.speed(5) # 笔速 # 画一个正方形 for _ in range(4): t.forward(100) # 前进100像素 t.right(90) # 右转90度 turtle.done()turtle虽然看起来简单它实际上包含了图形开发里最基础的概念坐标、方向、画笔状态抬起/落下。我建议所有入门者都花时间玩一下turtle它会帮你建立对屏幕坐标系和绘图模式的直觉后面学matplotlib和OpenCV时很多概念就容易理解了。5.4 综合实战读取CSV数据并绘制多图报告数据可视化最常见的落地场景是把数据文件CSV、Excel等读进来解析成绘图数据然后输出图表。这里给一个可以直接用的综合案例使用Python内置的csv模块读取数据然后生成图表。import csv import matplotlib.pyplot as plt # 从CSV读取数据 dates, values [], [] with open(data.csv, moder, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: dates.append(row[date]) values.append(float(row[value])) # 绘制折线图 plt.figure(figsize(10, 5)) plt.plot(dates, values, markero, color#2196F3) # 旋转日期标签避免重叠 plt.xticks(rotation45) plt.title(每日数据趋势) plt.xlabel(日期) plt.ylabel(数值) plt.grid(True, linestyle--, alpha0.6) plt.tight_layout() plt.savefig(daily_trend.png, dpi150) plt.show()处理CSV时有两个细节一是encodingutf-8如果CSV文件是Excel导出的默认编码可能是gbk这时候会报错一个兼容方案是加上encodinggbk或者用errorsignore兜底二是float(row[value])做类型转换CSV读出来的所有字段默认都是字符串如果不转数值plot会直接报数据类型错误。6. 常见问题与排查技巧实录6.1 高频报错与解决方案速查表在实际编写图形代码的过程中有几个报错出现频率极高几乎每个新手都会碰到。这里整理成速查表报错信息原因解决方式ModuleNotFoundError: No module named matplotlib库未安装或装到其他环境pip install matplotlib确认虚拟环境已激活ImportError: DLL load failed依赖库缺失或版本冲突重装相关库确认Python位数32/64位中文显示为方框字体配置缺失设置rcParams[font.sans-serif]为中文字体ValueError: x and y must have same first dimensionx和y的长度不一致检查数据长度用len()确认弹出的图窗口一闪而过未调用plt.show()或脚本立即结束确认代码末尾有plt.show()x and y must have same first dimension是一个特别容易栽的坑。出现这个报错第一反应应该是检查你的两个列表长度是否一致。比如x有5个元素y只有4个plot就无法把数据一一对应。调试方法很简单分别打印两个列表的len()一眼就能定位问题。6.2 环境相关的坑版本、路径、编辑器环境相关的坑通常更隐蔽。第一个坑是多个Python版本并存。如果你的电脑里装了Python 3.9后又装了3.11命令行输入python可能指向的是旧版本而pip指向的是新版本导致用pip装了包但代码运行环境找不到。排查方法是在代码前先输出import sys; print(sys.executable)看看实际运行的是哪个解释器文件。第二个坑是编辑器的解释器选择。用VS Code或PyCharm时右下角会显示当前使用的解释器新手经常在这里选错。比如系统里有全局Python和虚拟环境的Python编辑器默认选了全局的那你项目里装的库它当然找不到。在VS Code里按CtrlShiftP输入Python: Select Interpreter选择带有venv路径的那个选项。第三个坑是路径中的中文和空格。如果项目路径里有中文或者空格某些旧版本的库会报编码或者路径异常。这是一个大概率事件最好的解决方式就是给项目文件夹起全英文字母的名字。6.3 图形界面与无界面环境很多人用Python跑服务是在服务器或者远程主机上这种环境通常没有显示器。在这种环境里matplotlib的plt.show()会直接报错或者挂起。解决办法是用plt.savefig()替代显示让图像直接落盘。import matplotlib matplotlib.use(Agg) # 使用非交互后端 import matplotlib.pyplot as plt plt.plot([1, 2, 3], [4, 5, 6]) plt.savefig(output.png)matplotlib.use(Agg)这句很关键它强制matplotlib使用Agg渲染器这个渲染器不需要显示窗口直接把图形渲染成图片文件。把它放在导入pyplot之前执行否则无效。类似的还有TkAgg使用Tkinter窗口、Qt5Agg使用Qt5窗口等后端分别对应不同的图形界面系统。6.4 性能问题绘图卡顿与大数据量优化图形绘制在数据量大的时候会出现明显的性能瓶颈。数据点有几十万甚至上百万个直接plot会让窗口卡死保存图片也要等很久。针对大数据量有几个实用的优化策略。第一个策略是抽样每隔N个点取一个这适合趋势性展示局部细节丢失可以接受。import numpy as np # 假设data是一个超长数组 sampled data[::10] # 每隔10个点取一个第二个策略是用setp关闭不需要的渲染特性比如散点图的边缘线和抗锯齿。import matplotlib.pyplot as plt # 关掉抗锯齿提升渲染速度 plt.scatter(x, y, edgecolorsface, linewidths0, antialiasedFalse)第三个策略也是我推荐的最优解使用plot的轻量模式用line的简化版渲染不启用图形任何附加效果。实测下来百万级数据点也能从几十秒降低到几秒。如果你的项目对性能要求高还有一个思路是换库用plotly这类基于Web渲染的库处理大数据可视化它利用浏览器的渲染能力性能远超matplotlib。6.5 调试技巧如何定位图形问题图形开发里有一种玄学时刻代码不报错但画出来的图就是不对。这里给几个定位问题的思路。第一拆图定位法。如果你一次画了多张图或者多个数据系列先注释掉大部分只留一组数据看是否正常。逐组放开发现哪一组放进去画面就出现问题就集中排查这一组的数据。第二数据值域检查法。图形不对有很多时候是数据本身问题比如有NaN缺失值或者Inf无穷值plot会画出一条断掉的线。你可以在绘图前先打印一下数据的min()和max()快速判断数据范围是否合理。第三版本对照法。如果升级了matplotlib或者其他库之后图突然变了找一个老版本的库环境中跑一下同样的代码看是否是兼容性问题。这种情况遇到过不少次尤其是从matplotlib 3.5升级到3.7之后一些默认样式发生了变化。7. 写在最后图形开发的学习路径建议7.1 我的个人学习路线复盘回看我接触Python图形开发的过程最有价值的一个判断就是以项目驱动学习。当时我手上有一批实验数据需要用图表达从最开始画简单的折线图到后面添加误差棒、多子图、自定义颜色映射每一步都是因为实际遇到了需求才去查资料、去解决、去记录。这种学法的收获远比照着一本厚教程从第一章翻到最后一章来得扎实。我给新手的建议是不要花太多时间看教程视频动手跑起来比什么都重要。从今天开始把matplotlib装好画一张你自己的数据折线图。哪怕只有5个点哪怕图很丑这个0到1的过程的意义远超你的想象。7.2 值得继续探索的方向图形开发的知识树往下延伸还有很多值得探索的方向。一是交互式图形用plotly或者bokeh做出支持缩放、悬停提示的图表适合做数据产品原型。二是动画用matplotlib.animation模块生成动态图在演示和教学场景中很有价值。三是Web端图形结合pyecharts、Flask搭一个在线数据可视化服务把图形能力通过网页呈现给使用者。四是深度学习方向的图形应用结合PyTorch或TensorFlow做图像分类、目标检测等这也对应了很多搜索词里提到的深度学习环境搭建需求。图形开发这个方向路子宽且深关键在于把基础打牢——环境搭建、基本绘图、数据准备、问题排查把这些掌握了后面的所有扩展都是在复利积累。希望这篇从环境搭建到实战图形绘制的记录能让你少走几步弯路多出几张漂亮的图。
返回列表