简体   繁体   English

使用多色线向 matplotlib 图中添加图例

[英]Adding a legend to a matplotlib plot with a multicolored line

Following the example on how to draw multicolored lines I can draw lines that change color along their length based on some color map.按照有关如何绘制多色线条的示例,我可以根据一些颜色图绘制沿其长度改变颜色的线条。 Trying to add a legend to the plot I added this code:尝试向情节添加图例,我添加了以下代码:

plt.legend([lc], ["test"],\
    handler_map={lc: matplotlib.legend_handler.HandlerLineCollection()})

This adds a legend to the plot (figure below) but the color of the icon in the legend does not relate at all to the colors of the line.这为绘图添加了一个图例(下图),但图例中图标的颜色与线条的颜色完全无关。 Is this the wrong way to try to add a legend to this plot, or is this a limitation of matplotlib?这是尝试向该图添加图例的错误方法,还是 matplotlib 的限制?

尝试带有图例的五彩线

The idea would be to show a line collection in the legend as well.这个想法也是在图例中显示一个线条集合。 There is no inbuilt way to do that but one may subclass HandlerLineCollection and create the respective LineCollection within its create_artists method.没有内置的方法可以做到这一点,但可以HandlerLineCollection并在其create_artists方法中创建相应的LineCollection

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLineCollection
from matplotlib.collections import LineCollection

class HandlerColorLineCollection(HandlerLineCollection):
    def create_artists(self, legend, artist ,xdescent, ydescent,
                        width, height, fontsize,trans):
        x = np.linspace(0,width,self.get_numpoints(legend)+1)
        y = np.zeros(self.get_numpoints(legend)+1)+height/2.-ydescent
        points = np.array([x, y]).T.reshape(-1, 1, 2)
        segments = np.concatenate([points[:-1], points[1:]], axis=1)
        lc = LineCollection(segments, cmap=artist.cmap,
                     transform=trans)
        lc.set_array(x)
        lc.set_linewidth(artist.get_linewidth())
        return [lc]

t = np.linspace(0, 10, 200)
x = np.cos(np.pi * t)
y = np.sin(t)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

lc = LineCollection(segments, cmap=plt.get_cmap('copper'),
                    norm=plt.Normalize(0, 10), linewidth=3)
lc.set_array(t)

fig, ax = plt.subplots()
ax.add_collection(lc)

plt.legend([lc], ["test"],\
    handler_map={lc: HandlerColorLineCollection(numpoints=4)}, framealpha=1)

ax.autoscale_view()
plt.show()

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM