matplotlib从起点出发(8)_Tutorial_8_Legend

1 图例教程

在matplotlib中灵活地生成Legend。

本图例指南是legend()中可用文档的扩展——在继续阅读本指南之前,请确保你熟悉legend()文档的内容。

本指南使用了一些常用术语,为清楚起见,此处记录了这些术语:

  • legend entry
    图例由一个或多个图例entry(条目)组成。entry(条目)仅由一个键和一个标签组成。

  • legend key
    每个图例标签左侧的彩色/图案标记。

  • legend label
    描述由键表示的句柄的文本。

  • legend handle
    用于在图例中生成相应条目的原始对象。

2 控制图例的条目

调用不带参数的legend()会自动获取图例句柄及其关联的标签。此功能等效于:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels)

get_legend_handles_labels()函数返回轴上存在的句柄/artist列表,可用于为生成的图例生成条目——值得注意的是,并非所有的artist都可以添加到图例中,此时必须创建一个“代理”(请参阅创建专门用于添加到图例的artist,又名代理artist,以获取更多详细信息。)

注意
将忽略以空字符串作为标签或标签以下划线“_”开头的artist。

为了完全控制要添加到图例的内容,通常将适当的句柄直接传递给legend():

fig, ax = plt.subplots()
line_up, = ax.plot([1, 2, 3], label='Line 2')
line_down, = ax.plot([3, 2, 1], label='Line 1')
ax.legend(handles=[line_up, line_down])

在某些情况下,无法设置句柄的标签,因此可以将标签列表传递给legend()

fig, ax = plt.subplots()
line_up, = ax.plot([1, 2, 3], label='Line 2')
line_down, = ax.plot([3, 2, 1], label='Line 1')
ax.legend([line_up, line_down], ['Line Up', 'Line Down'])

3 创建专门用于添加到legend的artist(代理artist)

并非所有句柄都可以自动转换为图例条目,因此通常需要创建一个可以的artist。图例句柄不必存在于Figure或Axes上即可使用。

假设我们想创建一个图例,其中包含一些由红色表示的数据条目:

import matplotlib.patches as mpatches
import matplotlib.pyplot as pltfig, ax = plt.subplots()
red_patch = mpatches.Patch(color='red', label='The red data')
ax.legend(handles=[red_patch])plt.show()

在这里插入图片描述

有许多受支持的图例句柄。我们可以创建一条带有标记的线,而不是创建色块:

import matplotlib.lines as mlinesfig, ax = plt.subplots()
blue_line = mlines.Line2D([], [], color='blue', marker='*',markersize=15, label='Blue stars')
ax.legend(handles=[blue_line])plt.show()

在这里插入图片描述

如图,图例换成了一条带有蓝色星星的线。

3 图例位置

图例的位置可以通过关键字参数loc进行指定。有关更多详细信息,请参阅legend()中的文档。

bbox_to_anchor关键字为手动图例放置提供了很大程度的控制。例如,如果你希望axes图例位于图形的右上角而不是axes的角,只需指定角的位置和该位置的坐标系:

ax.legend(bbox_to_anchor=(1, 1),bbox_transform=fig.transFigure)

自定义图例放置的更多示例:

fig, ax_dict = plt.subplot_mosaic([['top', 'top'], ['bottom', 'BLANK']],empty_sentinel="BLANK")
ax_dict['top'].plot([1, 2, 3], label="test1")
ax_dict['top'].plot([3, 2, 1], label="test2")
# Place a legend above this subplot, expanding itself to
# fully use the given bounding box.
ax_dict['top'].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc='lower left',ncols=2, mode="expand", borderaxespad=0.)ax_dict['bottom'].plot([1, 2, 3], label="test1")
ax_dict['bottom'].plot([3, 2, 1], label="test2")
# Place a legend to the right of this smaller subplot.
ax_dict['bottom'].legend(bbox_to_anchor=(1.05, 1),loc='upper left', borderaxespad=0.)

在这里插入图片描述

Figure的图例

有时,相对于(子)图形而不是单个Axes来放置图例会更有意义。通过使用constrained_layout并在loc关键字参数的开头指定外部,图例将绘制在(子)图的Axes区域之外。

fig, axs = plt.subplot_mosaic([['left', 'right']], layout='constrained')axs['left'].plot([1, 2, 3], label="test1")
axs['left'].plot([3, 2, 1], label="test2")axs['right'].plot([1, 2, 3], 'C2', label="test3")
axs['right'].plot([3, 2, 1], 'C3', label="test4")
# Place a legend to the right of this smaller subplot.
fig.legend(loc='outside upper right')

在这里插入图片描述

这里接收的语法与普通loc关键字略有不同,其中“外右上”与“外上右”不同。
在这里插入图片描述

在这里插入图片描述

4 同一Axes上的多个图例

有时,将图例条目拆分到 多个图例中会更清晰。虽然这样做的一个基本方法可能是多次调用legend()函数,但你会发现Axes上只存在一个图例。这样做是为了可以重复调用legend()以将图例更新到 Axes上的最新句柄。要保留旧的图例实例,我们必须手动将它们添加到 Axes 中:

fig, ax = plt.subplots()
line1, = ax.plot([1, 2, 3], label="Line 1", linestyle='--')
line2, = ax.plot([3, 2, 1], label="Line 2", linewidth=4)# Create a legend for the first line.
first_legend = ax.legend(handles=[line1], loc='upper right')# Add the legend manually to the Axes.
ax.add_artist(first_legend)# Create another legend for the second line.
ax.legend(handles=[line2], loc='lower right')plt.show()

在这里插入图片描述

5 图例句柄

为了创建图例条目,句柄作为参数提供给相应的HandlerBase子类。处理程序子类的选择由以下规则确定:

  1. 使用handler_map关键字中的值更新get_legend_handler_map();
  2. 检查句柄是否在新创建的handler_map中;
  3. 检查句柄的类型是否在新创建的handler_map中;
  4. 检查句柄的mro中的任何类型是否位于新创建的handler_map中。

为了完整起见,此逻辑主要在get_legend_handler()中实现。

所有这些灵活性意味着我们有必要的钩子来为我们自己的图例键类型实现自定义处理程序。

使用自定义处理程序的最简单示例是实例化现有legend_handler之一。处理程序库子类。为了简单起见,让我们选择legend_handlerHandlerLine2D接受numpoints参数(为了方便起见,numpoints也是legend()函数上的关键字)。然后,我们可以将实例到Handler的映射作为图例的关键字传递。

from matplotlib.legend_handler import HandlerLine2Dfig, ax = plt.subplots()
line1, = ax.plot([3, 2, 1], marker='o', label='Line 1')
line2, = ax.plot([1, 2, 3], marker='o', label='Line 2')ax.legend(handler_map={line1: HandlerLine2D(numpoints=4)})

在这里插入图片描述

如你所见,“第1行”现在有4个标记点,其中“第2行”有2个(默认值)。尝试上面的代码,只将map的键从第1行更改为type(第1行)。请注意,现在两个Line2D实例都有4个标记。

除了复杂给力类型(如误差图、词干图和直方图)的处理程序外,默认handler_map还有一个特殊的元组处理程序(legend_handler.HandlerTuple),它只是将给定元组中的每个项目的句柄绘制在彼此之上。以下示例演示了将两个图例键相互叠加的组合:

from numpy.random import randnz = randn(10)fig, ax = plt.subplots()
red_dot, = ax.plot(z, "ro", markersize=15)
# Put a white cross over some of the data.
white_cross, = ax.plot(z[:5], "w+", markeredgewidth=3, markersize=15)ax.legend([red_dot, (red_dot, white_cross)], ["Attr A", "Attr A+B"])

在这里插入图片描述

legend_handler.HandlerTuple类还可用于将多个图例键分配给同一条目:

from matplotlib.legend_handler import HandlerLine2D, HandlerTuplefig, ax = plt.subplots()
p1, = ax.plot([1, 2.5, 3], 'r-d')
p2, = ax.plot([3, 2, 1], 'k-o')l = ax.legend([(p1, p2)], ['Two keys'], numpoints=1,handler_map={tuple: HandlerTuple(ndivide=None)})

在这里插入图片描述

实现自定义图例处理程序

可以实现自定义处理程序以将任何句柄转换为图例键(句柄不一定需要是matplotlib artist)。处理程序必须实现一个legend_artist方法,该方法返回单 个artist供图例使用。legend_artist所需的签名记录在legend_artist的文档中。

import matplotlib.patches as mpatchesclass AnyObject:passclass AnyObjectHandler:def legend_artist(self, legend, orig_handle, fontsize, handlebox):x0, y0 = handlebox.xdescent, handlebox.ydescentwidth, height = handlebox.width, handlebox.heightpatch = mpatches.Rectangle([x0, y0], width, height, facecolor='red',edgecolor='black', hatch='xx', lw=3,transform=handlebox.get_transform())handlebox.add_artist(patch)return patchfig, ax = plt.subplots()ax.legend([AnyObject()], ['My first handler'],handler_map={AnyObject: AnyObjectHandler()})

在这里插入图片描述

或者,如果我们想全局接受AnyObject实例,而不需要一直手动设置handler_map关键字,我们可以注册新的处理程序:

from matplotlib.legend import Legend
Legend.update_default_handler_map({AnyObject: AnyObjectHandler()})

虽然这里的力量是显而易见的,但请记住,已经实现了许多处理程序,并且你想要实现的目标可能已经可以通过现有类轻松实现。例如,要生成椭圆图例键,而不是矩形图例键:

from matplotlib.legend_handler import HandlerPatchclass HandlerEllipse(HandlerPatch):def create_artists(self, legend, orig_handle,xdescent, ydescent, width, height, fontsize, trans):center = 0.5 * width - 0.5 * xdescent, 0.5 * height - 0.5 * ydescentp = mpatches.Ellipse(xy=center, width=width + xdescent,height=height + ydescent)self.update_prop(p, orig_handle, legend)p.set_transform(trans)return [p]c = mpatches.Circle((0.5, 0.5), 0.25, facecolor="green",edgecolor="red", linewidth=3)fig, ax = plt.subplots()ax.add_patch(c)
ax.legend([c], ["An ellipse, not a rectangle"],handler_map={mpatches.Circle: HandlerEllipse()})

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何自启动MySQL服务与解决MySQL字符集问题

1、自启动mysql服务 (1)查看mysql是否自启动(默认自启动) systemctl list-unit-files|grep mysqld.service (2)如不是enabled可以运行如下命令设置自启动 systemctl enable mysqld.sercice2、字符集…

企业架构LNMP学习笔记21

URL重写: ngx_http_rewrite_module 模块用于使用PCRE正则表达式更改请求URI,返回重定向,以及有条件地选择配置。 return 该指令用于结束结束规则的执行并返回状态码给客户端。 403 Forbidden.服务器已经理解请求,但是拒绝执行它 404 Not…

Python使用pymysql三方库操作 mysql数据库

为什么要使用pymysql 在使用Python工作与学习中难免会使用到mysql数据库,使用pymysql三方库可以让我们轻松的对数据库的记录进行操作,如创建、修改,删除表,如增加、删除、修改、查询数据表中的记录,下边记录一下pymysq…

0017Java程序设计-spr农业过程化管理系统

摘 要目 录系统设计开发环境 摘 要 本农业过程化管理系统就是建立在充分利用现在完善科技技术这个理念基础之上,并使用IT技术进行对农业过程化的管理,从而保证种植户能种植出优质的农作物,可以实现农业过程化的在线管理,这样保证…

HarmonyOS开发:走进静态共享包的依赖与使用

前言 在上一篇,我们进行了动态共享包的开发和使用,由于动态共享包有一定的局限性,比如,调用共享包资源还得要通过工具类进行调用,再比如仅用于应用内部代码、资源的共享,如果我想要开源,以远程依…

MAC终端美化

先看看效果: 1.安装on-my-zsh 打开终端,输出: sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)"安装过程中如果出现了链接超时的错误,不要慌,就再来一次&#x…

进程间通信(IPC)的方法:命名管道

使用管道时,一个进程的输出可成为另外一个进程的输入。 命名管道(Named pipe或FIFO)是一种类似于管道的特殊文件,但在文件系统上有一个名称,它允许以先进先出(FIFO, first in, first out)的方式存储有限数量的数据。它的使用类似于消息…

http请求头部(header)详解

目录 常见的请求头部字段 GET方法的使用方法: POST方法的使用方法: Accept字段的使用方法 Content-Type字段的使用 总结 在互联网协议中,HTTP请求头部(header)是一个非常重要的组成部分。它们是客户端和服务器之…

Vue + Element UI 前端篇(十):动态加载菜单

Vue Element UI 实现权限管理系统 前端篇(十):动态加载菜单 动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的。 我们在这里就用上一篇准备好的数据格式Mock出模…

Spring boot 第一个程序

新建工程 选择spring-boot版本 右键创建类TestController: 代码如下: package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springf…

【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …

内网穿透:FRP(Forwarding Remote Proxy)反向代理

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透 下载地址 https://github.com/fatedier/frp/releases 选择最新的就行,linux和windo…

ac7260网卡不能连5g

之前路由器是双频,最近为了连物联网一堆,把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了,连4g可以,但是连5g网络就不行,连上却没网,导致网盘下东西慢。刚开始以为是tplink的易展问题,结果看…

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎,它是小型且经过时间考验的数据库引擎,sqflite软件包提供了许多函数,可以有效地与SQLite数据库一起使用,它提供了操作SQLite数据…

sql:SQL优化知识点记录(十)

(1)慢查询日志 Group by的优化跟Order by趋同,只是多了一个having 开启慢查询日志: 演示一下慢sql:4秒之后才会出结果 查看一下:下方显示慢查询的sql (2)批量插入数据脚本 函数和存…

【广州华锐互动】智慧园区3D数据可视化系统有什么作用?

随着科技的不断发展,智慧园区3D数据可视化系统已经成为了现代园区管理的重要组成部分。它通过将大量的数据进行整合、分析和展示,为企业提供了一个直观、高效的数据管理平台,帮助企业实现精细化管理,提高运营效率,降低…

Python实操 PDF自动识别并提取Excel文件

最近几天,paddleOCR开发了新的功能,通过将图片中的表格提取出来,效果还不错,今天,作者按照步骤测试了一波。 首先,讲下这个工具是干什么用的:它的功能主要是针对一张完整的PDF图片,可…

uni-app 可视化创建的项目 移动端安装调试插件vconsole

可视化创建的项目,在插件市场找不到vconsole插件了。 又不好npm install vconsole 换个思路,先创建一个cli脚手架脚手架的uni-app项目,然后再此项目上安装vconsole cli脚手架创建uni-app项目 安装插件 项目Terminal运行命令:npm…

Docker-基础命令使用

文章目录 前言命令帮助命令执行示意图docker rundocker psdocker inspectdocker execdocker attachdocker stopdocker startdocker topdocker rmdocker prune参考说明 前言 本文主要介绍Docker基础命令的使用方法。 命令帮助 Docker命令获取帮助方法 # docker -h Flag shor…

python library reference

文章目录 1. 标准库2. Python标准库介绍3. 示例 1. 标准库 https://docs.python.org/zh-cn/3/library/ https://pypi.org/ https://pypi.org/search/ 2. Python标准库介绍 Python 语言参考手册 描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Pytho…