在matplotlib xkcd风格中,负数无法正确显示。

5

我一直在使用Matplotlib中的xkcd样式功能。我有Matplotlib 1.4版本,并且humor sans字体已经正确安装,至少在msword中可以正常工作。

当我运行以下示例代码时,每当应该有负数时,标签上会显示"?"而不是"-"。有什么想法是什么原因引起的吗?

with plt.xkcd():
  plt.figure()
  plt.plot(np.sin(np.linspace(0, 10)))
  plt.title('Whoo Hoo!!!')

在此输入图片描述

编辑:根据Bernie的建议(感谢Bernie),我尝试了一些不同的后端。尝试了Qt、Tkinter和inline,但似乎都无法正常工作。顺便提一下,我正在使用Ipython 2.3。

另外,我的声誉已经足够高,可以发布图片了。正如您所看到的,除了那些令人讨厌的问号之外,一切都如预期。


1
负值在我的测试图中正确显示。您使用的后端是哪个?您可以通过执行以下操作找到:import matplotlib; matplotlib.get_backend() - mechanical_meat
1
我也无法重现这个问题,所以很可能与您的字体安装有关。也许可以在 Word 中检查实际的幽默无减号字符,看看该符号是否有效? - Ajean
在 Word 中似乎正常工作。Humor Sans 是否有比 1.0 更新的版本?因为我只有这个版本。 - Nathan Kiner
1
请注意,您键盘上的减号不一定是 XKCD 图中使用的减号。在连字符、减号、n 破折号和 m 破折号之间存在差异。因此,除非您尝试了 Word 中所有不同的连字符/减号/破折号,否则它可能仍然是字体问题。 - user707650
1
在Linux中,它使用的是“减号”(即U+2212),而不是ASCII“连字号”。plt.ion(); with plt.xkcd(): p, = plt.plot(np.sin(np.linspace(0, 10))); c = p.axes.yaxis.get_ticklabels()[0].get_text()[0]; ord(c) == 0x2212; unicodedata.name(c) == 'MINUS SIGN'。在Windows中,当编码为诸如1252的代码页时,通常会用“?”替换未映射字符。 - Eryk Sun
显示剩余4条评论
1个回答

2

eryksun的评论是正确的。因此,您必须将减号符号(U+2212)添加到xkcd字体(幽默无字体)中。

要做到这一点,请使用字体编辑器(我使用了FontForge):

  1. 从FontForge菜单中打开Humour Sans ttf文件。
  2. 将连字符(U+002d)字形复制并粘贴到减号符号(U+2212)字符框中(它们按递增的Unicode编号排序)。
  3. 转到文件 -> 生成字体。选择True Type (.ttf)并将其保存在不同于您的Fonts文件夹的文件夹中。
  4. 安装新保存的字体。(在Windows上,双击打开预览窗口,然后单击安装)

我和您遇到了同样的问题,这个方法解决了问题。


1
感谢Ludo和Eryksun,他们解决了我的问题。顺便说一句,你们提供的FontForge版本在我的Win7机器上反复崩溃。我用这里的Windows构建完成了它:http://fontforgebuilds.sourceforge.net/ - Nathan Kiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接