pythonlegend函数设置图例_Matplotlib中修改曲线图例
(legend)
什么情况下需要修改legend
⼤多数情况下,⼀幅图中的曲线数⽬不多,容易区分,我们需要对每⼀条曲线进⾏注释,然后显⽰在图中。这件⼯作可以利⽤label和legend完成。
我们⾸先来看下⾯的代码和结果。注意这⾥plot函数中的label以及legend函数。
from pylab import *
from numpy import *
x=linspace(0,pi,20)
plot(x,sin(x),label='Sin')
plot(x,cos(x),label='Cos')
legend(loc=0,)
show()
我们给legend⼀个参数loc,就是这个注释要放的位置。当loc=0的时候,我们让程序⾃⼰去合适的地⽅放置。如果我们想指定的话,loclinspace numpy
有其他⼀些选项,这这在函数的⼿册中有。
但是当图中的曲线很多的时候,⼤家可以想象⼀下,这时候很可能我们每⼀条曲线都得有注释,这样注释的列表会⾮常长。再加上曲线较多,放在什么地⽅就⾮常讲究了。总之不能遮挡图中的数据。
另外,很多时候,图中的曲线是分类的,我们当然想让同类处于⼀个列表当中,或者我们的列表解释不同的内容。那么我们就需要多个legend,并且分别对应不同的内容,对应不同的位置。因此控制legend就尤为重要。下⾯我们来看⼀下怎么利⽤legend函数的接⼝实现这⼀点。
如何控制legend位置
如果我们需要任意指定位置的话,单靠loc是不⾏的。因为这些位置不仅固定死了,⽽且必须是在图内。这在很多时候是不合适的,为了可以⾃由地设定,legend提供了bbox_to_anchor这个默认参数,我们来看下⾯的代码,并且看⼀下它的含义。
from pylab import *
from numpy import *
x=linspace(0,pi,20)
plot(x,sin(x),label='Sin')
plot(x,cos(x),label='Cos')
legend(bbox_to_anchor=(0.15, 1.15),)
show()
⼤家会看到,现在legend跑到图外,注意bbox_to_anchor这两个参数,不难看出它给出了legend起点的坐标。当然如果我们把注释sin和cos写在⼀⾏是最好的,那么legend提供了ncol这个参数,⽤来实现这⼀点,代码和图如下。
from pylab import *
from numpy import *
x=linspace(0,pi,20)
plot(x,sin(x),label='Sin')
plot(x,cos(x),label='Cos')
legend(bbox_to_anchor=(0.5, 1.15),ncol=2)
show()
如何实现多个legend
如果我们要在⼀幅图中实现多个legend,那么稍微要复杂⼀些。⾸先我们要调⽤⼀次legend函数,让它返回⼀个实例,然后把这个实例添加到当前的图中。然后再调⽤⼀次legend,代码和图如下。注意函数gca。
from pylab import *
from numpy import *
x=linspace(0,pi,20)
plot(x,sin(x),label='Sin')
f1=legend(bbox_to_anchor=(0.5, 1.15),ncol=2)
gca().add_artist(f1)
plot(x,cos(x),label='Cos')
legend(bbox_to_anchor=(0.5, 0.0),ncol=2)
show()
⼤家会看到,尽管已经实现了两个legend,并且在不同的地⽅,但是第⼆个legend把所有曲线的注释都包含进去了,这不是我们想要的结果。这个时候,我们如果把sin和cos分开在两个legend中,就要使⽤另外⼀个参数,handles。并且我们要让plot函数返回line实例,把相应line放在相应legend的handles中即可,代码和图如下。
from pylab import *
from numpy import *
x=linspace(0,pi,20)
L1,=plot(x,sin(x),label='Sin')
L2,=plot(x,cos(x),label='Cos')
f1=legend(handles=[L1],bbox_to_anchor=(0.5, 1.15),ncol=2)
gca().add_artist(f1)
legend(handles=[L2],bbox_to_anchor=(0.5, 0.0),ncol=2)
show()
这样⼤家看到每⼀个legend都正常了。如果曲线⽐较多,分类放在handles中即可。
如何合并多条曲线的说明
下⾯给出⼀个合并两条曲线legend的例⼦,稍微⿇烦⼀点。⾸先给出代码和图。
from pylab import *
from matplotlib.legend_handler import HandlerTuple
from numpy import *
x=linspace(0,pi,20)
L1,=plot(x,sin(x),'b-x',label='Sin')
L2,=plot(x,cos(x),'r-d',label='Cos')
legend([(L1,L2)],['Cos and Sin'],handler_map={tuple: HandlerTuple(ndivide=None)})
show()
⾸先将L1和L2合并在⼀起,并在legend中指定label,还要从legend_handler中导⼊HandlerTuple。具体⼤家可以翻⽂档,⼤概的意思就是要根据第⼀个列表中组元的长度来显⽰。具体我也没搞明⽩为啥这个handler_map该怎么⽤。还好这段代码是万能。这样写总不会错。
通过控制legend的位置,数⽬,以及包含的曲线,基本上满⾜了实际的需求。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论