matplotlib 移动图例内的标记位置

8gsdolmq  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(175)

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

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

oewdyzsn

oewdyzsn1#

一个想法是画一个更长的句柄(例如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()

一个更复杂的方法是使用新的元组处理程序(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()

相关问题