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

本文主要是介绍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 值会产生不同的实际偏移效果。这个值可能需要根据具体的图表尺寸和所需的视觉效果进行调整。

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

这篇关于motplotlib图例案例1:通过多个legend完全控制图例显示顺序(指定按行排序 or 按列排序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726515

相关文章

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提