Matplotlib 系列之「Legend 图例」

共计 4412 字,阅读预计 10 分钟

Matplotlib 的 Legend 图例就是为了帮助我们展示每个数据对应的图像名称,更好的让读者认识到你的数据结构。

如图,红色标注部分就是 Legend 图例。

在之前的一篇文章 Matplotlib 系列之「绘制函数图像」 中已经细讲过 Matplotlib 的绘制过程以及结构分析,希望读者能先去了解一下。

接着上一次的代码继续讲解 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 的图像结构,现在可以进行回顾一下。

Title 为图像标题,Axis 为坐标轴, Label 为坐标轴标注,Tick 为刻度线,Tick Label 为刻度注释,Legend 为图例。

设置 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:

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')
loc 使用参数

整数,字符串或浮点偶对,默认为 'upper right'。

Legend 常见参数速查表

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参数(出于便利,注意numpointslegend()函数上的一个关键字)。 然后我们可以将实例的字典作为关键字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有两个(默认值)。

原文发布于微信公众号 - Python梦工厂(AzMark950831)

原文发表时间:2018-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

一致性hash算法清晰详解!

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 ...

992
来自专栏北京马哥教育

详解 Python qrcode 二维码模块

1、version:控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时...

1390
来自专栏Python中文社区

详解 Python qrcode 二维码模块

1、version:控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时...

1330
来自专栏王小雷

R语言基础命令与安装

1. R的安装过程 1.1.首先附上清华线路的下载链接Windows版3.3.1 1.2. 选择安装路径 ? 1.3. 注意根据自己的计算机位数选择,如我的是6...

2415
来自专栏后端技术探索

一致性hash算法清晰详解!

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 ...

812
来自专栏简书专栏

基于tensorflow+CNN的搜狐新闻文本分类

tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流。 CNN是convolutional neural netwo...

2902
来自专栏性能与架构

算法中描述复杂度的大O是什么意思?

简介 算法是解决问题的方法,通常一个问题会有多种解决方法,就是有多种算法,那么我们如何决定哪个算法更好或者更高效呢? 为了描述一个算法的效率,就用到了这个大O,...

3415
来自专栏后端技术探索

一致性hash算法清晰详解!

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 ...

1021
来自专栏用户2442861的专栏

一致性hash算法 - consistent hashing

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 ...

1041
来自专栏翻译

路径查找器AI

问题源于我想建立一个游戏AI,它要能够定义一条从起点到终点的路径,同时避开路上的墙壁障碍物。为此,我写了一个C#库(path.dll),它允许定义一个二维空间(...

2357

扫码关注云+社区

领取腾讯云代金券