[英]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.