向LineCollection p添加图例

2024-10-01 09:26:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个与Set line colors according to colormap中给出的答案相关的派生问题,其中提出了一个很好的解决方案,根据颜色条用颜色绘制几条线(参见下面的代码和输出图像)。在

我有一个列表,其中存储与每一条打印线相关联的字符串,如下所示:

legend_list = ['line_1', 'line_2', 'line_3', 'line_4']

我想将这些字符串作为图例添加到绘图右上角的框中(第一个字符串对应于第一条绘制的直线,依此类推)。我怎么能这么做?在

如果有必要,我可以不使用LineCollection,但我需要保留colorbar和与之关联的每一行的颜色。在


<和输出

^{pr2}$

enter image description here


Tags: to字符串答案代码图像列表颜色line
2条回答

@ubuntu的答案是正确的,如果你有少量的行。(如果你想增加一个传奇人物,你可能会这么做!)在

不过,为了显示另一个选项,您仍然可以使用LineCollection,您只需要为图例使用“代理艺术家”:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.lines import Line2D

# The line format you curently have:
lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
         [(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
         [(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
         [(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]

# Reformat it to what `LineCollection` expects:
lines = [tuple(zip(x, y)) for x, y in lines]

z = np.array([0.1, 9.4, 3.8, 2.0])

fig, ax = plt.subplots()
lines = LineCollection(lines, array=z, linewidths=5,
                       cmap=plt.cm.rainbow, norm=plt.Normalize(z.min(), z.max()))
ax.add_collection(lines)
fig.colorbar(lines)

# Manually adding artists doesn't rescale the plot, so we need to autoscale
ax.autoscale()

def make_proxy(zvalue, scalar_mappable, **kwargs):
    color = scalar_mappable.cmap(scalar_mappable.norm(zvalue))
    return Line2D([0, 1], [0, 1], color=color, **kwargs)
proxies = [make_proxy(item, lines, linewidth=5) for item in z]
ax.legend(proxies, ['Line 1', 'Line 2', 'Line 3', 'Line 4'])

plt.show()

enter image description here

如果有大量的行,那么使用LineCollection比使用plt.plot要快,但是我还没有弄清楚如何在使用LineCollection时添加图例。{{artist{1}要创建一个代理,最好使用一个代理来创建一个行。在

既然你想要一个传说,你有少量的台词似乎是合理的。事实上,这是幸运的,因为试图用plt.plot绘制数千行是慢的秘诀。在

因此,如果您有少量的行,以下操作应该可以正常工作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
         [(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
         [(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
         [(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]

z = np.array([0.1, 9.4, 3.8, 2.0])

legend_list = ['line_1', 'line_2', 'line_3', 'line_4']

fig, ax = plt.subplots()
cmap = plt.get_cmap('rainbow')

def normalize(z):
    z = z.copy()
    z -= z.min()
    z /= z.max()
    return z

for (x, y), color, label in zip(lines, normalize(z), legend_list):
    plt.plot(x, y, label=label, color=cmap(color), lw=5)

m = cm.ScalarMappable(cmap=cmap)
m.set_array(z)
plt.colorbar(m)

ax.legend()
plt.savefig('/tmp/test.png')

enter image description here

相关问题 更多 >