Python绘图标题LaTeX格式问题:上下标多数字符无法完整显示
这个问题我太熟悉了!你遇到的是Matplotlib里LaTeX格式字符串和Python格式化语法的冲突问题,核心原因是你没给上下标的内容加上LaTeX的分组大括号,导致小数点后的部分被LaTeX当成了普通文本,而不是上下标的一部分。
咱们来拆解一下问题:
- 你的原代码生成的标题字符串是
$100^2.4_5.6$,而不是正确的$100^{2.4}_{5.6}$ - LaTeX里,
^和_后面如果不加{},只会把紧跟的第一个字符当成上下标,所以^2.4会把2变成上标,.4留在正常行里,下标同理。
解决方法很简单,只需要在Python的格式字符串里,给上标和下标的变量套一层LaTeX的大括号——但因为Python的format语法里{}是占位符,所以要写两个{{和}}来转义成LaTeX的{和}:
修正后的代码
import matplotlib.pyplot as plt a = [100, 200, 300] b = [2.4, 3.5, 6.7] c = [5.6, 1.3, 4.2] # 假设plots是包含子图对象的列表,比如通过plt.subplots生成 fig, plots = plt.subplots(1, 3) for i in range(len(plots)): # 关键是格式字符串里的{{和}},转义后变成LaTeX的大括号 plots[i].set_title(r"${0}^{{{1}}}_{{{2}}}$".format(a[i], b[i], c[i])) plt.tight_layout() plt.show()
更简洁的f-string写法(Python 3.6+支持)
如果你用的是较新版本的Python,用f-string会更直观:
plots[i].set_title(rf"${a[i]}^{{{b[i]}}}_{{{c[i]}}}$")
这样生成的LaTeX代码就是$100^{2.4}_{5.6}$,Matplotlib会正确把整个2.4作为上标、5.6作为下标渲染出来,不会再拆分小数点啦。
内容的提问来源于stack exchange,提问作者Banafsheh




