前置准备:提前安装必备库,未安装的用户先执行安装代码。核心依赖为Matplotlib、NumPy,前者是绘图核心库,后者负责辅助计算,后续章节高频使用,本节提前铺垫。安装代码可直接复制执行,适配Windows、Mac、Linux全系统。
# 前置安装代码,首次使用必执行,已安装可跳过
# 安装Matplotlib,负责所有画布与图形绘制
# 安装NumPy,辅助完成数值计算与参数换算
pip install matplotlib numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
# 注释:选用清华镜像源提升安装速度,规避默认源卡顿问题
# 安装失败可直接删除镜像链接,用默认源重试
核心说明:本节所有代码基于Python 3.8及以上版本编写,兼容3.8到3.11所有稳定版本。代码可直接复制到PyCharm、Jupyter Notebook、VS Code等编辑器运行,无兼容性障碍。每个实操任务都搭配基础版、进阶版两套代码,基础版简洁易懂,适配新手入门,进阶版覆盖更多应用场景,满足学术绘图与个性化定制需求。
学术期刊单栏绘图,通用标准尺寸为3.5英寸宽、2.5英寸高。这个尺寸能保证图像在期刊页面内合理排布,避免过大过小或比例失调。本任务拆解为标准尺寸创建、尺寸单位转换、背景色设置、异常尺寸处理四个场景,每个场景配套完整代码与结果分析,兼顾新手入门与进阶适配。
# 导入核心库,Matplotlib的pyplot模块简写为plt,是行业通用写法
import matplotlib.pyplot as plt
# 导入NumPy,提前导入避免后续重复操作
import numpy as np
# 创建空白画布,figsize参数指定尺寸,单位固定为英寸
# fig代表整体画布对象,后续所有绘图操作都依托该对象
# ax代表坐标轴对象,负责控制坐标轴、刻度等细节
fig, ax = plt.subplots(figsize=(3.5, 2.5))
# 隐藏全部坐标轴,空白画布无需显示刻度与边框,符合期刊规范
ax.axis('off')
# 本地查看画布效果,公众号推文可省略此步,直接导出文件
plt.show()
# 导出矢量PDF格式,适配期刊投稿,300dpi是学术投稿最低分辨率要求
# bbox_inches设置为tight,自动裁剪多余空白,避免导出后留白过大
# pad_inches保留微量边缘留白,防止图像边缘被截断
fig.savefig('单栏标准空白图.pdf', dpi=300, bbox_inches='tight', pad_inches=0.05)
# 同步导出PNG格式,适配公众号推文、PPT展示,兼顾不同使用场景
fig.savefig('单栏标准空白图.png', dpi=300, bbox_inches='tight', pad_inches=0.05)
运行代码后,桌面会弹出3.5×2.5英寸的纯白画布窗口,无任何坐标轴与刻度,完全匹配单栏期刊空白图基础要求。导出的PDF属于矢量图,用Adobe Acrobat、WPS打开后,无限放大也不会出现锯齿模糊,后续添加的文字可直接编辑,完全符合期刊投稿的清晰度标准。PNG为位图格式,300dpi分辨率满足公众号与PPT使用需求,放大至150%依旧清晰,不会出现像素块。
新手容易混淆尺寸单位,figsize参数单位是英寸,不是厘米或像素。误将厘米当作英寸使用,会导致画布尺寸超标,无法适配期刊排版,1英寸约等于2.54厘米,3.5英寸换算后约8.89厘米,牢记这个换算比例能避开基础错误。
多数新手习惯用厘米描述尺寸,部分期刊也会标注厘米规格,需要提前完成厘米到英寸的换算。手动计算容易出错,本节封装通用转换函数,一键完成换算,同时覆盖标准尺寸、自定义尺寸两种场景。
import matplotlib.pyplot as plt
import numpy as np
# 定义尺寸转换函数,输入厘米数值,输出英寸数值,后续可直接复用
defcm_to_inch(cm):
return cm / 2.54
# 场景一,适配期刊标准,8.9厘米宽、6.35厘米高,对应3.5×2.5英寸
width_cm = 8.9
height_cm = 6.35
width_inch = cm_to_inch(width_cm)
height_inch = cm_to_inch(height_cm)
# 控制台打印换算结果,方便核对尺寸准确性
print(f"转换后尺寸:宽{width_inch:.2f}英寸,高{height_inch:.2f}英寸")
# 基于换算后的英寸尺寸创建画布
fig, ax = plt.subplots(figsize=(width_inch, height_inch))
ax.axis('off')
# 场景二,自定义尺寸,10厘米宽、8厘米高,适配公众号封面、非标准期刊绘图
width_cm2 = 10
height_cm2 = 8
fig2, ax2 = plt.subplots(figsize=(cm_to_inch(width_cm2), cm_to_inch(height_cm2)))
ax2.axis('off')
# 同时显示两个画布,直观对比尺寸差异
plt.show()
# 分类导出,单独命名避免文件覆盖
fig.savefig('标准尺寸空白图(厘米转换).pdf', dpi=300, bbox_inches='tight')
fig2.savefig('自定义尺寸空白图(10cm×8cm).png', dpi=300, bbox_inches='tight')
代码运行后,控制台会直接打印精准换算结果,确认尺寸符合期刊要求。弹出的两个画布,一个对应期刊标准尺寸,效果和基础版完全一致,另一个为自定义大尺寸。转换函数可全程复用,后续遇到尺寸换算需求,直接调用即可,无需重复编写代码。不同期刊的单栏尺寸略有差异,只需调整输入的厘米或英寸数值,无需改动核心代码,灵活适配各类规范。
默认画布为纯白色,部分场景需要调整背景色,比如公众号浅色排版、期刊特殊版式、多图拼接需求。本节覆盖纯色背景、透明背景、渐变背景三种常用模式,满足不同展示需求。
import matplotlib.pyplot as plt
import numpy as np
# 固定基础尺寸,3.5×2.5英寸
figsize = (3.5, 2.5)
# 纯色背景,选用浅灰色,适配公众号浅色推文,缓解纯白背景的刺眼感
fig1, ax1 = plt.subplots(figsize=figsize)
ax1.axis('off')
# 通过facecolor参数设置背景,支持颜色名称、十六进制色码、RGB值
fig1.patch.set_facecolor('#F5F5F5')
# 透明背景,适配期刊封面、多图拼接,避免背景色干扰其他元素
fig2, ax2 = plt.subplots(figsize=figsize)
ax2.axis('off')
fig2.patch.set_facecolor('none')
# 导出时必须开启transparent参数,否则透明背景会自动转为白色
fig2.savefig('透明背景空白图.pdf', dpi=300, bbox_inches='tight', transparent=True)
# 渐变背景,适配公众号封面、个性化展示,做浅蓝到白色的线性渐变
fig3, ax3 = plt.subplots(figsize=figsize)
ax3.axis('off')
# 生成100个网格点,保证渐变过渡平滑,无断层感
x = np.linspace(0, 1, 100)
y = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x, y)
# 构建RGB渐变矩阵,控制色彩从左至右平滑过渡
gradient = np.dstack((X, Y, np.ones_like(X)))
gradient[:, :, 0] = 0.537 + 0.463 * X
gradient[:, :, 1] = 0.808 + 0.192 * X
gradient[:, :, 2] = 0.922 + 0.078 * X
# 让渐变覆盖整个画布,无边缘留白
ax3.imshow(gradient, extent=[0, 1, 0, 1], aspect='auto')
# 一次性显示三个画布,对比不同背景效果
plt.show()
# 分类导出文件,做好命名区分
fig1.savefig('浅灰色背景空白图.png', dpi=300, bbox_inches='tight')
fig3.savefig('渐变背景空白图.png', dpi=300, bbox_inches='tight')
浅灰色背景视觉柔和,手机端阅读更舒适,不会影响后续图形与文字的清晰度。

透明背景导出后,嵌入Word、期刊排版软件时,会自动适配文档底色,无白色边框干扰,适合多图拼接场景。

渐变背景色彩过渡平滑,视觉层次更丰富,可按需调整渐变方向与色彩,改成竖向渐变或其他色系。

设置背景时要注意,针对整体画布用fig.patch.set_facecolor,针对坐标轴内部用ax.patch.set_facecolor,两者适用场景不同,混用会导致背景只覆盖局部区域。
新手输入尺寸时,常出现输入字符串、负数、零值等错误,导致代码直接崩溃。本节封装带异常捕获的画布创建函数,遇到错误输入时给出清晰提示,不中断程序运行,帮新手快速排查问题,这套函数可全程复用。
import matplotlib.pyplot as plt
import numpy as np
# 定义带异常处理的画布创建函数,通用复用性强
defcreate_blank_fig(width, height):
# 捕获非数值输入错误,比如字符串、列表类型
ifnot isinstance(width, (int, float)) ornot isinstance(height, (int, float)):
print("错误:尺寸需为整数或浮点数,禁止输入字符串、列表等格式")
returnNone
# 捕获负数、零值输入错误,尺寸必须为正数值
if width <= 0or height <= 0:
print(f"错误:尺寸需为正数,当前宽{width}、高{height}不达标,请重新输入")
returnNone
# 无异常则正常创建画布
fig, ax = plt.subplots(figsize=(width, height))
ax.axis('off')
return fig, ax
# 测试三类异常场景
# 输入字符串类型宽度
fig_error1, ax_error1 = create_blank_fig("3.5", 2.5)
# 输入负数宽度
fig_error2, ax_error2 = create_blank_fig(-3.5, 2.5)
# 输入零值高度
fig_error3, ax_error3 = create_blank_fig(3.5, 0)
# 正常尺寸输入,作为对照
fig_normal, ax_normal = create_blank_fig(3.5, 2.5)
# 仅显示正常尺寸画布,异常场景不生成画布
if fig_normal isnotNone:
plt.show()
fig_normal.savefig('正常尺寸空白图(带异常处理).pdf', dpi=300, bbox_inches='tight')
代码运行后,控制台会依次弹出三条错误提示,对应非数值、负数、零值三类常见错误,异常场景不会生成画布,也不会导致程序中断。

新手可根据提示快速修改参数,不影响正常流程推进。正常尺寸的画布生成与导出效果,和基础版完全一致,异常处理代码不干扰核心功能。后续所有绘图任务,都可调用这个函数,养成规范编码习惯,减少基础报错。
学术绘图常需要多子图拼接展示多组数据,2行2列是最常用的布局形式。本节覆盖基础子图创建、间距调整、边框留白设置、非对称布局适配、共享坐标轴五大场景,针对性解决子图拥挤、标签重叠、布局混乱等新手高频问题。
import matplotlib.pyplot as plt
import numpy as np
# ========== 中文字体设置(关键修改) ==========
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体(Windows 自带)
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 备选:微软雅黑
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # macOS 宋体
plt.rcParams['axes.unicode_minus'] = False# 解决负号 '-' 显示为方块的问题
# ==========================================
# 创建2行2列子图,整体画布尺寸设为8×10英寸,避免子图拥挤
# sharex与sharey默认关闭,子图独立显示坐标轴,适合新手入门
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 10), sharex=False, sharey=False, squeeze=True)
# 子图索引遵循从上到下、从左到右的顺序,行索引、列索引均从0开始
# 依次为四个子图添加简易标题,方便区分
axes[0, 0].set_title('子图1(0,0)')
axes[0, 1].set_title('子图2(0,1)')
axes[1, 0].set_title('子图3(1,0)')
axes[1, 1].set_title('子图4(1,1)')
# 循环为所有子图添加基础坐标轴标签,模拟实际绘图场景
for i in range(2):
for j in range(2):
axes[i, j].set_xlabel('X轴')
axes[i, j].set_ylabel('Y轴')
# 本地查看布局效果
plt.show()
# 导出子图,适配期刊与公众号使用
fig.savefig('基础2×2子图.png', dpi=300, bbox_inches='tight', pad_inches=0.1)
运行后生成8×10英寸画布,四个子图均匀排布,标题与坐标轴标签清晰,无明显拥挤感。

子图索引规则简单易记,后续修改单个子图样式时,直接对应行列索引即可,不易混淆。整体画布高度设为10英寸,刚好适配2行子图,高度过低会直接导致标题、标签重叠,新手需注意整体尺寸与子图数量的匹配度。
默认子图间距较窄,遇到长标题、长标签时,容易出现文字重叠。本节通过水平间距、垂直间距两个核心参数,实现紧凑、宽松、自适应三种布局模式,适配不同内容长度。
import matplotlib.pyplot as plt
import numpy as np
# ========== 中文字体设置(关键修改) ==========
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体(Windows 自带)
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 备选:微软雅黑
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # macOS 宋体
plt.rcParams['axes.unicode_minus'] = False# 解决负号 '-' 显示为方块的问题
# ==========================================
# 基础布局参数与基础版保持一致
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(3.5, 5), sharex=False, sharey=False)
# 模拟长标题、长标签场景,测试间距调整效果,适当缩小字体适配子图
axes[0, 0].set_title('子图1:实验对照组数据分布', fontsize=8)
axes[0, 1].set_title('子图2:实验处理组1数据分布', fontsize=8)
axes[1, 0].set_title('子图3:实验处理组2数据分布', fontsize=8)
axes[1, 1].set_title('子图4:三组数据对比分析', fontsize=8)
# 循环添加长坐标轴标签,同步缩小刻度字体
for i in range(2):
for j in range(2):
axes[i, j].set_xlabel('实验指标(单位:mg/L)', fontsize=7)
axes[i, j].set_ylabel('数据值(单位:μg)', fontsize=7)
axes[i, j].tick_params(labelsize=6)
# 核心间距调整,用plt.subplots_adjust控制,灵活度高
# wspace代表水平间距,hspace代表垂直间距,数值越大间距越宽
# 紧凑布局,节省画布空间,适合内容简洁的场景
plt.subplots_adjust(wspace=0.2, hspace=0.3)
# 宽松布局,拉大间距,避免长文本重叠,取消注释即可切换
# plt.subplots_adjust(wspace=0.4, hspace=0.5)
# 自适应布局,系统自动匹配内容调整间距,新手优先选用
# plt.tight_layout()
# 显示并导出
plt.show()
fig.savefig('调整间距的2×2子图.png', dpi=300, bbox_inches='tight', pad_inches=0.1)

紧凑布局下,子图间距适中,长标题与标签无重叠,兼顾清晰度与空间利用率,适合期刊排版。宽松布局拉大横竖间距,彻底避免文字重叠,适合内容复杂的场景,但会占用更多画布空间,可适当放大整体画布尺寸配合。自适应布局无需手动调参,系统自动优化间距,新手入门首选,缺点是精准度略低,需要精细化排版时,还是建议手动调整参数。长文本场景下,配合缩小字体,既能避开重叠,又能保证内容可读性,是学术绘图的常用技巧。
默认画布四周留白偏大,导出后浪费页面空间,期刊排版要求精简留白,公众号则需要适中留白提升视觉舒适度。本节通过左、右、上、下四个留白参数,实现精简留白、宽松留白、自定义留白三种模式。
import matplotlib.pyplot as plt
import numpy as np
# ========== 中文字体设置(关键修改) ==========
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体(Windows 自带)
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 备选:微软雅黑
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # macOS 宋体
plt.rcParams['axes.unicode_minus'] = False# 解决负号 '-' 显示为方块的问题
# ==========================================
# 创建基础2×2子图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(3.5, 5), sharex=False, sharey=False)
# 添加基础标题与标签
for i in range(2):
for j in range(2):
axes[i, j].set_title(f'子图({i},{j})', fontsize=8)
axes[i, j].set_xlabel('X轴', fontsize=7)
axes[i, j].set_ylabel('Y轴', fontsize=7)
# 先调整子图内部间距,避免拥挤
plt.subplots_adjust(wspace=0.5, hspace=0.5)
# 核心留白调整,left、right、top、bottom分别控制四边留白比例
# 数值范围均为0到1,左留白小于右留白,下留白小于上留白,否则报错
# 精简留白,适配期刊,最大化利用画布空间
plt.subplots_adjust(left=0.12, right=0.95, top=0.92, bottom=0.1)
# 宽松留白
# plt.subplots_adjust(left=0.15, right=0.9, top=0.88, bottom=0.15)
# 自定义留白,左侧加大留白,预留全局图例位置
# plt.subplots_adjust(left=0.2, right=0.85, top=0.85, bottom=0.15)
# 显示导出
plt.show()
fig.savefig('精简留白2×2子图(期刊适配).pdf', dpi=300, bbox_inches='tight')
执行结果如下:

精简留白模式下,四边留白大幅缩减,子图占据核心画布空间,符合期刊紧凑排版的要求,嵌入期刊页面无多余空白。宽松留白模式四周留白均匀。自定义留白可按需预留空间,比如左侧加大留白放置全局图例,无需每个子图重复添加图例,既节省空间又保持布局整齐。调参时牢记四边参数的数值关系,避免出现逻辑错误导致报错,新手可先沿用推荐参数,再根据实际需求微调。
标准对称布局无法突出核心数据,实际场景常需要重点子图尺寸更大,实现主次分明的展示效果。本节通过GridSpec实现灵活非对称布局,也提供新手简化版方案,兼顾专业性与易用性。
import matplotlib.pyplot as plt
import numpy as np
# ========== 中文字体设置(关键修改) ==========
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体(Windows 自带)
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 备选:微软雅黑
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # macOS 宋体
plt.rcParams['axes.unicode_minus'] = False# 解决负号 '-' 显示为方块的问题
# ==========================================
# 专业方案,用GridSpec实现非对称布局,精准控制行列比例
# 先创建空白画布,不直接生成子图
fig = plt.figure(figsize=(8, 10))
# 定义2行2列网格,第一行高度设为第二行的1.5倍,突出重点
gs = fig.add_gridspec(nrows=2, ncols=2, width_ratios=[1, 1], height_ratios=[1.5, 1], hspace=0.3, wspace=0.2)
# 分配子图区域,第一行跨两列作为重点展示区,第二行均分两列
ax1 = fig.add_subplot(gs[0, :])
ax2 = fig.add_subplot(gs[1, 0])
ax3 = fig.add_subplot(gs[1, 1])
# 重点子图标题稍大,突出核心内容
ax1.set_title('重点展示:三组数据整体对比', fontsize=9)
ax1.set_xlabel('实验分组', fontsize=8)
ax1.set_ylabel('平均数据值', fontsize=8)
# 普通子图保持常规字号
ax2.set_title('子图2:对照组', fontsize=8)
ax2.set_xlabel('X轴', fontsize=7)
ax2.set_ylabel('Y轴', fontsize=7)
ax3.set_title('子图3:处理组', fontsize=8)
ax3.set_xlabel('X轴', fontsize=7)
ax3.set_ylabel('Y轴', fontsize=7)
# 调整整体留白
plt.subplots_adjust(left=0.12, right=0.95, top=0.92, bottom=0.1)
plt.show()
fig.savefig('非对称2×2子图.png', dpi=300, bbox_inches='tight')
执行结果如下:

GridSpec方案可精准控制行高列宽比例,重点子图占比更大,适合展示核心结论,普通子图补充细节,层次分明。这种布局适配学术论文整体结果加分项结果的展示逻辑。新手简化版操作更简单,通过删除合并子图快速实现非对称效果,缺点是无法精准控制比例,适合简单场景。非对称布局能有效提升信息传递效率,让读者快速抓住核心内容,避免多子图平铺导致的重点模糊。
多子图展示同类数据时,坐标轴指标与刻度范围一致,重复绘制会让布局杂乱。共享坐标轴可省略重复标签与刻度,让版面更简洁,同时保证数据对比的一致性。本节覆盖共享X轴、共享Y轴、共享双轴三种模式。
import matplotlib.pyplot as plt
import numpy as np
# ========== 中文字体设置(关键修改) ==========
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体(Windows 自带)
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 备选:微软雅黑
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # macOS 宋体
plt.rcParams['axes.unicode_minus'] = False# 解决负号 '-' 显示为方块的问题
# ==========================================
# 共享X轴,所有子图X轴指标一致,仅下方子图显示X轴标签
fig1, axes1 = plt.subplots(nrows=2, ncols=2, figsize=(8, 10), sharex='all', sharey=False)
for i in range(2):
for j in range(2):
axes1[i, j].set_title(f'子图({i},{j})', fontsize=8)
axes1[i, j].set_ylabel(f'指标{i+j+1}(mg/L)', fontsize=7)
# 仅最下方两个子图保留X轴标签
axes1[1, 0].set_xlabel('时间(min)', fontsize=7)
axes1[1, 1].set_xlabel('时间(min)', fontsize=7)
plt.subplots_adjust(wspace=0.5, hspace=0.3, left=0.12, right=0.95, top=0.92, bottom=0.1)
plt.show()
fig1.savefig('共享X轴的2×2子图.png', dpi=300, bbox_inches='tight')
# 共享Y轴,所有子图Y轴指标一致,仅左侧子图显示Y轴标签
fig2, axes2 = plt.subplots(nrows=2, ncols=2, figsize=(8, 10), sharex=False, sharey='all')
for i in range(2):
for j in range(2):
axes2[i, j].set_title(f'子图({i},{j})', fontsize=8)
axes2[i, j].set_xlabel(f'指标{i+j+1}(μg)', fontsize=7)
# 仅最左侧两个子图保留Y轴标签
axes2[0, 0].set_ylabel('数值', fontsize=7)
axes2[1, 0].set_ylabel('数值', fontsize=7)
plt.subplots_adjust(wspace=0.5, hspace=0.3, left=0.12, right=0.95, top=0.92, bottom=0.1)
plt.show()
fig2.savefig('共享Y轴的2×2子图.png', dpi=300, bbox_inches='tight')
# 共享双轴,X轴Y轴全部统一,仅保留一组坐标轴标签
fig3, axes3 = plt.subplots(nrows=2, ncols=2, figsize=(8, 10), sharex='all', sharey='all')
for i in range(2):
for j in range(2):
axes3[i, j].set_title(f'子图({i},{j})', fontsize=8)
# 仅最下方显示X轴标签,最左侧显示Y轴标签
axes3[1, 0].set_xlabel('时间(min)', fontsize=7)
axes3[0, 0].set_ylabel('数值(mg/L)', fontsize=7)
plt.subplots_adjust(wspace=0.5, hspace=0.3, left=0.12, right=0.95, top=0.92, bottom=0.1)
plt.show()
fig3.savefig('共享双轴的2×2子图.png', dpi=300, bbox_inches='tight')
共享X轴适合展示同一时间维度下的不同指标变化,省去重复的时间标签,版面更清爽。

共享Y轴适合展示同一数值维度下的不同分组对比,保证刻度统一,数据对比更直观。

共享双轴是最简洁的模式,适合多组同类数据横向对比,学术论文中应用最广泛。

共享坐标轴后,调整任意一个子图的刻度范围,其余子图会同步更新,无需逐个修改,既提升效率,又避免刻度不一致导致的对比误差。
学术期刊对绘图风格有严格规范,统一字体、线条、坐标轴样式,能有效提升审稿通过率。公众号绘图也需要风格统一,保证视觉连贯性。本节通过全局参数设置,实现一次配置全程复用,避开重复编写样式代码,同时适配Windows、Mac、Linux全系统。
import matplotlib.pyplot as plt
import numpy as np
# 全局字体配置,通过rcParams参数实现,一次设置全程生效
plt.rcParams['font.family'] = 'Times New Roman'
# 全局默认字号设为8,适配子图尺寸,后续可单独微调
plt.rcParams['font.size'] = 8
# 关闭unicode_minus,解决负号显示异常的问题
plt.rcParams['axes.unicode_minus'] = False
# 如需添加中文,比如公众号推文,取消下方注释,实现中英字体分离
# plt.rcParams['font.sans-serif'] = ['SimHei', 'Times New Roman']
# 测试全局字体效果,创建共享双轴的2×2子图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(3.5, 5), sharex='all', sharey='all')
# 循环添加英文标题与标签,验证全局字体生效
for i in range(2):
for j in range(2):
axes[i, j].set_title(f'Group {i+j+1} Results', fontsize=9)
axes[i, j].set_xlabel('Time (min)', fontsize=8)
axes[i, j].set_ylabel('Concentration (mg/L)', fontsize=8)
axes[i, j].tick_params(labelsize=7)
# 调整布局间距与留白
plt.subplots_adjust(wspace=0.2, hspace=0.3, left=0.12, right=0.95, top=0.92, bottom=0.1)
plt.show()
fig.savefig('全局Times New Roman字体子图.pdf', dpi=300, bbox_inches='tight')
执行结果如下:

Times New Roman是大多数学术期刊指定的英文字体,全局设置后,标题、坐标轴标签、刻度文字全部统一为该字体,符合期刊规范。代码运行后,所有文字样式一致,无字体错乱问题,负号显示正常,不会出现方块乱码。需要添加中文时,开启中英分离配置,中文用黑体,英文保留Times New Roman,兼顾双语展示需求。全局字体设置放在代码开头,后续所有绘图任务自动沿用,无需重复配置,大幅提升编码效率。
import matplotlib.pyplot as plt
import numpy as np
# 延续全局字体设置
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
# 全局线条配置,适配学术绘图规范
plt.rcParams['lines.linewidth'] = 0.8
plt.rcParams['axes.linewidth'] = 0.8
# 全局线条样式,默认实线,可按需改为虚线、点线
plt.rcParams['lines.linestyle'] = '-'
# 全局标记点大小,适配小尺寸子图
plt.rcParams['lines.markersize'] = 3
# 测试线条效果,绘制简易曲线
fig, ax = plt.subplots(figsize=(3.5, 2.5))
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y, label='Sin Curve')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.legend(frameon=False, fontsize=7)
plt.tight_layout()
plt.show()
fig.savefig('全局线条样式测试图.pdf', dpi=300, bbox_inches='tight')
执行结果如下:

学术绘图要求线条粗细均匀,避免过粗或过细影响清晰度。全局设置线条宽度为0.8,坐标轴边框宽度同步匹配,整体视觉协调。标记点大小设为3,适配小尺寸画布,不会过大遮挡数据,也不会过小难以辨认。全局线条样式默认实线,满足常规绘图需求,需要特殊线条时,可单独修改单个图形样式,不影响全局规范。统一线条样式后,整套绘图作品风格一致,符合学术出版的审美要求,也能减少审稿人对格式的质疑。
import matplotlib.pyplot as plt
import numpy as np
# 继承全局字体、线条配置
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8
plt.rcParams['axes.linewidth'] = 0.8
# 全局坐标轴刻度设置
plt.rcParams['xtick.major.width'] = 0.8
plt.rcParams['ytick.major.width'] = 0.8
plt.rcParams['xtick.major.size'] = 3
plt.rcParams['ytick.major.size'] = 3
# 关闭多余刻度,仅保留主刻度
plt.rcParams['xtick.minor.visible'] = False
plt.rcParams['ytick.minor.visible'] = False
# 刻度朝向画布内侧,符合期刊规范
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
# 测试坐标轴样式
fig, ax = plt.subplots(figsize=(3.5, 2.5))
ax.set_xlabel('Variable')
ax.set_ylabel('Value')
ax.set_xlim(0, 10)
ax.set_ylim(0, 1)
plt.tight_layout()
plt.show()
fig.savefig('全局坐标轴样式测试图.pdf', dpi=300, bbox_inches='tight')
执行结果如下:

期刊审稿对坐标轴细节要求严苛,刻度宽度、长度、朝向都有规范。全局设置主刻度宽度与线条一致,长度适中,关闭次要刻度,避免画面杂乱。刻度朝向画布内侧,是学术绘图的通用规范,让版面更整洁。所有坐标轴参数统一后,无需逐个子图调整,大幅减少格式修改工作量。这套坐标轴配置,能直接适配绝大多数SCI、核心期刊的要求,降低因格式问题被返修的概率。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
# 封装全套学术风格配置函数
defset_academic_style():
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8
plt.rcParams['axes.linewidth'] = 0.8
plt.rcParams['xtick.major.width'] = 0.8
plt.rcParams['ytick.major.width'] = 0.8
plt.rcParams['xtick.major.size'] = 3
plt.rcParams['ytick.major.size'] = 3
plt.rcParams['xtick.minor.visible'] = False
plt.rcParams['ytick.minor.visible'] = False
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['legend.frameon'] = False
print("学术绘图风格已全局生效")
# 一键调用风格函数
set_academic_style()
# 测试效果
fig, ax = plt.subplots(figsize=(3.5, 2.5))
x = np.linspace(0, 5, 50)
y = np.cos(x)
ax.plot(x, y)
ax.set_xlabel('X')
ax.set_ylabel('Cos(X)')
plt.tight_layout()
plt.show()
执行结果如下:

将全套学术风格封装为独立函数,后续绘图只需调用一次,即可完成所有全局配置,省去重复复制代码的麻烦。函数内整合字体、线条、坐标轴、图例等全部核心样式,同时关闭图例边框,进一步贴合学术规范。调用后控制台弹出提示,确认风格生效,方便新手核对。这套风格函数可保存为独立脚本,跨项目、跨章节直接复用,保证整套课程所有绘图作品风格统一,形成标准化的学术绘图模板。
文件导出是绘图的最后一环,也是期刊投稿的关键步骤。矢量PDF适合学术投稿,PNG适合word与PPT展示,两类文件都需要保证清晰度、文字可编辑,避开导出报错、模糊、乱码等问题。本节覆盖单文件导出、批量导出、兼容性验证、问题排查全流程,适配各类使用场景。
import matplotlib.pyplot as plt
import numpy as np
# 调用全局学术风格
defset_academic_style():
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8
plt.rcParams['axes.linewidth'] = 0.8
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
set_academic_style()
# 创建标准单栏画布,添加可编辑文字
fig, ax = plt.subplots(figsize=(3.5, 2.5))
ax.set_xlabel('Test Variable (Unit)')
ax.set_ylabel('Measurement Value')
ax.set_title('Standard Academic Plot')
ax.plot([1,2,3,4,5], [2,4,6,8,10])
ax.axis([1,5,0,10])
# 导出矢量PDF,期刊投稿首选,文字可编辑
fig.savefig('标准学术图.pdf', dpi=300, bbox_inches='tight', pad_inches=0.05, format='pdf')
# 导出高清PNG,适配公众号、PPT
fig.savefig('标准学术图.png', dpi=300, bbox_inches='tight', pad_inches=0.05, format='png')
plt.show()
执行结果如下:

导出的PDF文件为矢量格式,用专业PDF编辑器打开,所有文字、坐标轴标签均可单独编辑修改,无需重新绘图。文件无限放大无锯齿、无模糊,完全满足期刊300dpi以上的分辨率要求。
import matplotlib.pyplot as plt
import numpy as np
import os
# 全局风格配置
defset_academic_style():
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['svg.fonttype'] = 'path'
plt.rcParams['pdf.fonttype'] = 42
set_academic_style()
# 创建测试画布
fig, ax = plt.subplots(figsize=(3.5, 2.5))
x = np.linspace(0, 6, 100)
y = np.exp(-x/2)
ax.plot(x, y, color='#2E86AB')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Intensity')
# 创建导出文件夹,避免文件杂乱
ifnot os.path.exists('导出文件'):
os.makedirs('导出文件')
# 批量导出多格式,适配不同需求
# PDF,嵌入字体,保证跨设备显示一致
fig.savefig('导出文件/学术图_印刷级.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)
# PNG,300dpi,公众号专用
fig.savefig('导出文件/学术图_word.png', dpi=300, bbox_inches='tight', pad_inches=0.05)
# SVG,矢量格式,适配AI后期编辑
fig.savefig('导出文件/学术图_编辑版.svg', bbox_inches='tight', pad_inches=0.05)
plt.close(fig)
print("多格式文件已批量导出至导出文件文件夹")
执行结果如下:

批量导出功能可一次性生成PDF、PNG、SVG三类文件,分别适配印刷投稿、word展示、后期编辑场景。设置pdf.fonttype为'path',实现字体完全嵌入PDF,跨设备打开不会出现字体缺失、乱码问题,解决期刊投稿常见的字体报错问题。自动创建专属导出文件夹,统一管理文件,避免桌面文件杂乱。PDF分辨率设为600dpi,满足顶级期刊印刷要求,PNG保持300dpi,兼顾清晰度与文件体积,适合网络传播。
import matplotlib.pyplot as plt
import numpy as np
import os
# 一键调用学术风格
defset_academic_style():
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8
plt.rcParams['axes.linewidth'] = 0.8
plt.rcParams['xtick.major.width'] = 0.8
plt.rcParams['ytick.major.width'] = 0.8
plt.rcParams['xtick.major.size'] = 3
plt.rcParams['ytick.major.size'] = 3
plt.rcParams['xtick.minor.visible'] = False
plt.rcParams['ytick.minor.visible'] = False
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['legend.frameon'] = False
plt.rcParams['pdf.fonttype'] = 42
set_academic_style()
# 创建期刊标准单栏画布(3.5×5英寸),2行1列子图,共享X轴
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(3.5, 5), sharex='all')
# 生成模拟实验数据,贴合学术场景
x = np.linspace(0, 10, 100)
y1 = np.sin(x) + 0.5
y2 = np.cos(x) - 0.2
# 绘制子图,设置不同标记点,便于区分数据
axes[0].plot(x, y1, marker='o', markersize=2, label='Group A')
axes[1].plot(x, y2, marker='s', markersize=2, label='Group B')
# 设置子图标题与坐标轴标签
axes[0].set_title('Group A Data Trend')
axes[1].set_title('Group B Data Trend')
axes[1].set_xlabel('Time (min)')
axes[0].set_ylabel('Absorbance')
axes[1].set_ylabel('Absorbance')
# 添加图例,调整布局
axes[0].legend(fontsize=7)
axes[1].legend(fontsize=7)
plt.subplots_adjust(hspace=0.3, left=0.15, right=0.95, top=0.92, bottom=0.1)
# 创建导出文件夹,批量导出多格式
ifnot os.path.exists('综合案例导出'):
os.makedirs('综合案例导出')
fig.savefig('综合案例导出/期刊标准子图.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)
fig.savefig('综合案例导出/期刊标准子图.png', dpi=300, bbox_inches='tight', pad_inches=0.05)
plt.show()
print("综合案例绘图与导出完成,文件保存至综合案例导出文件夹")
执行结果如下:

该案例整合本节核心知识点,从全局风格配置到子图布局,再到数据绘制与多格式导出,完全贴合学术期刊绘图规范。运行后生成的子图共享X轴,刻度朝向内侧,字体统一为Times New Roman,线条与标记点尺寸适中,导出的PDF可编辑、清晰度达标,可直接用于期刊投稿。新手可在此基础上修改数据、调整子图数量与尺寸,快速适配自身实验数据展示需求。
- END -