Matplotlib 1.3.1 中的数学表达式

0 投票
3 回答
1316 浏览
提问于 2025-04-18 10:21

我正在尝试在 matplotlib.pyplot 版本 1.3.1 中写数学表达式。

>>> import matplotlib
>>> print matplotlib.__version__
    1.3.1

有一段代码是不能正常工作的:

plt.scatter(np.log10(r1),np.log10(xi1),c='red',label='$\xi$(r) M$_{200}$>13.4')
plt.plot(np.log10(r1),np.log10(curve_y_1),'--',label='fit M200>13.4')

plt.text(0.5,-1.6,'0.0<z<1.0',fontsize=15,color='c')
plt.text(0.5,-1.8,'r$_0$ = %g' % p1_1,fontsize=13,color='r')
plt.text(0.5,-2.0,'$\gamma$ = %g' % p1_2,fontsize=13,color='r')

错误的完整追踪信息是:

In [55]: %run correlation_fit_compare.py
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    202             else:
    203                 filename = fname
--> 204             __builtin__.execfile(filename, *where)

ValueError: invalid \x escape

Matplotlib 网站提到,任何被 $\ 包围的内容都应该能给我想要的表达式。他们的一个例子是 $\alpha$,这会显示“数学”中的 alpha。

有没有人能告诉我如何在我的标签中写 \xi?

编辑:我已经发布了完整的 plt 代码和完整的追踪信息。

3 个回答

1

你可以用反斜杠 \ 来转义这个字符,这样它就不会被当作转义字符 \x 来解释,像这样:

plt.scatter(np.log10(r1),np.log10(xi1),c='red',label='$\\xi$(r) M$_{200}$>13.4')

另外,图表的参数标签其实不会显示任何内容,除非你给图表添加一个图例。所以在那之后,你需要调用:

plt.legend()

或者可以创建一个 xlabel 或 ylabel,而不是给图表直接加标签:

plt.xlabel(label='$\\xi$(r) M$_{200}$>13.4')
plt.ylabel(label='$\\xi$(r) M$_{200}$>13.4')
2

在Python中,有些反斜杠组合是有特殊含义的。为了避免这种情况,你可以使用原始字符串(raw strings)。另外,你应该只使用一对$符号,因为它只代表一个表达式:

r'$\xi(r)\ M_{200}>13.4$'

这意味着“把字符串里面的内容当作字面意思来处理”。在涉及LaTeX表达式时,使用原始字符串是个好主意。

需要注意的是,输出结果是一个普通字符串,r只是告诉解析器不要使用转义字符。

另外,在LaTeX中,空格是用\(斜杠加空格)来表示的。

编辑

现在你已经发布了你的表达式,我可以告诉你每个表达式的问题所在:

  • '$\xi$(r) M$_{200}$>13.4':这里有多个$,你应该只用一个。见上面的说明。
  • 'fit M200>13.4':这里没有LaTeX,但应该写成r'$\mathrm{fit}\ M200>13.4$'
  • 'r$_0$ = %g' % p1_1r应该放在外面,而$要包裹整个表达式。应该是r'$r_0 = %g$' % p1_1
  • '$\gamma$ = %g' % p1_2:和上面一样,只用一对$包裹整个表达式:r'$\gamma = %g$' % p1_2

注意:从技术上讲,你可以混合使用LaTeX和非LaTeX表达式,但这样容易出错,因为你可能会漏掉分隔符,而且看起来也不太美观。

5

在使用matplotlib绘制数学文本时,你需要用原始字符串,而不是普通字符串。在普通字符串中,\被用作转义字符,比如\n表示换行。

把你的字符串转换成原始字符串很简单,你会发现matplotlib的例子在字符串前面加了一个r,比如r'$\alpha$'

在你的情况下,你可以改成:

plt.scatter(np.log10(r1),np.log10(xi1),c='red',label=r'$\xi$(r) M$_{200}$>13.4')

撰写回答