【问题标题】:Move existing legend in Matplotlib 1.5.1在 Matplotlib 1.5.1 中移动现有图例
【发布时间】:2016-02-22 19:48:16
【问题描述】:

我尝试了来自 previous question 的答案,但在 Matplotlib 1.5.1 中无济于事。

我有一个海底人物:

import seaborn as sns
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset("tips")
g = sns.jointplot("total_bill", "tip",  data = tips[["total_bill", "tip"]].applymap(lambda x : -np.log10(x)))

这不起作用:

g.ax_joint.legend(loc = 'lower right')

还有这个:

plt.legend(bbox_to_anchor=(1.05, 1), loc=4, borderaxespad=0.)

/usr/local/lib/python3.4/dist-packages/matplotlib/axes/_axes.py:520: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
  warnings.warn("No labelled objects found. "

在这种情况下,如何将现有图例定位到右下方?


目前不是一个优雅的解决方案:

ll = g.ax_joint.get_legend().get_texts()[0]._text
g.ax_joint.get_legend().remove()
g.ax_joint.text( -12, -12, ll,  fontsize=14)

不过,我相信应该有更好的办法。

【问题讨论】:

  • 在 MatPlotLib 文档页面上有一些示例,matplotlib.org/users/legend_guide.html
  • 有一些例子,但是如果我不向艺术家提供句柄,例如`loc=4`在我的情况下没有效果。如果是seaborn,我找不到我需要的把手。如果您知道如何获取它们,请分享。

标签: python matplotlib seaborn


【解决方案1】:

没有简单的方法(使用像 'lower right' 这样的字符串)来重新定位我知道的现有图例。

要获取现有图例的句柄,您可以使用legend.legendHandles()。对于标签,legend.get_texts() 将为您提供 Text 对象。为了检索实际标签,您最好使用.get_text() 而不是私有属性_text

以下内容会将现有图例的句柄和标签复制到新图例中。不会复制图例的其他属性。

legend = g.ax_joint.get_legend()
labels = (x.get_text() for x in legend.get_texts())
g.ax_joint.legend(legend.legendHandles, labels, loc='lower right')

我之前建议使用ax.get_legend_handles_labels(),但这将在坐标轴中搜索,而不是在图例中,并且在这种情况下没有用。

【讨论】:

  • 不幸的是,这有效果但没有意义:返回的handleslabels 是空的,第二个操作从图中删除了图例。句柄为空的事实很奇怪,因为ll = g.ax_joint.get_legend().get_texts()[0]._text 确实返回了显示的文本。请参阅上面的完整可测试示例。
  • @DinaLituiev 您说得对,先生,ax.get_legend_handles_labels() 不适用于您的情况。我遇到了load_dataset 调用的问题,不得不用一个误导我的虚构示例进行测试。查看我的编辑。
猜你喜欢
  • 2021-10-19
  • 2014-06-07
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
相关资源
最近更新 更多