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

这个方法的核心,是手动的获得图中的handlers和labels,然后对它们进行切分和提取,最后分为几个legend进行显示。代码如下:

后来对下面的代码进行修改,通过handlers, labels = get_legend_handles_labels(axs=[axis])自动的获得handler。不再需要诸如handlers = [ax.scatter(range(10), [i * x for x in range(10)], label=f'Line {i}') for i in range(7)]之类的手动提取handler。源代码中这个依然进行了保留,是因为这个代码还是一个绘图过程

# -*- coding: utf-8 -*-
'''
@Time    : 2024/1/5 20:55  \n
@Author  : 月司   \n
@Email   : 815603884@qq.com \n
@File    : 图像图例的横向显示以及纵向显示.py   \n
@version : 1.0  \n
@Software: PyCharm  \n
@Desc    : 
'''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),**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: :param first_bbox_to_anchor:  `~matplotlib.transforms.BboxBase` instance, Bbox anchor of the first legend.Bbox anchor of the first legend.:param kwargs: Additional keyword arguments to pass to the legend function."""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)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 center', first_bbox_to_anchor=(0.2, 0.8))from matplotlib.legend import _get_legend_handles_labels as get_legend_handles_labelshandles,labels=get_legend_handles_labels([ax])plt.show()

注意:handlers, labels = get_legend_handles_labels(axs=[axis])可以自动的获得handler和label。

下面是使用这个函数的几个示例:

在这里插入图片描述
在Matplotlib中,bbox_to_anchor 参数用于指定图例(legend)的位置。这个参数接受一个元组,通常包含两个元素,分别代表图例在X轴和Y轴上的位置。这些位置的值通常是基于图表的坐标系统,可以是:

  • 轴坐标(axis coordinates)
  • 图表坐标(matplotlib.transforms.BboxBase)
  • 图坐标(figure coordinates)或其他坐标系统。

图表坐标和图坐标都是相对坐标系

在前面的代码示例中,bbox_to_anchor 的值(例如 (0.5, 1))是基于图表坐标系统的。图表坐标系统中,(0, 0) 代表图表的左下角,而 (1, 1) 代表图表的右上角。因此,一个元组 (0.5, 1) 表示图例位于图表的顶部中心。

另外,如果是这个图片的左下角是(0,0),那么其实是figure的坐标系统

至于 offset 参数(在示例中为 0.05),它用于在指定方向上对图例的位置进行微调。在水平布局(vertical=False)的情况下,offset 用于垂直方向的偏移;在垂直布局(vertical=True)的情况下,offset 用于水平方向的偏移。

例如,如果 first_bbox_to_anchor(0.5, 1)(顶部中心)并且 offset0.05,那么第二个图例的 bbox_to_anchor 将会是 (0.5, 1 - 0.05),即稍微向下偏移。每个后续的图例都会继续这样向下偏移。

需要注意的是,offset 的值 0.05 也是图表坐标值。这意味着它的实际偏移量取决于图表的大小。在不同大小的图表中,相同的 offset 值会产生不同的实际偏移效果。这个值可能需要根据具体的图表尺寸和所需的视觉效果进行调整。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Unity所有关于旋转的方法详解

前言:欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角, 我们将Inspector面板设置成Debug模式,此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转,一组欧拉旋转过程中…

Transformer面试十问

1 Scaled Dot-Product Attention中为什么要除以 d k \sqrt{d_k} dk​ ​? 1. 从纯数学上考虑:对于输入均值为0,方差为1的分布,点乘后结果其方差为dk,所以需要缩放一下。下图为原论文注释。 2. 从神经网络上考虑:防止在计算点积…

杨氏矩阵和杨辉三角

杨氏矩阵 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时间复杂度小于O(N); 分析 若要满足要求时间复杂度小于O(N),就不能每一行一个个…

树和二叉树的基本知识

一、树的概念及结构 1.树的概念 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 有一个 特殊…

阿里云服务器“镜像”全方面解析

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后,次序不变,则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

【网络安全 | 网络协议】一文讲清HTTP协议

HTTP概念简述 HTTP(Hypertext Transfer Protocol)协议,又称超文本传输协议,用于传输文本、图像、音频、视频以及其他多媒体文件。它是Web应用程序通信的基础,通过HTTP协议,Web浏览器可以向Web服务器发起请…

电路设计(20)——数字电子钟的multism仿真

1.设计要求 使用数字芯片,设计一个电子钟,用数码管显示,可以显示星期,时、分、秒,可以有按键校准时间。有整点报警功能。 2.设计电路 设计好的multism电路图如下所示 3.芯片介绍 时基脉冲使用555芯片产生。在仿真里面…

挑战杯 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

NodeLocal DNS介绍及部署应用

1 NodeLocal DNS是什么? NodeLocal DNSCache 通过在集群节点上运行一个 DaemonSet 来提高 clusterDNS 性能和可靠性。处于 ClusterFirst 的 DNS 模式下的 Pod 可以连接到 kube-dns 的 serviceIP 进行 DNS 查询。通过 kube-proxy 组件添加的 iptables 规则将其转换为…

蓝桥杯DP算法——背包问题(C++)

目录 一、01背包问题 二、完全背包问题 三、多重背包问题 四、多重背包问题(优化版) 五、分组背包问题 一、01背包问题 01背包问题就是有N件物品,一个空间大小为V的背包,每个物品只能使用一次,使得背包中所装物品…

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目:函数将str字符串中的5个数字字符串转换为整数,并保存在二维数组m的最后一行,各元素为3、-4、16、18、6。并经函数move处理后,运行结果如下: 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

【AIGC】Stable Diffusion之模型微调工具

推荐一款好用的模型微调工具,cybertron furnace 是一个lora训练整合包,提供训练 lora 模型的工具集或环境。集成环境包括必要的依赖项和配置文件、预训练脚本,支持人物、二次元、画风、自定义lora的训练,以简化用户训练 lora 模型…

【Linux】软件包管理器 yum | vim编辑器

前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum(Yellowdog Updater, Modified)是一个在基于 RPM(管理软件包的格式和工具集合&…

软考学习--计算机组成原理与体系结构

计算机组成原理与体系结构 数据的表示 进制转换 R 进制转换为 10 进制–按权展开法 10进制转换为2进制 原码 反码 补码 移码 原码 :数字的二进制表示反码 : 正数的反码等于原码,负数的反码等于原码取反补码: 正数的补码等…

跟着pink老师前端入门教程-day24

四、移动端WEB开发之响应式布局 1、响应式开发 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 1.2 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 原理…

世界顶级名校计算机专业,都在用哪些书当教材?(文末送书)

目录 01《深入理解计算机系统》02《算法导论》03《计算机程序的构造和解释》04《数据库系统概念》05《计算机组成与设计:硬件/软件接口》06《离散数学及其应用》07《组合数学》08《斯坦福算法博弈论二十讲》参与规则 清华、北大、MIT、CMU、斯坦福的学霸们在新学期里…

FL Studio 21.2.3.4004 All Plugins Edition Win/Mac音乐软件

FL Studio 21.2.3.4004 All Plugins Edition 是一款功能强大的音乐制作软件,提供了丰富的音频处理工具和插件,适用于专业音乐制作人和爱好者。该软件具有直观的用户界面,支持多轨道录音、混音和编辑,以及各种音频效果和虚拟乐器。…

《统计学简易速速上手小册》第6章:多变量数据分析(2024 最新版)

文章目录 6.1 主成分分析(PCA)6.1.1 基础知识6.1.2 主要案例:客户细分6.1.3 拓展案例 1:面部识别6.1.4 拓展案例 2:基因数据分析 6.2 聚类分析6.2.1 基础知识6.2.2 主要案例:市场细分6.2.3 拓展案例 1&…

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

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