我正在尝试制作自定义图例,仅显示部分绘制的线。然而,图例中的颜色并不总是与绘制的线的颜色匹配。在示例中,图例1和图例2是好的,但图例3应该显示蓝色和绿色,而不是蓝色和橙子。请参见附件图像。如何解决此问题?
这里是我用来生成图像的mwe,但请注意,在真实的程序中,plot函数不能直接访问,也不能从不同的文件加载。此外,plot函数不应被修改,因为它也在其他程序中使用。
import matplotlib.pyplot as plt
import numpy as np
def my_plot_function(x,y,ax):
#do complicated stuff here, manipulating y for example
ax.plot(x,y)
x = np.linspace(0,1,100)
fig = plt.figure()
ax = fig.add_subplot(111)
my_plot_function(x, x, ax)
my_plot_function(x, x**2, ax)
my_plot_function(x, x**3, ax)
my_plot_function(x, x**4, ax)
lines = ax.get_lines()
print(lines[0])
print(lines[1])
print(lines[2])
print(lines[3])
fig.legend(lines, labels=range(4), loc=1, title="legend 1")
fig.legend([lines[0],lines[1]], labels=["0","1"], loc=2, title="legend 2")
fig.legend([lines[0],lines[2]], labels=["0","2"], loc=3, title="legend 3")
plt.show()
编辑:
为了澄清我的要求:绘图需要由my_plot_function
完成,它在一个单独的文件中定义,不能修改。因此我不能传递额外的关键字,如label
。
4条答案
按热度按时间rdrgkggo1#
我会稍微不同地处理这个问题。在像你这样的情况下,我总是建议在使用
label
关键字绘图时传递图例条目。然后,要使用选定的图例,您可以使用get_legend_handles_labels()
,然后将所需的项传递给fig.legend()
。您不必指定handles
和labels
参数。但如果指定一个(就像您对labels
所做的那样),您还应该指定other,否则您将收到警告。另一种回答@gboffi评论的方法是,在不使用全局图例来提取值的情况下。
mefy6pfw2#
当我运行你的代码时,我收到来自
legend.py
的警告:这可能是它不工作的原因。你需要在图例调用中添加
handles
。顺便说一句,在创建打印时指定标签是一种很好的做法。
然后你可以打电话
并在图例中这样使用它们
flmtquvp3#
当查看figure.legend的文档时,我们可以看到标签必须与句柄一起使用(或者以另一种方式)。您必须同时放置句柄和标签,或者一个都不放。
这个管用
这个也行
wf82jlnq4#
使用
handles
关键字参数: