图例中的颜色与图表颜色不匹配

Han*_*bel 3 python graph matplotlib

我正在尝试制作自定义图例,仅显示一些绘制的线条。但是,图例中的颜色并不总是与绘制线的颜色匹配。在示例中,图例 1 和图例 2 很好,但图例 3 应显示蓝色和绿色,而不是蓝色和橙色。请参阅附图。我怎样才能解决这个问题?

图例 3 应为蓝色 (0) 和绿色 (2)

这是我用来生成图像的 mwe,但请注意,在实际程序中,绘图函数不能直接访问并从不同的文件加载。此外,不应修改绘图函数,因为它也在其他程序中使用。

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()
Run Code Online (Sandbox Code Playgroud)

编辑:
为了澄清我的要求:绘图需要通过my_plot_function在单独的文件中定义并且不能修改来完成。因此我无法向它传递其他关键字,例如label.

She*_*ore 5

我会稍微不同地处理这个问题。在像您这样的情况下,我始终建议在使用关键字进行绘图时传递图例条目label。然后,要使用选定的图例,您可以使用get_legend_handles_labels()并将所需的项目传递给fig.legend()。您不必指定handleslabels参数。但是,如果您指定一个(就像您为 所做的那样labels),您还应该指定另一个,否则您会收到警告

import matplotlib.pyplot as plt
import numpy as np

def plot(x,y,ax):
    ax.plot(x,y)

x = np.linspace(0,1,100)
fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(x, x, label='0')
ax.plot(x, x**2, label='1')
ax.plot(x, x**3, label='2')
ax.plot(x, x**4, label='3')
ax.legend(loc=1, title='legend 1')

h, l = ax.get_legend_handles_labels()

fig.legend([h[0],h[1]], [l[0], l[1]], loc=2, title="legend 2")
fig.legend([h[0],h[2]], [l[0], l[2]], loc=3, title="legend 3")
plt.show() 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

下面是回答@gboffi 评论的另一种方法,其中您不使用全局图例来提取值。

x = np.linspace(0,1,100)
fig = plt.figure()
ax = fig.add_subplot(111)

l0, = ax.plot(x, x, label='0')
l1, = ax.plot(x, x**2, label='1')
l2, = ax.plot(x, x**3, label='2')
l3, = ax.plot(x, x**4, label='3')

fig.legend([l0, l1], [l0.get_label(), l1.get_label()], loc=2, title="legend 2")
fig.legend([l0, l2], [l0.get_label(), l2.get_label()], loc=3, title="legend 3")
plt.show() 
Run Code Online (Sandbox Code Playgroud)