自定义matplotlib绘图接口,每组数据一个子图,适配多组

        使用matplotlib自定义的绘图接口,绘图时,行数固定为2行,列数会根据提供的数据自动扩展,奇数时,最后一列数据会占据两行,接口中x轴为时间格式,可以根据自己的需求手动更改。

有任何其他的设置要查询,可以参考官网中文文档:

matplotlib.axes — Matplotlib 3.7.1 documentation

示例中的colors只定义了十个颜色,可以根据自己实际的绘图需求更改即可。

注意使用十字线标记时,使用MultiCursor同时标记多个子图,参考官网,水平线默认关闭,如果开启后,所有子图的y坐标相同,不利于显示,使用时,需要将所有的ax传递进去

multi = MultiCursor(fig.canvas, axesList, useblit=True, horizOn=False, color='gray', lw=1)

matplotlib.widgets_Matplotlib 中文网

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
from matplotlib.widgets import Cursor, MultiCursor


# 通用绘图接口,每组数据绘制一个折线图
def plotApi(filePath, suptitle: str, xLable: str, yLables: 'tuple|list', index: int=None, header: int=None):
    '''
    通用绘图接口,每组数据绘制一个折线图
    :param filePath: 要分析的文件路径,为xlsx格式的文件
    :param suptitle: 图表的总标题
    :param xLables: 各个子图的x label
    :param yLables: 各个子图的y label
    :param index: 执行行索引是哪一列
    :param header: 执行数据中列索引是哪一行
    :return: None
    '''
    sns.set(style='darkgrid')

    df = pd.read_excel(filePath, header=header, index_col=index)
    column_number = df.shape[-1]
    odd_flag = column_number%2
    ncols = column_number//2 + odd_flag
    header_lst = df.columns.tolist()

    # fig = plt.figure(figsize=(9, 6), constrained_layout=True)
    fig = plt.figure(figsize=(12, 7), tight_layout=True)
    gs = fig.add_gridspec(2, ncols)

    colors = ('#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf')
    for x in range(column_number):
        if odd_flag:
            if x < 2 * (ncols-1):
                ax = fig.add_subplot(gs[x // (ncols-1), x % (ncols-1)])

            else:
                ax = fig.add_subplot(gs[:, ncols-1])
        else:
            ax = fig.add_subplot(gs[x // ncols, x % ncols])

        ax.set_title(header_lst[x])
        ax.set_xlabel(xLable)
        ax.set_ylabel(yLables[x])
        ax.grid(True)               # Axes对象设置网格
        ax.xaxis.set_major_formatter(mdate.DateFormatter('%m/%d %H:%M'))  # 设置时间标签显示格式
        ax.plot(df.iloc[:, x], color=colors[x])

        # plt.xticks(rotation=45)     # 单独设置每个axes对象的x坐标轴旋转
        # ax.minorticks_on()          # 显示次要刻度,sns.set(style='darkgrid')有样式设置时无效
        # 去除相同纵坐标的label,由于每个子图占据的空间大小相同,所以去除ylabel的图标会有空隙
        # if x not in  (0, column_number//2, column_number-1):
        #     ax.set_ylabel('')


    fig.suptitle(suptitle, fontsize=15, color='indigo')          # 设置图标大标题
    fig.align_labels()              # 对齐 xlabel 和 ylabel
    plt.tight_layout()
    # plt.xticks(rotation=45)       # 只能对当前的Axes对象起作用
    fig.autofmt_xdate()             # 会自动调整x轴的日期格式,存在多个子图时,会自动share对应的x轴
    plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值