我有一个图,其中我需要以线型,颜色和标记编码的信息。但是,当我创建图例时,标记覆盖了大部分线条,导致线型难以识别。例如:
是否可以将标记移动到侧面(左或右),以便整个线条及其线条样式可见?类似于以下内容(在inkscape中手动移动):
oewdyzsn1#
一个想法是画一个更长的句柄(例如plt.legend(handlelength=4.0))。此外,可以使用两个点,而不是中心的一个点,每端一个(plt.legend(numpoints=2))。下面是一个示例:
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()
1条答案
按热度按时间oewdyzsn1#
一个想法是画一个更长的句柄(例如
plt.legend(handlelength=4.0)
)。此外,可以使用两个点,而不是中心的一个点,每端一个(plt.legend(numpoints=2)
)。下面是一个示例:
一个更复杂的方法是使用新的元组处理程序(legend guide)并创建具有两个处理程序的元组。第一个处理程序将仅包含行样式(删除标记),第二个处理程序将仅包含标记(删除行样式):