matplotlib图例使用案例1.1:在不同行或列的图例上添加title

我们将图例进行行显示或者列显示后,只能想继续赋予不同行或者列不同的title来进行分类。比较简单的方式,就是通过ax.annotate方法添加标签,这样方法复用率比较低,每次使用都要微调ax.annotate的显示位置。比较方便的方法是在案例1实现的基础上,添加title显示的功能。

motplotlib图例案例1:通过多个legend完全控制图例显示顺序(指定按行排序 or 按列排序)

添加title显示功能后的代码:

import matplotlib.pyplot as plt
import matplotlib.axes
from typing import List, Tuple, Any
#这个函数可以获得axis对象的已经绘制的artist中的所有的hander和labels,这个可以只给它一个axis参数。注意这个参数需要是列表类的。
from matplotlib.legend import _get_legend_handles_labels as get_legend_handles_labelsdef custom_legend_layout(axis: matplotlib.axes.Axes,handlers: List[Any]=None,labels: List[str]=None,n_items: int = 3,offset: float = 0.05,vertical: bool = False,loc: str = 'upper right',first_bbox_to_anchor: Tuple[float, float] = (1, 1),title:List[str]=None,title_shift:List[Tuple[float,float]]=None,**kwargs) -> None:"""A function to arrange legend items in a custom layout.:param axis: Axis object on which to place the legends.:param lines: List of line objects to include in the legends.:param labels: List of labels corresponding to the line objects.:param n_items: Number of items per row (if vertical=False) or column (if vertical=True).:param offset: Vertical offset between rows (or horizontal offset between columns if vertical=True).:param vertical: If True, legends are arranged vertically, otherwise horizontally.:param loc: Location anchor for all legends.:param first_bbox_to_anchor:  `~matplotlib.transforms.BboxBase` instance,Bbox anchor of the first legend.:param kwargs: Additional keyword arguments to pass to the legend function."""va_dict={"center":'center',"lower":'top',"upper":'bottom'}ha_dict={"center": 'center',"right":"left","left":"right",}if (handlers is None) != (labels is None):  # Check if only one of handlers or labels is providedraise ValueError("Both 'handlers' and 'labels' must be specified if one is provided.")if (handlers is None) and (labels is None): # get default handlers and labels from axhandlers,labels=get_legend_handles_labels(axs=[axis]) # note:  the param axs is list object# 确保n_items不为0,避免除以0的错误n_items = max(1, n_items)# 计算需要多少个图例n_legends = len(handlers) // n_items + (1 if len(handlers) % n_items else 0)# 计算每个图例的bbox_to_anchorfor i in range(n_legends):start_idx = i * n_itemsend_idx = min(start_idx + n_items, len(handlers))legend_lines = handlers[start_idx:end_idx]legend_labels = labels[start_idx:end_idx]if vertical:# 对于垂直布局ncol = 1if i == 0:bbox_anchor = first_bbox_to_anchorelse:# 计算后续图例的bbox_to_anchorbbox_anchor = (first_bbox_to_anchor[0] + i * offset, first_bbox_to_anchor[1])else:# 对于水平布局ncol = len(legend_lines)if i == 0:bbox_anchor = first_bbox_to_anchorelse:# 计算后续图例的bbox_to_anchorbbox_anchor = (first_bbox_to_anchor[0], first_bbox_to_anchor[1] - i * offset)legend = axis.legend(legend_lines, legend_labels, loc=loc, bbox_to_anchor=bbox_anchor, ncol=ncol, frameon=False, **kwargs)axis.add_artist(legend)# 计算每个title的位置va_key,ha_key=loc.split(" ")if title and len(title)==n_legends:w_shift= title_shift[i][0] if title_shift else 0h_shift=title_shift[i][1] if title_shift else 0axis.annotate(text=title[i],xy=(bbox_anchor[0]+w_shift, bbox_anchor[1]+h_shift),xycoords='axes fraction',va=va_dict[va_key],ha=ha_dict[ha_key])if __name__ == '__main__':# 示例使用这个函数fig, ax = plt.subplots()handlers = [ax.scatter(range(10), [i * x for x in range(10)], label=f'Line {i}') for i in range(7)]# 调用函数,横向排列图例custom_legend_layout(ax, n_items=3, offset=0.25, vertical=True,loc='upper left', first_bbox_to_anchor=(0.2, 0.8),title=["title 1","title 2","title 3"],#title_shift=[(-0.1,0),(-0.1,0),(-0.1,0)],)from matplotlib.legend import _get_legend_handles_labels as get_legend_handles_labelshandles,labels=get_legend_handles_labels([ax])plt.show()

运行后:

在这里插入图片描述

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

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

相关文章

基于jieba、TfidfVectorizer、LogisticRegression的垃圾邮件分类,模型平均得分为0.98左右(附代码和数据集)

基于jieba、TfidfVectorizer、LogisticRegression的垃圾邮件分类,模型平均得分为0.98左右(附代码和数据集)。 垃圾邮件分类识别是一种常见的文本分类任务,旨在将收件箱中的邮件分为垃圾邮件和非垃圾邮件。以下是一些常用的技术和方法用于垃圾邮件分类识别: 基于规则的过…

探索设计模式的魅力:迭代器模式让你轻松驾驭复杂数据集合

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 文章目录 一、💡 引言二、原理与结构 📚👥 迭代器模式的关…

处理MIGO 采购订单过账报错:物料账簿货币被更改

同事操作MIGO 采购订单过账报错:物料账簿货币被更改。 跟据查资料检查一下OKKP的配置。进去后发现了另一个报错: 然后再查资料,让检查一下SCC4的配置。经查看,发现是顾问copy client是忘记填写client的货币了。我维护好后&#xf…

Nginx配置WebSocket 【支持wss与ws连接】

要配置 Nginx 支持 WebSocket (包括非加密的 ws:// 连接和加密的 wss:// 连接),你需要在 location 块中添加一些特定的指令。这些指令告诉 Nginx 如何将 WebSocket 连接代理到你的应用服务器。以下是一个基本的示例: server {lis…

Intellij IDEA中怎么配置Maven?

在IntelliJ IDEA中配置Maven非常简单,以下是详细步骤: 步骤1:安装Maven 首先确保你的计算机上已经安装了Maven。如果没有安装,你可以从Apache Maven官网下载并安装:https://maven.apache.org/download.cgi 步骤2&am…

docker的底层原理二:容器运行时环境

概述:Docker 的容器运行时环境是其核心组成部分,提供了应用程序运行所需的隔离和资源管理。以下是容器运行时环境的一些关键底层原理和组件: 1. 命名空间(Namespaces) Process Namespace:用于隔离进程ID&…

Eclipse - Makefile generation

Eclipse - Makefile generation References right mouse click on the project -> Properties -> C/C Build -> Generate Makefiles automatically 默认会在 Debug 目录下创建 Makefile 文件。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【图论经典题目讲解】洛谷 P2371 墨墨的等式

P2371 墨墨的等式 D e s c r i p t i o n \mathrm{Description} Description 求解有多少个 b ∈ [ l , r ] b\in [l,r] b∈[l,r] 满足 ∑ i 1 n a i x i b \sum\limits_{i1}^n a_ix_ib i1∑n​ai​xi​b 存在非负整数解( x i x_i xi​ 为变量, a a …

数据结构-哈夫曼树

介绍 哈夫曼树,指带权路径长度最短的二叉树,通常用于数据压缩中 什么是带权路径长度? 假设有一个结点,我们为它赋值,这个值我们称为权值,那么从根结点到它所在位置,所经历的路径,…

无穷绕八双纽线

目录) 前言双纽线双纽线工程化双纽线应用参考文献 前言 今天是初八,在中国某些地方初八有拜财神的习俗,“八”谐音“发”,等同于恭喜发财的“发”,寓意着在新的一年里红红火火发大财,三叔首先祝福各位读者…

oracle和mysql语句有哪些异同点?

Oracle和MySQL是两个流行的关系型数据库管理系统,它们都有SQL(结构化查询语言)作为主要的查询语言。尽管它们共享许多基本的SQL功能,但它们之间也存在一些关键的差异。以下是一些Oracle和MySQL语句的异同点: 数据类型…

C语言:函数指针

前言: 当谈到C语言的高级特性时,函数指针是一个非常重要的概念。函数指针允许我们在程序中动态地传递和调用函数,这在很多情况下都非常有用。本篇博客将详细讲解C语言函数指针的知识,并带上一些代码示例来帮助读者理解。 目录 什么…

如何使用HTTP隧道在Linux环境下构建内网穿透解决方案

你是否曾经遇到过这样的尴尬场景:身处内网环境,却想要让外部世界的朋友访问你的某个服务,却发现那堵墙——防火墙,如同一座不可逾越的山峰,挡住了你的去路?别担心,今天我们就来聊聊如何在Linux环…

Python:变量与数据类型

目录 一、变量 1.1 强数据类型与弱数据类型 1.2 全局函数 1.3 变量的命名规范 二、数据类型 2.1 基本数据类型 2.2 复合数据类型(引用数据类型) 三、数据类型转换 一、变量 变量:顾名思义,变化的量。在python中代指运行时…

html标签及基础语法 大合集

01-标签语法标签结构 HTML(Hypertext Markup Language)是网页的基础语言之一,它通过使用标签(tag)来描述网页的结构和内容。标签是由尖括号包围的关键词,通常成对出现,其中包括一个开始标签和一…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(6)特征分析

今天来学习特征分析。 通过图分析每个特征与结果的对应关系。 例如上方,使用散点图,将各个特征和价格的关系,绘制出来,观察是否具有较大的相关性。 散点图可以帮助找出现有特征中,与价格的关联度(正数正相…

蓝桥杯刷题--python-7

0幸运数字 - 蓝桥云课 (lanqiao.cn) count 0def add_sum(num):nums []for i in num:nums.append(int(i))return sum(nums)for i in range(1, 999999):if count < 2023:bin_num bin(i)[2:]oct_num oct(i)[2:]hex_num hex(i)[2:]tm []for j in hex_num:tm.append(int(j,…

RAG和Embedding

搭建过程&#xff1a; &#xff08;1&#xff09;文档加载&#xff0c;并按一定条件切割成片段 &#xff08;2&#xff09;将切割的文本片段灌入检索引擎 &#xff08;3&#xff09;封装检索接口 &#xff08;4&#xff09;构建调用流程&#xff1a; Query -> 检索 ->…

Vue3+vite搭建基础架构(6)--- 使用vue-router

Vue3vite搭建基础架构&#xff08;6&#xff09;--- 使用vue-router 说明官方文档安装vue-router使用vue-router测试vue-router 说明 这里记录下自己在Vue3vite的项目使用vue-router的过程&#xff0c;不使用ts语法&#xff0c;方便以后直接使用。这里承接自己的博客Vue3vite搭…

阿里云上关于EDAS发布方式

1. 描述蓝绿部署和灰度发布的区别以及适用场景。 蓝绿部署和灰度发布是两种常见的软件发布策略&#xff0c;它们各有特点并适用于不同的场景。 蓝绿部署的特点&#xff1a; 目的&#xff1a;蓝绿部署的主要目的是减少发布时的中断时间&#xff0c;并且能够在新版本出现问题时…