python matplotlib 标签/标题字符错误

3 投票
2 回答
2373 浏览
提问于 2025-04-17 14:59

这是对这个问题的部分转载。
下面是我代码的一个简单示例:

import matplotlib.pyplot as plt

x = [0.0, 0.25, 0.5, 0.75, 1.0]
y = [7.0, 3.0, 5.0, 1.0, 0.0]

II = 2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

# un-comment title as needed:
#plot_title = r"A$_" + str(II) + r"$"
#plot_title = "A$_" + str(II) + "$"
plot_title = (r"A$_%s$" % (str(II)))
print plot_title
plt.title(plot_title)
plt.show()  

这里有三种不同版本的同一个图表标题字符串。上面的print plot_title可以正确显示每种情况的原始字符串:

A$_2$  

不过,这些方法在图形中都没有显示出正确的字符串(无论我使用哪个后端)。图形中的输出显示了输入的整数值和输出之间的关系:

$0$ -> E  
$1$ -> £  
$2$ -> N  
$3$ -> ®  
$4$ -> X  
$5$ -> ¸(cedille)  
$6$ -> b  
$7$ -> ¿  
$8$ -> j  
$9$ -> 3  

我使用的是python 2.6.6和matplotlib 0.99.1.1——我无法更改这些版本,只能将就使用。
我该如何修改输入才能得到想要的输出呢?

编辑

这个问题/答案的启发,我尝试了系统中所有不同的字体:

import matplotlib.font_manager as font_manager  

for i in range(0,len(sorted(font_manager.findSystemFonts()))):
    plt.rcParams['font.family'] = os.path.basename(sorted(font_manager.findSystemFonts())[i])[:-4]  

并为每种字体和上面的示例生成了一个图表。虽然文本的字体不同,但我关心的那个下标$_2$没有变化,总是显示为N

编辑 2
我升级到了matplotlib 1.3.0,问题解决了。这让我觉得问题可能出在0.99.1.1版本上。
对我来说,这仍然不够令人满意,因为我想知道为什么会这样。

编辑 3
我遇到了这个问题:Python图表中的上标
答案提到问题可能是因为使用了A$_2$而不是$A_2$
不幸的是,在这种情况下,这并没有改变输出。

2 个回答

3

我遇到过类似的问题。这个简单的例子:

from matplotlib.pyplot import *
subplot( 111, title=r"$\mathcal{O}\left( N^3 \right)$" )
show()

显示成了:

这里输入图片描述

在开头加上 matplotlib.rc('text', usetex=True) 后,这个问题就解决了:

from matplotlib.pyplot import *
matplotlib.rc('text', usetex=True)
subplot( 111, title=r"$\mathcal{O}\left( N^3 \right)$" )
show()

这里输入图片描述

这一行代码让 matplotlib 使用 LaTeX,而不是它内部的 mathtext 引擎。虽然 mathtext 是 LaTeX 的一个子集,但上标仍然可以正常工作。使用 LaTeX 需要你电脑上安装好 LaTeX 以及 dvipng 和 ghostscript,而且速度会慢一些。所以如果你已经安装了这些东西,这个解决方案可以试试。

我在这里开了一个问题 链接

经过一些耗时的测试,我发现把 fonts-lyx 2.2.0-2 降级到 2.1.4-2 也解决了我的问题。fonts-lyxpython-matplotlib-data 的一个依赖,但没有指定具体版本,这导致了这个问题。虽然我没有足够的技术知识来判断字体的哪些变化与使用它的程序不兼容。

4

我正在使用matplotlib版本1.3.1和python版本2.7.8。
我遇到了类似的问题。我在写

ax1.set_yticklabels(['$10^4$','$10^5$','$10^6']$'

结果1显示成了一个phi符号,0显示成了E,4显示成了Xi……依此类推。

我通过使用 '$\mathregular{10}^\mathregular{4}$' 来“修复”这个问题,虽然这个方法有点麻烦,但确实有效。

撰写回答