Matplotlib:在图例中移动标记位置

Posted

技术标签:

【中文标题】Matplotlib:在图例中移动标记位置【英文标题】:Matplotlib: Moving marker position inside legend 【发布时间】:2021-10-19 19:00:26 【问题描述】:

我有一个情节,其中我需要以线条样式、颜色和标记编码的信息。 但是,当我创建图例时,标记会覆盖大部分线条,导致线条样式难以识别。示例:

是否可以将标记移到一侧(左侧或右侧),以便整个线条及其线条样式可见?类似于以下内容(在 inkscape 中手动移动):

【问题讨论】:

【参考方案1】:

一个想法可能是画一个更长的手柄(例如plt.legend(handlelength=4.0))。此外,可以使用两个点代替中心的一个点,两端各一个 (plt.legend(numpoints=2))。

示例如下所示:

import matplotlib.pyplot as plt

plt.plot([0, 1], [2, 1], ls='-.', marker='D', color='r', label='A')
plt.plot([0, 1], [1, 0], ls='--', marker='D', color='b', label='B')
plt.legend(numpoints=2, handlelength=4.0)
plt.show()

更复杂的方法是使用新的tuple handler (legend guide) 并使用两个处理程序创建元组。第一个处理程序将仅包含线型(删除标记),第二个处理程序将仅包含标记(删除线型):

import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerTuple
from copy import copy

plt.plot([0, 1], [2, 1], ls='-.', marker='D', color='r', label='A')
plt.plot([0, 1], [1, 0], ls='--', marker='D', color='b', label='B')
handles, labels = plt.gca().get_legend_handles_labels()
new_handles = []
for h in handles:
    h1 = copy(h)
    h1.set_marker('')
    h2 = copy(h)
    h2.set_linestyle('')
    new_handles.append((h1, h2))
plt.legend(handles=new_handles, labels=labels, handlelength=4.0,
           handler_map=tuple: HandlerTuple(ndivide=None))
plt.show()

【讨论】:

以上是关于Matplotlib:在图例中移动标记位置的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib:从头开始制作彩色标记图例

Matplotlib 图例:标记上方的标签

matplotlib 图例标记仅一次

通过 matplotlib 图例中的标记删除线

通过 matplotlib 图例中的标记删除线

Matplotlib 获取图例标记的坐标