gpt4 book ai didi

python - unicode减号的转换(来自matplotlib ticklabels)

转载 作者:太空狗 更新时间:2023-10-29 17:20:57 25 4
gpt4 key购买 nike

我对 matplotlib 用来表示刻度标签的文本对象有问题。

出于测试原因,我需要检查绘图中创建的刻度标签的值。如果标签是字符串或正数,则没有问题:返回一个 unicode 字符串,我对其进行测试(或根据情况将其转换为数字),一切正常。

但如果标签是负数,我得到的是一个损坏的 unicode 字符串,原因我无法理解。

让我们来看这个示例代码:

import pylab as plt
fig, ax = plt.subplots(1)
ax.plot([-1, 0, 1, 2], range(4))
labels = ax.get_xticklabels()

现在,如果我询问第二个标签(0)的文本内容,我会得到一个普通的 unicode 字符串:

labels[1].get_text()
# u'0.0'

但是第一个(-1)的unicode是个奇怪的东西

labels[1].get_text()
# u'\u22121'

这在终端中打印正确,但在这种情况下,我需要用一个数值来处理它,每次转换都失败,intfloat

我尝试将其转换为 UTF-8 字符串

text = labels[1].get_text()
text.encode('utf8')
# '\xe2\x88\x921'

但它又是正确打印的东西,并在转换时引发错误。我也查看了 unicodedata 模块,但看起来它只能转换单个字符,所以在这种情况下是无用的。我也尝试过使用 unicodedata.normalize 和任何可能的格式规范化字符串,但还是没有成功。

我移动到 pipy 模块 unidecode(如 Python and character normalization 中的建议),同样没有成功

from unidecode import unidecode
unidecode(text)
# '[?]1'

我也尝试使用 Non-ASCII characters in Matplotlib 中的解决方案来避免字体问题,但结果相同(我不确定它是否应该做点什么,因为这是一个可视化问题......)。问题Accented characters in Matplotlib也有类似的问题,关注的是可视化而不是值(value)本身

我开始感到有点迷茫...我知道 python 2.7 有一些 unicode“困难”,但通常我可以通过某种方式避免它们。

我知道问题出在减号上,因为我可以使用粗暴替换罪魁祸首来避免这个问题:

text.replace(u'\u2212', '-')
# u'-1'

但这与其说是解决方案,不如说是 hack,而且我几乎可以肯定它在不同系统中不稳定,所以我想要更接近解决方案的东西。

我在工作

  • python 2.7.3
  • matplotlib 1.2.0
  • pylab 1.7.0
  • IPython 0.13.1

在 Kubuntu 12.10 上。

非常感谢您的帮助!

编辑:

更正了情节的顺序,因为我把 x 和 y 颠倒了,抱歉

编辑2:

此链接中有类似的信息:http://www.coniferproductions.com/2012/12/17/unicode-character-dump-in-python/

最后,它展示了在某些书籍中使用的减号如何在美学上更令人愉悦,但 python 解释器却不将其识别为有效字符。

编辑3:

谜语已解。 matplotlib 返回的字符是“减号”,即减号的正确打印符号。键盘创建的那个实际上是“HYPHEN-MINUS”,这是常用的但在排版上不正确。在维基百科上查看解释 http://en.wikipedia.org/wiki/Hyphen-minus .

因此,我使用的简单替换实际上是正确的实际做法,但“道德上”是 python(2.7 和 3.x 类似)中的错误,无法识别减号的正确符号。

请参阅 http://bugs.python.org/issue6632 中的错误跟踪

编辑4:

要禁用此行为,matplotlib 上有一个简单的解决方案,只需在 .matplotlibrc 中或以编程方式修改 rcparams。

import matplotlib as mpl
mpl.rcParams['axes.unicode_minus']=False

最佳答案

所有有效的 unicode 字符都有名称。我们可以检查名称中已识别的数字词 (DIGIT.keys()),并在此基础上用“普通”数字字符 (DIGIT.values()) 替换给定的unicode 标签:

import matplotlib.pyplot as plt
import unicodedata as UD

DIGIT = {
'MINUS': u'-',
'ZERO': u'0',
'ONE': u'1',
'TWO': u'2',
'THREE': u'3',
'FOUR': u'4',
'FIVE': u'5',
'SIX': u'6',
'SEVEN': u'7',
'EIGHT': u'8',
'NINE': u'9',
'STOP': u'.'
}

def guess(unistr):
return ''.join([value for u in unistr
for key,value in DIGIT.iteritems()
if key in UD.name(u)])

fig, ax = plt.subplots(1)
ax.plot([-1, 0, 1, 2], range(4))
plt.savefig('/tmp/test.png')
labels = ax.get_xticklabels()
for label in labels:
label = label.get_text()
print(guess(label))

产量

-1.0
-0.5
0.0
0.5
1.0
1.5
2.0

关于python - unicode减号的转换(来自matplotlib ticklabels),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15538099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com