Skip to main content
 首页 » 编程设计

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

2025年05月04日12jirigala

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

这是我用来生成图像的 mwe,但请注意,在实际程序中,绘图函数不能直接访问并从不同的文件加载。此外,不应修改 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。

请您参考如下方法:

我会稍微不同地处理这个问题。在像您这样的情况下,我总是建议在使用 label 关键字绘图时传递图例条目。然后,要使用选定的图例,您可以使用 get_legend_handles_labels(),然后将所需的项目传递给 fig.legend()。您不必指定 handles 和 labels 参数。但是,如果您指定了一个(就像您对 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()  

下面是回答@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()