双坐标轴图表必须独立控制刻度、标签与图例:左右y轴需分别设置label、locator、tick颜色;保存时须指定dpi=300、bbox_inches='tight'并禁用tight_layout;图例需合并双轴handles;LaTeX渲染公式但慎用中文,单位用\mathit{}斜体。

双坐标轴图表的刻度与标签必须独立控制
Matplotlib 的 twinx() 和 twiny() 本身不自动同步刻度或标签,直接调用后若不手动设置,右侧/上侧坐标轴常出现刻度重叠、字体大小不一致、单位缺失等问题,导致期刊编辑直接拒稿。关键不是“画出来”,而是“各自可读且互不干扰”。
- 左侧 y 轴用
ax1.set_ylabel(),右侧必须显式调用ax2.set_ylabel(),且需单独设fontsize(推荐 10–12 pt)和labelpad(建议 ≥10)避免贴边 - 两轴的刻度位置不能依赖默认——用
ax1.yaxis.set_major_locator()和ax2.yaxis.set_major_locator()分别指定MultipleLocator或FixedLocator,否则易出现 0.333、0.666 这类非整数刻度 - 右侧轴的 tick label 颜色建议设为与对应曲线一致(如
ax2.tick_params(colors='red')),但需同步改ax2.yaxis.label.set_color('red')
保存为出版级图像时 dpi 和 bbox_inches 缺一不可
直接 plt.savefig('fig.png') 生成的图在 LaTeX 中插入后常出现裁切、字体发虚、图例溢出等问题——根本原因是未控制输出分辨率和边界留白。
- 期刊普遍要求 300 dpi 或更高:
plt.savefig('fig.pdf', dpi=300)(PDF 优先选format='pdf',避免位图压缩失真) - 必须加
bbox_inches='tight',否则twinx()生成的右侧 ylabel 极易被截断;若仍有裁切,改用bbox_inches=matplotlib.transforms.Bbox([[0, 0], [7, 5]])手动框定画布范围 - 禁用
plt.tight_layout()——它会强行压缩双轴间距,导致右侧刻度与标签挤压变形;改用plt.subplots_adjust(right=0.85)预留右侧空间
图例(legend)必须跨双轴显式指定 handles 和 labels
调用 ax1.legend() 或 ax2.legend() 单独绘图例,大概率只显示一个轴的线条,另一侧图例丢失——因为 Matplotlib 默认只收集当前 axes 的 artists。
- 正确做法:先获取所有句柄
lines1, labels1 = ax1.get_legend_handles_labels(),lines2, labels2 = ax2.get_legend_handles_labels(),再合并ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') - 若图例文字过长导致重叠,用
ncol=2拆成两列,并配columnspacing=1.2防粘连 - 避免使用
plt.legend()全局调用——它无法识别twinx()创建的第二个 axes,返回空图例
字体与符号需脱离系统依赖,用 LaTeX 渲染数学公式
直接显示希腊字母(如 α、β)或上下标,在导出 PDF 时易变成方块或乱码,尤其投稿 Elsevier/Springer 等出版社时被退回率极高。
立即学习“Python免费学习笔记(深入)”;
- 启用 LaTeX 渲染:
plt.rcParams['text.usetex'] = True,并确保系统已安装 LaTeX 发行版(如 TeX Live)及cmr10字体 - 中文标题/标签慎用 LaTeX——编译易失败;改用
plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans'],并显式设ax1.set_xlabel(r'$t$ (s)', usetex=True)仅对公式部分启用 - 所有单位用斜体:写成
r'$\mathit{m/s}$',而非'm/s',否则排版不符合《Nature》《Science》图表规范
双坐标轴真正的难点不在“画两个 y 轴”,而在刻度粒度、字体嵌入、图例源归属这三处——任一环节没显式控制,就可能卡在编辑部初审阶段。


















