Matplotlib中使用TeX分数表达式循环生成X轴标签的问题
解决Matplotlib中TeX分数与字符串格式化的大括号冲突问题
这个坑我之前踩过!核心问题就是要正确区分Python字符串格式化的占位符大括号和TeX语法里的大括号,下面给你两种靠谱的解决方法:
方法一:用.format()配合双层大括号转义
TeX的\frac{分子}{分母}需要用大括号包裹分子,但Python的.format()也用{}作为占位符,直接写会导致解析冲突。我们可以用**双层大括号{{}}**来表示TeX里的单个大括号,同时留出格式化的占位符:
import matplotlib.pyplot as plt # 如果你的环境默认没开TeX渲染,可以加上这行 # plt.rcParams['text.usetex'] = True fig = plt.figure() ax = fig.add_subplot(111) xax = ax.xaxis labels = ['0'] # 循环生成1到14的分子,对应1/8到14/8 for i in range(1, 15): # 双层大括号{{}}会被解析为TeX里的单个{},内层{}是.format的占位符 labels.append(r'$\frac{{{}}}{8}$'.format(i)) xax.set_ticklabels(labels) plt.show()
方法二:用f-string更直观(Python 3.6+)
如果你的Python版本支持f-string,写法会更清晰,同样用{{}}转义TeX的大括号:
import matplotlib.pyplot as plt # plt.rcParams['text.usetex'] = True fig = plt.figure() ax = fig.add_subplot(111) xax = ax.xaxis labels = ['0'] for i in range(1, 15): # rf表示原始f-string,避免转义字符干扰 labels.append(rf'$\frac{{{i}}}{8}$') xax.set_ticklabels(labels) plt.show()
额外说明:
- 我把循环范围改成了
range(1,15),这样生成的分子是1到14,正好匹配你要的[1/8,2/8,…,14/8],原来的range(0,14)会生成0到13,不符合需求哦。 - 如果遇到分数显示异常,记得检查是否开启了TeX渲染,添加
plt.rcParams['text.usetex'] = True即可(需要系统安装TeX环境,比如TeX Live或者MiKTeX)。
内容的提问来源于stack exchange,提问作者Sergei Shumilin
相关产品推荐
相关产品推荐

