【问题标题】:Subtitles within Matplotlib legendMatplotlib 图例中的字幕
【发布时间】:2016-11-22 15:13:10
【问题描述】:

我正在使用 matplotlib 进行一些绘图,并且我有一个图例,它告诉查看器使用哪些传感器记录了这些点。有多种类型的传感器,我想在图例中加上字幕来告诉观众每组是什么类型的传感器。我有一个可行的解决方案,但它有点小技巧,如下所示:

创建图例时,它接受两个重要参数:图例标记列表和图例标签列表。我目前的解决方案是将字幕标记设置为带有白色轮廓的白色框,并让字幕标签被两个换行符包围。看起来还可以,但是如果字幕不缩进的话会显得专业很多。我尝试过的两种解决方法是将字幕的标记设置为无,并将字幕的标记设置为所需的字幕字符串,并将其标签设置为空字符串。两者都没有工作。有人对这个有经验么?非常感谢。

【问题讨论】:

  • 这是我得到的最接近的结果:stackoverflow.com/questions/21570007/…
  • 您考虑过手动编辑 svg 吗?这是最后的手段,但除非你有很多数字,否则你可以比找到程序化解决方案更快。

标签: python matplotlib plot legend cartopy


【解决方案1】:

我能想到的最好办法是为字符串制作一个自定义处理程序。

import matplotlib.pyplot as plt
import matplotlib.text as mtext


class LegendTitle(object):
    def __init__(self, text_props=None):
        self.text_props = text_props or {}
        super(LegendTitle, self).__init__()

    def legend_artist(self, legend, orig_handle, fontsize, handlebox):
        x0, y0 = handlebox.xdescent, handlebox.ydescent
        title = mtext.Text(x0, y0, r'\underline{' + orig_handle + '}', usetex=True, **self.text_props)
        handlebox.add_artist(title)
        return title


[line1] = plt.plot(range(10))
[line2] = plt.plot(range(10, 0, -1), 'o', color='red')
plt.legend(['Title 1', line1, 'Title 2', line2], ['', 'Line 1', '', 'Line 2'],
           handler_map={basestring: LegendTitle({'fontsize': 18})})

plt.show()

我基于http://matplotlib.org/users/legend_guide.html 中的示例。

【讨论】:

  • 我很高兴能够启动并运行您的解决方案;看起来很精彩。不幸的是,当我尝试在我的机器上运行它时,它会产生错误:RuntimeError:LaTeX 无法处理以下字符串:'\\\\underline{' 关于发生了什么的任何想法?
  • 我能够通过将 r'\underline{' + orig_handle + '}' 更改为 orig_handle 并删除 usetex = True 来使其工作。它没有下划线,但它完全有效!
  • 我非常喜欢这个解决方案。此外,用户 JabberwockStomp 的评论对我很有用。由于我使用的是 Python 3 而不是 Python 2,因此我不得不将 handler_map={basestring: LegendTitle({'fontsize': 18})} 替换为 handler_map={str: LegendTitle({'fontsize': 18})}
猜你喜欢
  • 2016-02-15
  • 2019-04-07
  • 2010-11-26
  • 1970-01-01
  • 2012-01-05
  • 2012-10-09
  • 2020-08-06
  • 2016-12-03
  • 2013-10-18
相关资源
最近更新 更多