Matplotlib 的 Legend 图例就是为了帮助咱们展现每一个数据对应的图像名称,更好的让读者认识到你的数据结构。python
如图,红色标注部分就是 Legend 图例。编程
在以前的一篇文章 Matplotlib 系列之「绘制函数图像」 中已经细讲过 Matplotlib 的绘制过程以及结构分析,但愿读者能先去了解一下。bash
接着上一次的代码继续讲解 Legend 图例如何展现,以及有哪些经常使用的特性。数据结构
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-3,3,50)
y1=2*x+1
y2=x**2
plt.figure(num=3,figsize=(8,5))
l1=plt.plot(x,y2)
l2=plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim((-1,2))
plt.ylim((-2,3))
new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.show()
复制代码
上一节中仔细绘制了 Matplotlib 的图像结构,如今能够进行回顾一下。ide
Title 为图像标题,Axis 为坐标轴, Label 为坐标轴标注,Tick 为刻度线,Tick Label 为刻度注释,Legend 为图例。函数
这里咱们将 Legend 图例设置成 如上图中所示,即 up 对应 y = 2x + 1,是一条实线,默认颜色,down 对应 y = x^2^ ,虚线,红色,最后调用 legend 方法设置一些样式便可。布局
# 设置 legend 图例
l1,=plt.plot(x,y1,label='linear line')
l2,=plt.plot(x,y2,color='red',linewidth=1.0,linestyle='--',label='square line')
plt.legend()
复制代码
不带参数调用 legend 会自动获取图例句柄及相关标签,此函数等同于:学习
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels)
复制代码
为彻底控制要添加的图例句柄,一般将适当的句柄直接传递给 legend:spa
plt.legend(handles=[l1, l2])
复制代码
在某些状况下,咱们须要为 legend 图例设置标签线程
plt.legend(handles=[l1, l2], labels=['up', 'down'])
复制代码
图例的位置能够经过关键字参数loc
指定。 bbox_to_anchor
关键字可以让用户手动控制图例布局。 例如,若是你但愿轴域图例位于图像的右上角而不是轴域的边角,则只需指定角的位置以及该位置的坐标系:
当咱们指定 loc = 'upper right',legend 图例将在右上角展现:
你还能够指定 loc 在任何你想要指定的位置:
plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='lower right')
复制代码
整数,字符串或浮点偶对,默认为 'upper right'。
Keyword | Description |
---|---|
loc | Location code string, or tuple (see below) |
fontsize | the font size (used only if prop is not specified) |
prop | the font property |
markerscale | the relative size of legend markers vs. original |
markerfirst | If True (default), marker is to left of the label |
numpoints | the number of points in the legend for line |
scatterpoints | he number of points in the legend for scatter plot |
scatteroffsets | a list of yoffsets for scatter symbols in legend |
frameon | If True, draw the legend on a patch (frame) |
shadow | If True, draw a shadow behind legend |
framealpha | Transparency of the frame |
edgecolor | Frame edgecolor |
facecolor | Frame facecolor |
fancybox | If True, draw the frame with a round fancybox |
ncol | number of columns |
borderpad | the fractional whitespace inside the legend border |
handlelength | the length of the legend hendles |
handletextpad | The pad between the legend handle and text |
borderaxespad | the pad between the axes and legend border |
columnspacing | the spacing between columns |
title | the legend title |
bbox_to_anchor | the bbox that the legend will be anchored |
bbox_tansform | the transform for the bbox,transAxes if None |
为了建立图例条目,将句柄做为参数提供给适当的HandlerBase
子类。 处理器子类的选择
有如下规则肯定:
handler_map
关键字中的值更新get_legend_handler_map()
。handler_map
中。handler_map
中。mro
中的任何类型是否在新建立的handler_map
中。处于完整性,这个逻辑大多在get_legend_handler()
中实现。
为了简单起见,让咱们选择matplotlib.legend_handler.HandlerLine2D
,它接受numpoints
参数(出于便利,注意numpoints
是legend()
函数上的一个关键字)。 而后咱们能够将实例的字典做为关键字handler_map
传给legend
。
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
# 设置legend图例
l1,=plt.plot(x,y1,marker = 'o',label='linear line')
l2,=plt.plot(x,y2,color='red',linewidth=1.0,marker = 'o',label='square line')
plt.legend(handler_map = {l1:HandlerLine2D(numpoints=4)},handles=[l1, l2], labels=['up', 'down'], loc='lower right')
复制代码
如你所见,up
如今有 4 个标记点,down
有两个(默认值)。
PS
特别抱歉,本周事情有点多,一直没有来得及更新。
这周经历了太多的事情:
一、在上海为了退房租,和房东大吵,报警,协商,最终仍是我输了,好无奈。【请广大上班族在租房子的时候必定要看好合同,别让奸商有隙可乘】
二、回家看爸妈,房租退了,准备来北京,因此在家呆了两三天,帮爸妈作点力所能及的事情。
三、踏上北京的征程,今天已是在北京的次日,心情天然是激动而喜悦的,对将来充满期待。