【问题标题】:Unicode plot markers in Python 3 and matplotlibPython 3 和 matplotlib 中的 Unicode 绘图标记
【发布时间】:2015-11-30 20:47:06
【问题描述】:

我有一个情节,我在 matplotlib 中使用各种 unicode 字符作为标记符号。例如:

plot(x, y, marker=ur"$\u25B2$", markeredgecolor='#262626', linewidth=1)

上面的命令是针对 python 2.7 的,我给它传递了一个 unicode 字符来表示一个向上的三角形。这在带有 matplotlib 1.4.x 的 python 2.7 中运行良好。最近我一直在尝试迁移到 python 3.5,并将上面的行更改为:

plot(x, y, marker=r"$\u25B2$", markeredgecolor='#262626', linewidth=1)

不幸的是,这在 python 3.5 和 matplotlib 1.5.0 中不起作用。我看不出我做错了什么。它给了我一种我无法理解的奇怪类型的错误(见下文)。我没有正确表示 unicode 字符,还是 matplotlib 本身有其他问题?

Traceback (most recent call last):
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/mathtext.py", line 2368, in parse
    result = self._expression.parseString(s)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1125, in parseString
    raise exc
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1115, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2624, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2378, in parseImpl
    loc, exprtokens = e._parse( instring, loc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2732, in parseImpl
    loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2361, in parseImpl
    loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1015, in _parseNoCache
    tokens = fn( instring, tokensStart, retTokens )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 779, in wrapper
    ret = func(*args[limit[0]:])
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/mathtext.py", line 2439, in math_string
    return self._math_expression.parseString(toks[0][1:-1])
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1125, in parseString
    raise exc
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1115, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2624, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2766, in parseImpl
    loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2624, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 2483, in parseImpl
    ret = e._parse( instring, loc, doActions )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1046, in _parseCache
    value = self._parseNoCache( instring, loc, doActions, callPreParse )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 1015, in _parseNoCache
    tokens = fn( instring, tokensStart, retTokens )
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/pyparsing.py", line 779, in wrapper
    ret = func(*args[limit[0]:])
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/mathtext.py", line 2525, in unknown_symbol
    raise ParseFatalException(s, loc, "Unknown symbol: %s" % c)
pyparsing.ParseFatalException: Unknown symbol: \u (at char 0), (line:1, col:1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "RTMEditor.py", line 783, in <module>
    main()
  File "RTMEditor.py", line 776, in main
    mw = RTMEditor(args.fname[0], dwx=args.s[0], dwy=args.s[0])
  File "RTMEditor.py", line 273, in __init__
    self.render_view()
  File "RTMEditor.py", line 520, in render_view
    markeredgecolor='#262626', zorder=3, linewidth=1)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/__init__.py", line 1811, in inner
    return func(ax, *args, **kwargs)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/axes/_axes.py", line 1427, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 386, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 374, in _plot_args
    seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 281, in _makeline
    self.set_lineprops(seg, **kwargs)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 189, in set_lineprops
    line.set(**kwargs)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/artist.py", line 937, in set
    ret.extend([func(v)])
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/lines.py", line 1072, in set_marker
    self._marker.set_marker(marker)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/markers.py", line 255, in set_marker
    self._recache()
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/markers.py", line 193, in _recache
    self._marker_function()
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/markers.py", line 331, in _set_mathtext_path
    usetex=rcParams['text.usetex'])
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/textpath.py", line 445, in __init__
    usetex=usetex)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/textpath.py", line 529, in text_get_vertices_codes
    ismath=ismath)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/textpath.py", line 148, in get_text_path
    prop, s)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/textpath.py", line 240, in get_glyphs_mathtext
    s, self.DPI, prop)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/mathtext.py", line 3118, in parse
    box = self._parser.parse(s, font_output, fontsize, dpi)
  File "/Users/dchandan/local/anaconda/lib/python3.5/site-packages/matplotlib/mathtext.py", line 2374, in parse
    six.text_type(err)]))
ValueError: 
\u25B2
^
Unknown symbol: \u (at char 0), (line:1, col:1)

Process finished with exit code 1

【问题讨论】:

    标签: python python-2.7 python-3.x matplotlib unicode


    【解决方案1】:

    您需要做的就是从r"$\u25B2$" 中删除rr 将字符串标记为原始字符串文字,这意味着不翻译转义序列。

    In [38]: x = np.linspace(0,10)
    
    In [39]: y = np.sin(np.linspace(0,10))
    
    In [40]: plt.plot(x, y, marker="$\u25b2$")
    Out[40]: [<matplotlib.lines.Line2D object at 0x110768da0>]
    

    【讨论】:

    • 成功了!那么为什么 python 2 需要 'r' 而 python 3 不需要呢?我删除了 'u' 因为 python 3 字符串是默认的 unicode。但我不明白 'r' 对 python 3 的作用。
    • @deepak r 实际上不是 Py2 所必需的(我使用的是 2.7.10 和 matplotlib 1.5.0),但 u is 是必需的表示它是一个 Unicode 字符串。由于 Python 3 中的所有字符串都是 Unicode,因此 u 不是必需的,尽管如果它在那里,它将被忽略。
    • 我收到以下错误:UnicodeEncodeError: 'ascii' codec can't encode character '\u25b2' in position 231: ordinal not in range(128)
    猜你喜欢
    • 2012-10-16
    • 2016-05-10
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2013-04-01
    • 2015-06-23
    • 2021-09-04
    相关资源
    最近更新 更多