这个方法的核心依然是基于matplotlib.legend._get_legend_handles_labels
函数。然后将得到的handlers, labels进行重排,使得即使再调用Legend
类的绘制方法对图例进行列排列,最终的效果也是图例的行显示,如[1、2、3、4、5、6]
,当指定ncols=2
,Legend
类的绘制方法得到的图例如下:
1 4
2 5
3 6
如果要实现J借助Legend
类的绘制方法得到如下图例:
1 2
3 4
5 6
可以可以发现,将[1、2、3、4、5、6]
重排为[1,3,5,4,5,6]
即可。这里算法就是先按照行切分的方式将原始的handlers变为(-1,ncols)
的2d列表(简单的表示矩阵),然后进行列扫描就行。但是这样要先遍历获取得2d列表的子列表的index=0的元素,然后是index=1,2,…, ncols-1处的元素。由于,这样不利于编程,所以就将2D进行转置,然后进行行扫描,即(列扫描)
# -*- coding: utf-8 -*-
'''
@Time : 2024/1/5 20:25 \n
@Author : 月司 \n
@Email : 815603884@qq.com \n
@File : legend的横向显示.py \n
@version : 1.0 \n
@Software: PyCharm \n
@Desc :
'''
from typing import List, Anyimport matplotlib.pyplot as plt
# 创建一个新的图例对象
from matplotlib.legend import Legend
import matplotlib.axes as axes#这个函数可以获得axis对象的已经绘制的artist中的所有的hander和labels,这个可以只给它一个axis参数。注意这个参数需要是列表类的。
from matplotlib.legend import _get_legend_handles_labels as get_legend_handles_labels# 自定义图例对象
class CustomLegend(Legend):def __init__(self, ax:axes.Axes,handlers: List[Any]=None,labels: List