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_labels

def 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 provided
        raise 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 ax
        handlers,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_anchor
    for i in range(n_legends):
        start_idx = i * n_items
        end_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 = 1
            if i == 0:
                bbox_anchor = first_bbox_to_anchor
            else:
                # 计算后续图例的bbox_to_anchor
                bbox_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_anchor
            else:
                # 计算后续图例的bbox_to_anchor
                bbox_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_labels
    
    handles,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.mfbz.cn/a/396198.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性规划单纯形法原理及实现

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:线性规划单纯形法原理及实现 标准化及单纯形方法 相关学习资料 https://www.bilibili.com/video/BV168411j7XL/?spm_id_from333.788&vd_so…

Linux进程概念 (下) 地址空间

前言 中篇讲了进程为什么要有优先级,以及环境变量和通过代码获得环境变量 本篇主要讲解什么是地址空间 , 地址空间是怎么设计的?为什么要有地址空间? 程序地址空间 先看下图 验证上图的正文代码至堆的地址是不是从低地址向高地…

强化学习(TD3)

TD3——Twin Delayed Deep Deterministic policy gradient 双延迟深度确定性策略梯度 TD3是DDPG的一个优化版本,旨在解决DDPG算法的高估问题 优化点: ①双重收集:采取两套critic收集,计算两者中较小的值,从而克制收…

【软考高级信息系统项目管理师--第十九章:项目绩效域】

🚀 作者 :“码上有前” 🚀 文章简介 :软考高级–信息系统项目管理师 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 第十九章:项目绩效域 干系人绩效域预期目标绩效要点 团队绩效域预期目…

【Java】零基础蓝桥杯算法学习——动态规划例题

例题:2023年第十四届蓝桥杯Java软件开发B组E题 蜗牛 参考解答: 参考代码示例: import java.util.Scanner; public class Main {static int N 100010;static int[] arr new int[N];static int[] a new int[N]; //传送带的起始坐标static …

[杂记]mmdetection3.x中的数据流与基本流程详解(数据集读取, 数据增强, 训练)

之前跑了一下mmdetection 3.x自带的一些算法, 但是具体的代码细节总是看了就忘, 所以想做一些笔记, 方便初学者参考. 其实比较不能忍的是, 官网的文档还是空的… 这次想写其中的数据流是如何运作的, 包括从读取数据集的样本与真值, 到数据增强, 再到模型的forward当中. 0. MMDe…

打字侠,提供免费的五笔打字练习

在当今数字化时代,打字已成为生活和工作中不可或缺的技能之一。特别是在办公室环境中,快速准确地输入文字对提高工作效率至关重要。而对于许多中文输入法用户来说,五笔输入法因其高效和便捷而备受青睐。 然而,掌握五笔输入法并非…

JVM原理

一、java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟…

一休哥助手网页版如何使用

一休哥助手网页版可以使用GPT4提问了,具体操作流程如下: 1.登录网页版一休哥助手(首次打开页面时,初始化久一点,请耐心等一下) https://www.fudai.fun 2.登录后就可以使用GPT4了 3.你还可以自定义系统角色…

vtkBoarderWidget及图片坐标包含计算

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题:移动图片到坐标轴的中心,创建一个vtkBoarderWidget控件,移动控件,计算控件与图片的包含关系 关键点…

K3s v1.26.0-rc.0-k3s1 部署Harbor私库权限配置

在K3s服务端配置 cat >> /etc/rancher/k3s/registries.yaml <<EOF mirrors: "harbor.baize-k3s.org": endpoint: - "https://harbor.baize-k3s.org" configs: "harbor.baize-k3s.org": auth: username: admin password: Harbor1…

LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置

LiveGBS常见问题基础配置流媒体服务配置中本地|内网IP外网IP外网IP收流如何配置&#xff1f; 1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置 LiveGBS中基础配置-》流…

ssm在线学习平台-计算机毕业设计源码09650

目 录 摘要 1 绪论 1.1 选题背景及意义 1.2国内外现状分析 1.3论文结构与章节安排 2 在线学习平台系统分析 2.1 可行性分析 2.2 系统业务流程分析 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 在线学习平台总体设计 …

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-I2C

目录 一、 I2C 概述二、I2C 模块相关API三、接口调用实例四、I2C HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、 I2C 概述 I2C&#xff08;Inter Integrated Circuit&#xff09;集成电路间总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线。I2C 以主从方…

Unity老项目Android 13支持

Unity老项目Android 13支持 前言 Google官方要求新、老app在一定时间要求内需要面向Android 12、Android 13构建&#xff0c;不然不给app过审。我们之前是面向Android API 30构建的&#xff0c;现在需要支持面向Android API 33构建。 https://developer.android.com/about/ver…

为什么2023年是AI视频的突破年,以及对2024年的预期#a16z

2023年所暴露的AI生成视频的各种问题&#xff0c;大部分被OpenAI发布的Sora解决了吗&#xff1f;以下为a16z发布的总结&#xff0c;在关键之处&#xff0c;我做了OpenAI Sora的对照备注。 推荐阅读&#xff0c;了解视频生成技术进展。 Why 2023 Was AI Video’s Breakout Year,…

怎么清理mac系统缓存系统垃圾文件 ?怎么清理mac系统DNS缓存

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 mac系统是一…

力扣94 二叉树的中序遍历 (Java版本) 递归、非递归

文章目录 题目描述递归解法非递归解法 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示…

chrome版本117驱动下载路,解决版本不匹配问题

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

伦敦金适合现在进行投资吗?

伦敦金作为一种贵金属投资品种&#xff0c;近年来在全球范围内受到了越来越多的关注。那么&#xff0c;伦敦金适合现在进行投资吗&#xff1f;在回答这个问题之前&#xff0c;我们先来了解一下什么是伦敦金。 伦敦金&#xff0c;顾名思义&#xff0c;是指在伦敦市场上交易的黄…
最新文章