2012-11-05 70 views
3

我想从ipython笔记本的matplotlib图中获得“度”符号(°)。在ipython笔记本中的Unicode

当我运行

ax = plt.gca() 
ax.set_xlabel("something at 55" + unicode("\xc2", errors='replace')) 
ax.plot([0.,1.,], [0.,1.]) 

我得到一个情节,但不是程度的标志,我有问号的诡异的黑色正方形。当我尝试将savefig这个数字转换为PDF时,也会发生这种情况。

如果我尝试运行

ax = plt.gca() 
ax.set_xlabel("something at 55°") 
ax.plot([0.,1.,], [0.,1.]) 

我得到一个错误(见下文)。

任何想法我做错了什么?

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
/usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in show(close) 
    100  try: 
    101   for figure_manager in Gcf.get_all_fig_managers(): 
--> 102    send_figure(figure_manager.canvas.figure) 
    103  finally: 
    104   show._to_draw = [] 

/usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig) 
    188  """ 
    189  fmt = InlineBackend.instance().figure_format 
--> 190  data = print_figure(fig, fmt) 
    191  # print_figure will return None if there's nothing to draw: 

    192  if data is None: 

/usr/lib/python2.7/dist-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt) 
    102  try: 
    103   bytes_io = BytesIO() 
--> 104   fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight') 
    105   data = bytes_io.getvalue() 
    106  finally: 

/usr/lib/pymodules/python2.7/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs) 
    1981      orientation=orientation, 
    1982      dryrun=True, 
-> 1983      **kwargs) 
    1984     renderer = self.figure._cachedRenderer 
    1985     bbox_inches = self.figure.get_tightbbox(renderer) 

/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs) 
    467 
    468  def print_png(self, filename_or_obj, *args, **kwargs): 
--> 469   FigureCanvasAgg.draw(self) 
    470   renderer = self.get_renderer() 
    471   original_dpi = renderer.dpi 

/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in draw(self) 
    419 
    420   try: 
--> 421    self.figure.draw(self.renderer) 
    422   finally: 
    423    RendererAgg.lock.release() 

/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs) 
    53  def draw_wrapper(artist, renderer, *args, **kwargs): 
    54   before(artist, renderer) 
---> 55   draw(artist, renderer, *args, **kwargs) 
    56   after(artist, renderer) 
    57 

/usr/lib/pymodules/python2.7/matplotlib/figure.pyc in draw(self, renderer) 
    896   dsu.sort(key=itemgetter(0)) 
    897   for zorder, a, func, args in dsu: 
--> 898    func(*args) 
    899 
    900   renderer.close_group('figure') 

/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs) 
    53  def draw_wrapper(artist, renderer, *args, **kwargs): 
    54   before(artist, renderer) 
---> 55   draw(artist, renderer, *args, **kwargs) 
    56   after(artist, renderer) 
    57 

/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in draw(self, renderer, inframe) 
    1995 
    1996   for zorder, a in dsu: 
-> 1997    a.draw(renderer) 
    1998 
    1999   renderer.close_group('axes') 

/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs) 
    53  def draw_wrapper(artist, renderer, *args, **kwargs): 
    54   before(artist, renderer) 
---> 55   draw(artist, renderer, *args, **kwargs) 
    56   after(artist, renderer) 
    57 

/usr/lib/pymodules/python2.7/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs) 
    1052   self._update_label_position(ticklabelBoxes, ticklabelBoxes2) 
    1053 
-> 1054   self.label.draw(renderer) 
    1055 
    1056   self._update_offset_text_position(ticklabelBoxes, ticklabelBoxes2) 

/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs) 
    53  def draw_wrapper(artist, renderer, *args, **kwargs): 
    54   before(artist, renderer) 
---> 55   draw(artist, renderer, *args, **kwargs) 
    56   after(artist, renderer) 
    57 

/usr/lib/pymodules/python2.7/matplotlib/text.pyc in draw(self, renderer) 
    524   renderer.open_group('text', self.get_gid()) 
    525 
--> 526   bbox, info = self._get_layout(renderer) 
    527   trans = self.get_transform() 
    528 

/usr/lib/pymodules/python2.7/matplotlib/text.pyc in _get_layout(self, renderer) 
    303   baseline = 0 
    304   for i, line in enumerate(lines): 
--> 305    clean_line, ismath = self.is_math_text(line) 
    306    if clean_line: 
    307     w, h, d = get_text_width_height_descent(clean_line, 

/usr/lib/pymodules/python2.7/matplotlib/text.pyc in is_math_text(s) 
    987    return s, 'TeX' 
    988 
--> 989   if cbook.is_math_text(s): 
    990    return s, True 
    991   else: 

/usr/lib/pymodules/python2.7/matplotlib/cbook.pyc in is_math_text(s) 
    1836  except UnicodeDecodeError: 
    1837   raise ValueError(
-> 1838    "matplotlib display text must have all code points < 128 or use Unicode strings") 
    1839 
    1840  dollar_count = s.count(r'$') - s.count(r'\$') 

ValueError: matplotlib display text must have all code points < 128 or use Unicode strings 

回答

10

错误消息告诉你该怎么做:

ValueError: matplotlib display text must have all code points < 128 
or use Unicode strings 

让你xlabel Unicode字符串:

ax.set_xlabel(u"something at 55°") 
+0

感谢您的支持!我认为我的第一个版本是相当的,但显然我需要了解Python和Unicode –

+0

这很完美!一个'你'在前面和工作完成...谢谢! – PopMilo

3

的问题是,你正在使用的字体写的标签没有°符号。尝试使用matplotlib的mathtext来代替并使用胶乳格式化°:

ax.set_xlabel("something at 55$^\circ$") 
+0

感谢您的评论!不幸的是,我不喜欢LaTeX打印度标志的方式,所以这不是一个真正的选择。 –

+0

+1。我认为字体确实有符号,只需要引用不同的字体,但LaTeX格式通常是要走的路。 – DSM