我想在这样的多功能中逐步建立一个情节
示例
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np
def plot_on_axis(ax: plt.Axes, x: np.ndarray, y: np.ndarray, color, name) -> plt.Axes:
ax.plot(x, y, color=color, label="orig")
ax.plot(x, y + 0.2, "--", color=color, label="shifted")
patch = mpatches.Patch(color=color, label=name)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles + [patch], labels + [name])
return ax
def get_fig() -> plt.Figure:
x1 = np.linspace(0, 3)
y1 = np.sin(x1)
x2 = np.linspace(0, 3)
y2 = np.cos(x2)
fig = plt.figure()
ax = fig.subplots()
plot_on_axis(ax, x1, y1, "tab:blue", "sin")
plot_on_axis(ax, x2, y2, "tab:orange", "cos")
return fig
get_fig().show()
问题
但是,这会覆盖图例中的sin
条目,因此仅显示cos
因为对get_legend_handles_labels
的第二次调用仅返回四个元素,而不是相加的一个(如果它将返回全部,则将存在sin
的重复条目)。
有没有办法在plot_on_axis
中构建图例,或者应该在get_fig
中处理图例?在plot_on_axis
中处理它对我来说似乎要优雅得多,除了这个问题。
或者,是否有更好的方式将条目的分组传达给图的查看者?
1条答案
按热度按时间eoigrqb61#
您可以返回一个
Artist
的列表,而不是返回您根本不使用的Axes
示例,然后使用这些美工人员在get_fig
中创建自定义图例。使用
ax.legend(handles, labels, ncol=2)
可能是进一步分离两组数据的好方法: