Python Matplotlib散点图实战:从数据到专业可视化图表

张开发
2026/6/6 5:35:28 15 分钟阅读

分享文章

Python Matplotlib散点图实战:从数据到专业可视化图表
1. 项目概述如果你刚开始接触Python数据分析或者已经用了一段时间Pandas处理表格但总觉得把数据画成图这一步有点“卡壳”那今天这篇内容就是为你准备的。数据可视化不是数据分析的“选修课”而是“必修课”。一堆数字躺在表格里你可能看不出什么门道但一旦把它们变成散点图、折线图隐藏在数据背后的故事——比如趋势、异常点、集群关系——就会立刻浮现出来。在众多图表类型里散点图Scatter Plot是我个人认为最“朴实无华”但又最“直击要害”的一种。它不花哨就是简单地把每个数据点画在二维坐标系上横轴一个变量纵轴一个变量但恰恰是这种简单让它成为探索两个变量之间是否存在关联比如距离越远温度是否越低的首选工具。这次我们不谈复杂的理论直接上手。我会用一个非常具体的天文学例子绘制离地球最近的三颗恒星的距离与表面温度关系图。选择这个例子一是数据量小便于理解每一步操作二是它有明确的物理背景你能直观感受到可视化如何帮助我们理解“距离”和“温度”这两个看似独立的维度之间可能存在的联系。整个流程将完全基于Python的Matplotlib库并辅以Pandas和NumPy进行数据操作。即使你之前没怎么用过Matplotlib跟着走一遍你也能掌握从安装库、准备数据、绘制基础图形到添加标题、坐标轴、图例再到调整点的大小颜色、保存输出等一整套“组合拳”。更重要的是我会分享那些官方文档里不会写但在实际项目中一定会遇到的“坑”和技巧比如如何避免图形元素重叠、怎么选择合适的数据标记marker以及让图表在报告或论文中显得更专业的几个小细节。2. 环境准备与核心库解析在开始写代码之前确保你的Python环境已经就绪。我强烈建议使用Anaconda发行版它集成了数据科学常用的绝大多数库能省去大量手动安装和解决依赖冲突的麻烦。如果你习惯用pip也完全没问题。2.1 库的安装与导入打开你的终端Windows上是CMD或PowerShellmacOS/Linux上是Terminal使用以下命令安装我们所需的三个核心库pip install matplotlib pandas numpy安装完成后在你的Python脚本或Jupyter Notebook的开头用这三行代码导入它们。给库起一个简短的别名是业内的通用做法能极大提高代码的书写和阅读效率。import matplotlib.pyplot as plt import pandas as pd import numpy as npmatplotlib.pyplot(别名plt): 这是Matplotlib的绘图接口。你可以把它想象成一支“智能画笔”我们后续所有关于创建图形、画线、描点的指令几乎都是通过调用plt或者它返回的ax对象的方法来完成的。为什么不直接import matplotlib因为pyplot模块提供了一个更接近MATLAB风格的、基于状态的接口对新手更友好。pandas(别名pd): 数据处理的瑞士军刀。虽然我们本次示例数据很简单直接用了列表但在真实项目中你的数据大概率来自CSV、Excel或数据库。pd能让你用pd.read_csv(‘data.csv’)这样一行代码轻松读入并以DataFrame一种强大的二维表格结构进行操作比如筛选、分组、计算统计量等为绘图做好数据准备。numpy(别名np): Python科学计算的基础包提供了高性能的多维数组对象。很多数学运算包括Matplotlib底层的一些计算都依赖于NumPy数组。即使你暂时用不到它的复杂功能导入它也是一个好习惯。注意有些在线教程可能会教你from matplotlib import *这种通配符导入方式虽然省事但极易引起命名冲突比如你自定义的函数名和库里的函数名重名不利于代码的长期维护和他人阅读。坚持使用import ... as ...是专业和最佳实践。2.2 理解Matplotlib的两种绘图接口这是很多初学者会困惑的地方。Matplotlib提供了两种主要的绘图方式“pyplotplt接口”和“面向对象OO接口”。Pyplot接口状态机模式: 它维护一个“当前图形figure”和“当前坐标轴axes”的概念。你调用plt.scatter(x, y)它就在“当前”的坐标轴上画图。这种方式写起来快适合交互式环境和简单的脚本。但当你需要绘制包含多个子图的复杂图表时控制起来就不那么直观了。面向对象接口OO模式: 这也是我们本次教程主要采用的方式。我们显式地创建图形figure和坐标轴axes对象然后在特定的axes对象上调用方法。例如fig, ax plt.subplots() # 创建一个图形和一个坐标轴 ax.scatter(x, y) # 在这个特定的坐标轴ax上画散点图 ax.set_xlabel(‘Distance’) # 为这个坐标轴设置x轴标签这种方式逻辑更清晰尤其适合构建复杂的、多子图的仪表板。你可以把fig想象成一张画布Canvasax是画布上的一个子图Subplot。一张画布上可以放置多个子图。我们通过ax这个对象来精细控制某一个子图的所有属性。在接下来的实操中你会看到我们如何用fig, ax plt.subplots()起步然后所有操作都基于ax进行。这虽然比直接plt.scatter()多写几个字母但能让你真正理解图表的构成是迈向高级可视化的关键一步。3. 数据准备与理解任何可视化项目的第一步永远不是打开绘图工具而是理解你的数据。我们这次要探索一个有趣的天文学问题恒星离我们越远它的表面温度有规律可循吗当然仅凭三颗星的数据不可能得出科学结论但这足以演示流程。3.1 数据来源与含义示例数据来源于公开的天文资料包含了离地球最近的三颗恒星比邻星Proxima Centauri: 距离约4.2光年表面温度约2883开尔文K。半人马座α星AAlpha Centauri A: 距离约4.3光年表面温度约5753K。半人马座α星BAlpha Centauri B: 距离约5.9光年表面温度约3134K。在代码中我们用两个Python列表来存储这些数据lightyears [4.2, 4.3, 5.9] # 距离单位光年 temp [2883, 5753, 3134] # 温度单位开尔文这里有一个非常重要的细节两个列表的长度必须严格一致并且顺序对应。即lightyears[0]和temp[0]共同代表比邻星的数据。如果顺序错乱图表将传达完全错误的信息。在真实项目中数据通常存储在pandas DataFrame中通过列名来关联能有效避免这种错误。3.2 从列表到DataFrame进阶数据管理虽然本次用列表足够但为了展示更通用的工作流我们可以用Pandas将其转化为DataFrameimport pandas as pd data pd.DataFrame({ ‘star_name‘: [‘Proxima Centauri‘, ‘Alpha Centauri A‘, ‘Alpha Centauri B‘], ‘distance_ly‘: [4.2, 4.3, 5.9], ‘temperature_K‘: [2883, 5753, 3134] }) print(data)输出会是一个整洁的表格star_name distance_ly temperature_K 0 Proxima Centauri 4.2 2883 1 Alpha Centauri A 4.3 5753 2 Alpha Centauri B 5.9 3134这样做的好处是数据自描述性列名清晰表达了含义和单位。操作方便后续可以用data[‘distance_ly‘]和data[‘temperature_K‘]来提取数据意图更明确。易于扩展如果需要新增一颗恒星只需在字典里添加一行或者从文件读取。在接下来的绘图部分为了和原始示例保持一致我们仍将使用lightyears和temp这两个列表。但请记住在实际工作中DataFrame是你的好朋友。4. 基础散点图绘制实战现在让我们进入核心环节——绘图。我们将一步步构建图表并解释每一行代码的作用。4.1 创建画布与坐标轴一切始于plt.subplots()函数。这是创建图形和坐标轴最标准的方式。fig, ax plt.subplots(figsize(8, 6)) # 创建图形(fig)和坐标轴(ax)fig: 代表整个图形窗口或画布。你可以通过它设置图形级别属性如整体尺寸、背景色、保存图形等。ax: 代表图形中的一个坐标轴子图。我们在这个ax上绘制具体的图表内容。figsize(8, 6): 这是一个关键参数以英寸为单位指定图形的宽和高。(8,6)是一个比较通用的尺寸适合在屏幕上看也适合嵌入文档。你可以根据输出需要调整例如做海报用(12, 8)做窄栏插图用(5, 4)。4.2 绘制散点有了坐标轴ax就可以调用scatter方法绘制散点了。scatter_plot ax.scatter(lightyears, temp)lightyears: 作为X轴数据自变量通常放在前面。temp: 作为Y轴数据因变量。scatter_plot: 这个方法的返回值是一个PathCollection对象。我们把它赋值给一个变量这里叫scatter_plot有什么用呢这个对象包含了所有散点的集合信息后续如果我们想为这些点添加图例或者单独修改其属性就需要用到这个对象。这是一个容易忽略但很重要的点。执行完这行内存中已经生成了一张图但我们需要一个命令来把它显示出来。plt.show()在Jupyter Notebook中这行代码会直接在单元格下方输出图形。在脚本中它会弹出一个图形窗口。此时你应该能看到一个非常基础的散点图横轴是4.2到5.9纵轴是2800到5800图上有三个点。但它缺少几乎所有必要的上下文信息我们不知道坐标轴代表什么不知道点对应哪颗星图表也没有标题。这样的图是“不合格”的。4.3 添加图表元素让图表“会说话”一个好的可视化应该做到“不言自明”。我们需要添加以下元素# 设置标题和坐标轴标签 ax.set_title(‘Distance vs. Temperature of Nearest Stars‘, fontsize14, fontweight‘bold‘) ax.set_xlabel(‘Distance from Earth (Light Years)‘, fontsize12) ax.set_ylabel(‘Surface Temperature (K)‘, fontsize12) # 添加网格线便于读者更精确地读取数据点位置 ax.grid(True, linestyle‘--‘, alpha0.6) # alpha控制透明度让网格线不那么突兀 # 再次显示图形 plt.show()set_title,set_xlabel,set_ylabel: 这些方法的作用一目了然。fontsize和fontweight参数用于调整字体样式让重点更突出。grid(True): 添加网格线。linestyle‘--‘设置为虚线alpha0.6设置透明度为60%这样网格线既能辅助读图又不会喧宾夺主遮盖数据点。现在图表看起来专业多了。但我们仍然无法区分哪个点对应哪颗星。4.4 个性化数据点与添加图例为了区分数据点我们可以从视觉属性上下功夫颜色color、大小size、形状marker。# 为每颗星定义不同的颜色和标记 colors [‘red‘, ‘green‘, ‘blue‘] markers [‘o‘, ‘s‘, ‘^‘] # 圆形方形上三角 star_names [‘Proxima Cen‘, ‘Alpha Cen A‘, ‘Alpha Cen B‘] # 这次我们用一个循环来绘制以便为每个点单独设置属性并创建图例句柄 handles [] # 用于存放图例的句柄 for i in range(len(lightyears)): # 每次循环绘制一个点s100设置点的大小label设置该系列的标签 scatter ax.scatter(lightyears[i], temp[i], ccolors[i], markermarkers[i], s100, labelstar_names[i], edgecolors‘black‘, linewidth0.5) handles.append(scatter) # 将这次绘制的散点对象存入列表 # 重新设置标题和标签如果之前没设置的话 ax.set_title(‘Distance vs. Temperature of Nearest Stars‘, fontsize14, fontweight‘bold‘) ax.set_xlabel(‘Distance from Earth (Light Years)‘, fontsize12) ax.set_ylabel(‘Surface Temperature (K)‘, fontsize12) ax.grid(True, linestyle‘--‘, alpha0.6) # 添加图例 ax.legend(handleshandles, title‘Star Name‘, loc‘best‘, fontsize10) plt.show()关键点解析循环绘制当每个点需要不同的样式时逐个绘制比一次性传入所有数据更灵活。scatter方法可以接受单个数值作为x,y,c,s的参数。参数cvscolor在scatter中通常使用c来指定颜色。它可以是一个颜色字符串如‘red‘也可以是一个与数据点等长的颜色列表或数值序列用于颜色映射。参数s指定点的大小。可以是一个标量所有点一样大也可以是一个序列每个点不同大小。这里统一设为100。参数edgecolors和linewidth给数据点添加黑色边框并设置边框粗细。这能让点在浅色背景下更清晰尤其是在彩色打印时。图例Legendax.legend()会自动从带有label参数的图形元素中收集信息。因为我们是在循环中分别绘制的所以我们将每次生成的scatter对象存入handles列表然后在legend()中通过handleshandles显式指定。loc‘best‘让Matplotlib自动选择一个不太遮挡数据的位置。现在你的图表应该拥有三个颜色、形状各异且带有清晰图例的数据点了。这已经是一张可以放入报告的基础散点图。5. 高级定制与美化技巧基础图表能传达信息但精心美化的图表能更有效地吸引注意力并提升可读性。下面介绍几个实用的高级技巧。5.1 调整坐标轴范围与刻度有时默认的坐标轴范围可能不是最优的比如点都挤在角落或者边缘留白太多。我们可以手动设置。# 设置X轴和Y轴的显示范围 ax.set_xlim(4.0, 6.5) # X轴从4.0显示到6.5 ax.set_ylim(2500, 6200) # Y轴从2500显示到6200 # 自定义刻度标签例如想让Y轴刻度以500为间隔 from matplotlib.ticker import MultipleLocator ax.yaxis.set_major_locator(MultipleLocator(500)) # 主刻度每500一个 ax.xaxis.set_major_locator(MultipleLocator(0.5)) # X轴主刻度每0.5光年一个set_xlim和set_ylim让你能完全控制图表展示的数据窗口。合理设置范围可以消除无关空白让数据主体更突出。5.2 使用颜色映射Colormap表示第三个维度散点图本质是展示两个变量X, Y的关系。但如果我想同时表达第三个变量比如恒星的质量或半径呢一个强大的技巧是利用点的颜色深浅或大小来表示这第三个维度。假设我们有一个表示恒星相对亮度的列表luminosity [0.0017, 1.519, 0.500]。我们可以用颜色来编码它luminosity [0.0017, 1.519, 0.500] # 相对太阳亮度 # 一次性绘制所有点c参数传入第三个变量cmap指定颜色映射方案 sc ax.scatter(lightyears, temp, cluminosity, s150, cmap‘viridis‘, edgecolors‘black‘, linewidth0.5) # 添加颜色条(Colorbar)用来解释颜色映射的数值含义 cbar plt.colorbar(sc, axax) cbar.set_label(‘Relative Luminosity (Sun1)‘, fontsize11)cluminosity: 这里c参数不再是一个颜色列表而是一个数值列表。Matplotlib会根据这些数值在指定的颜色映射cmap中为其分配颜色。cmap‘viridis‘:viridis是一种感知均匀的色图它在黑白打印和色盲辨识上都有较好表现是科学可视化的推荐选择。其他常见的有plasma,summer,coolwarm等。plt.colorbar(): 根据散点集合sc创建颜色条。axax参数指定颜色条关联到哪个坐标轴。现在点的颜色从暗到亮代表了亮度从小到大的变化。读者一眼就能看出温度最高绿色点的Alpha Cen A也是亮度最大的。这是散点图进阶用法中最有价值的一种。5.3 添加数据标签与注释对于关键的数据点我们可能希望直接在其旁边标注名称或数值。# 在刚才的散点图基础上为每个点添加文本标签 for i, (x, y, name) in enumerate(zip(lightyears, temp, star_names)): # 使用text函数添加标签ha和va控制水平/垂直对齐方式 # xytext是相对于数据点的偏移量textcoords定义了偏移量的坐标系这里是‘offset points‘即偏移点数 ax.annotate(name, xy(x, y), xytext(5, 5), textcoords‘offset points‘, ha‘left‘, va‘bottom‘, fontsize9, bboxdict(boxstyle‘round,pad0.3‘, facecolor‘wheat‘, alpha0.7))ax.annotate(): 添加注释的强大工具。xy(x, y): 箭头指向的数据点坐标。xytext(5, 5): 文本位置相对于xy的偏移量5个点。bbox: 给文本添加一个背景框boxstyle设置圆角facecolor设置背景色alpha设置透明度这能让标签在复杂的背景中更易读。实操心得添加太多标签会导致图表杂乱。一个折中的办法是只标注最重要的或需要特别说明的点。也可以尝试通过调整xytext的偏移方向让标签错落有致避免重叠。5.4 整体样式美化使用Seaborn风格与自定义字体Matplotlib的默认样式比较朴素。我们可以一键切换到更美观的样式或者进行深度自定义。# 方法1使用内置样式推荐快速美化 plt.style.use(‘seaborn-v0_8-whitegrid‘) # 使用seaborn风格的白色网格背景 # 其他流行样式还有 ‘ggplot‘, ‘fivethirtyeight‘, ‘dark_background‘等 # 在应用样式后重新创建图形和绘图样式需在创建figure前设置 fig, ax plt.subplots(figsize(9, 6)) # ... [重新执行绘图代码] ... # 方法2深度自定义RC参数 plt.rcParams.update({ ‘font.family‘: ‘sans-serif‘, # 使用无衬线字体如Arial ‘font.sans-serif‘: [‘DejaVu Sans‘, ‘Arial‘], # 字体优先级 ‘axes.labelsize‘: 12, ‘axes.titlesize‘: 14, ‘xtick.labelsize‘: 10, ‘ytick.labelsize‘: 10, ‘legend.fontsize‘: 10, ‘figure.titlesize‘: 16 })使用plt.style.use()能瞬间改变图表的所有视觉元素颜色、网格、背景、字体大小等是提升图表美观度的最快途径。而修改rcParams则提供了像素级的控制能力。6. 完整代码整合与输出让我们将以上所有步骤整合成一个完整、可运行的脚本并加入图形保存功能。# -*- coding: utf-8 -*- 完整散点图绘制示例离地球最近恒星的距离-温度关系 import matplotlib.pyplot as plt import pandas as pd import numpy as np # 1. 设置中文字体如果需要显示中文标签 # plt.rcParams[‘font.sans-serif‘] [‘SimHei‘, ‘Microsoft YaHei‘] # Windows # plt.rcParams[‘font.sans-serif‘] [‘PingFang SC‘, ‘Heiti SC‘] # macOS # plt.rcParams[‘axes.unicode_minus‘] False # 正确显示负号 # 2. 准备数据 star_data { ‘name‘: [‘Proxima Centauri‘, ‘Alpha Centauri A‘, ‘Alpha Centauri B‘], ‘distance_ly‘: [4.2, 4.3, 5.9], ‘temp_K‘: [2883, 5753, 3134], ‘luminosity‘: [0.0017, 1.519, 0.500] } df pd.DataFrame(star_data) # 使用DataFrame管理数据更规范 # 3. 创建图形和坐标轴并应用美观样式 plt.style.use(‘seaborn-v0_8-whitegrid‘) fig, ax plt.subplots(figsize(10, 7)) # 4. 绘制散点图用颜色表示亮度第三个维度 # 注意这里我们一次性绘制用c参数映射亮度数据 scatter ax.scatter(df[‘distance_ly‘], df[‘temp_K‘], cdf[‘luminosity‘], s200, # s是点的大小 cmap‘plasma‘, alpha0.8, # plasma色图80%透明度 edgecolors‘black‘, linewidth1.2) # 5. 添加颜色条 cbar plt.colorbar(scatter, axax, pad0.02) # pad控制颜色条与主图的间距 cbar.set_label(‘Relative Luminosity (Sun 1)‘, fontsize11) # 6. 为每个点添加数据标签 for idx, row in df.iterrows(): ax.annotate(row[‘name‘], xy(row[‘distance_ly‘], row[‘temp_K‘]), xytext(8, 8), textcoords‘offset points‘, fontsize9, fontweight‘medium‘, bboxdict(boxstyle‘round,pad0.4‘, facecolor‘lightyellow‘, alpha0.7, edgecolor‘gray‘)) # 7. 设置坐标轴标签和标题 ax.set_xlabel(‘Distance from Earth (Light Years)‘, fontsize13, fontweight‘bold‘) ax.set_ylabel(‘Surface Temperature (Kelvin)‘, fontsize13, fontweight‘bold‘) ax.set_title(‘The Nearest Stars: Distance, Temperature, and Luminosity‘, fontsize15, fontweight‘bold‘, pad15) # 8. 优化坐标轴刻度 ax.set_xlim(4.0, 6.5) ax.set_ylim(2500, 6200) ax.xaxis.set_major_locator(plt.MultipleLocator(0.5)) ax.yaxis.set_major_locator(plt.MultipleLocator(500)) # 9. 添加网格样式已由seaborn-whitegrid提供此处可微调 ax.grid(True, which‘major‘, linestyle‘-‘, linewidth0.7, alpha0.6) ax.grid(True, which‘minor‘, linestyle‘:‘, linewidth0.5, alpha0.4) ax.minorticks_on() # 开启次要刻度 # 10. 调整图形布局确保元素不重叠 plt.tight_layout() # 11. 显示图形 plt.show() # 12. 保存图形到文件高分辨率适合出版或报告 save_path ‘nearest_stars_scatter_plot.png‘ fig.savefig(save_path, dpi300, bbox_inches‘tight‘, facecolor‘white‘, edgecolor‘none‘) print(f“图表已保存至: {save_path}“)代码关键点总结数据容器使用pandas DataFrame管理数据结构清晰易于维护和扩展。样式先行在创建figure之前调用plt.style.use()确保样式生效。三维信息通过cdf[‘luminosity‘]和cmap将第三个数据维度亮度视觉化。细节打磨alpha参数控制透明度防止点重叠时被完全遮盖edgecolors和linewidth让点轮廓清晰annotate添加了带背景框的标签。布局与保存plt.tight_layout()自动调整子图参数使标签、标题等不重叠。savefig的dpi300确保打印清晰度bbox_inches‘tight‘裁剪图形周围多余的白边。运行这段代码你将得到一张信息丰富、可直接用于专业报告或演示的散点图。7. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到下面这些问题。这里是我总结的“避坑指南”。7.1 图形不显示或显示异常问题在脚本中写了plt.scatter()但没有任何窗口弹出。原因与解决在非交互式环境如纯Python脚本中需要调用plt.show()来阻塞程序并显示图形。在Jupyter Notebook中通常使用%matplotlib inline魔术命令图形会直接嵌入在单元格下方输出。问题图形窗口一闪而过。原因与解决脚本执行完毕窗口随之关闭。在plt.show()之后添加input(“按回车键退出...”)可以保持窗口。或者在脚本开头使用plt.ion()开启交互模式但更推荐使用plt.show()。问题中文标签显示为方框□□□。原因与解决Matplotlib默认字体不包含中文字形。需要手动指定中文字体如前面代码注释所示。下载并指定一个系统中存在的中文字体文件路径是更可靠的方法。7.2 数据点样式与预期不符问题想给每个点不同的颜色但c参数传列表后所有点颜色一样。排查检查c参数传入的列表长度是否与数据点数量一致。确保你是在循环内为每个点单独设置c或者使用scatter(x, y, ccolor_list)一次性传入一个颜色列表而非单个颜色字符串。问题点的大小s设置无效点都很大或很小。排查s参数的单位是“点的面积的像素值”。s100是一个中等大小。如果你传入的列表值差异不大如[99,100,101]视觉上很难区分。尝试将数值放大如s[100, 400, 900]或者使用公式s scale_factor * data_value**2来让面积与数值成比例。问题颜色映射cmap看起来很奇怪或者颜色条colorbar不显示。排查首先确认scatter()函数返回的对象如sc被传递给了plt.colorbar(sc, axax)。其次检查c参数传入的是数值型数据int, float而不是字符串。字符串会导致分类颜色映射行为不同。7.3 坐标轴与标签问题问题坐标轴刻度太密或太疏看不清。解决使用ax.xaxis.set_major_locator(plt.MultipleLocator(base))和ax.xaxis.set_minor_locator(...)来精确控制主次刻度的间隔。plt.MaxNLocator(nbins5)可以自动尝试将刻度数量控制在5个左右。问题坐标轴标签、标题或图例被截断。解决在plt.show()或fig.savefig()之前调用plt.tight_layout()。这个函数会自动调整子图、标签、标题等的位置防止重叠。如果还不行可以手动使用fig.subplots_adjust(left0.1, bottom0.15, right0.95, top0.9)来微调边距。问题想用科学计数法显示大数字如1e6。解决使用ax.ticklabel_format(style‘sci‘, axis‘y‘, scilimits(0,0))。scilimits(m, n)表示当数值在10^m到10^n范围之外时使用科学计数法设为(0,0)则强制使用。7.4 图形保存与导出问题问题保存的图片分辨率低很模糊。解决在fig.savefig(‘filename.png‘, dpi300)中提高dpi每英寸点数参数。300 DPI是印刷品的常用标准屏幕显示用150 DPI也足够清晰。问题保存的图片周围有大量不必要的空白。解决使用bbox_inches‘tight‘参数如fig.savefig(‘name.png‘, bbox_inches‘tight‘)。它会计算图形的紧凑边界框并裁剪空白。问题想保存为矢量图无限放大不模糊如PDF或SVG。解决直接更改文件扩展名即可如fig.savefig(‘plot.pdf‘)或fig.savefig(‘plot.svg‘)。矢量图适合用于论文和出版物。7.5 性能优化技巧当数据点非常多成千上万时绘制散点图可能会变慢。降采样如果数据精度允许可以先对数据进行随机采样或均匀采样只绘制一部分点来预览趋势。使用rasterizedTrue在scatter()函数中设置rasterizedTrueMatplotlib会将这部分图形元素保存为位图可以显著减小生成的PDF或SVG文件大小加速渲染。但请注意这会在矢量图中引入位图元素。考虑其他库对于超大规模数据百万级以上可以考虑使用专为大数据可视化设计的库如Datashader它能先对数据进行聚合再渲染成图像效率极高。绘图是一个不断调试和打磨的过程。最好的学习方式就是多动手遇到问题就查阅文档Matplotlib官方文档非常详尽或搜索错误信息。把上面这个完整的例子吃透并举一反三应用到自己的数据集上你就能扎实地掌握Python Matplotlib散点图绘制的核心技能了。

更多文章