matplotlib 图例中的颜色与图形颜色不匹配

ryhaxcpt  于 2023-04-06  发布在  其他
关注(0)|答案(4)|浏览(536)

我正在尝试制作自定义图例,仅显示部分绘制的线。然而,图例中的颜色并不总是与绘制的线的颜色匹配。在示例中,图例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

rdrgkggo

rdrgkggo1#

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

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()
mefy6pfw

mefy6pfw2#

当我运行你的代码时,我收到来自legend.py的警告:

UserWarning: You have mixed positional and keyword arguments, some input may be discarded.
  warnings.warn("You have mixed positional and keyword "...

这可能是它不工作的原因。你需要在图例调用中添加handles

fig.legend(handles=[lines[0],lines[1]],...

顺便说一句,在创建打印时指定标签是一种很好的做法。

ax.plot(x, y, label='some label')

然后你可以打电话

handles, labels = ax.get_legend_handles_labels()

并在图例中这样使用它们

fig.legend(handles=(handles[0],handles[2]), labels=(labels[0],labels[2]),...)
flmtquvp

flmtquvp3#

当查看figure.legend的文档时,我们可以看到标签必须与句柄一起使用(或者以另一种方式)。您必须同时放置句柄和标签,或者一个都不放。
这个管用

fig.legend(lines, range(4), loc=1, title="legend 1")
fig.legend((lines[0],lines[1]), ("0","1"), loc=2, title="legend 2")
fig.legend((lines[0],lines[2]), ("0","2"), loc=3, title="legend 3")

这个也行

fig.legend(handles=lines, labels=range(4), loc=1, title="legend 1")
fig.legend(handles=(lines[0],lines[1]), labels=("0","1"), loc=2, title="legend 2")
fig.legend(handles=(lines[0],lines[2]), labels=("0","2"), loc=3, title="legend 3")
wf82jlnq

wf82jlnq4#

使用handles关键字参数:

fig.legend(handles=lines, labels=range(4), loc=1, title="legend 1")
fig.legend(handles=[lines[0],lines[1]], labels=["0","1"], loc=2, title="legend 2")
fig.legend(handles=[lines[0],lines[2]], labels=["0","2"], loc=3, title="legend 3")

相关问题