在pandas中使matplotlib动态画子图的两种方法【推荐gridspec】

2023-09-22 14:50:25

先上对比图,在这里插入图片描述

第一种方法,这里仅展示1个大区,多个的话需要加一层循环就可以了,主要是看子图的画法

当大区下面的国家为1个或2个时,会进行报错

# 获取非洲国家列表
african_countries = df[df['大区'] == '南亚大区']['进口国'].unique()

# 动态计算子图的行列数量
num_countries = len(african_countries)
rows = (num_countries + 2) // 3  # 计算行数
cols = min(3, num_countries)  # 最多3列

# 创建包含子图的图形
fig, axes = plt.subplots(rows, cols, figsize=(15, 8))
fig.suptitle('南亚大区不同国家进口金额月度变化趋势', fontsize=16, fontweight='bold')

# 循环绘制子图
for i, country in enumerate(african_countries):
    row, col = divmod(i, cols)
    ax = axes[row, col]
    
    # 按国家和月份对金额进行汇总
    monthly_sum = (df[(df['大区'] == '南亚大区') & (df['进口国'] == country)].groupby('月份')['金额'].sum() / 10000).round(1)
    
    # 绘制折线图
    ax.plot(monthly_sum.index, monthly_sum.values, marker='o', linestyle='-')
    ax.set_title(f'{country}进口金额月度变化趋势')
    ax.set_xlabel('月份')
    ax.set_ylabel('金额(万美元)')
    ax.grid(False)
    ax.tick_params(axis='x', rotation=45)

# 调整子图布局
plt.tight_layout(rect=[0, 0.03, 1, 0.95])

# 显示图形
plt.show()

第二种方法,这个可以动态的对数量进行调整,并不会出现空子图,仅有个框存在

# 不同大洲的列表
continents = ['北美大区', '拉美大区', '中东非大区', '南亚大区', '新亚太大区', '东欧大区', '西欧大区', '独联体大区', '东南亚大区']
for continent in continents:
    # 获取非洲国家列表
    african_countries = df[df['大区'] == continent]['进口国'].unique()

    # 动态计算子图的行列数量
    num_countries = len(african_countries)
    rows = (num_countries + 2) // 3  # 计算行数
    cols = min(3, num_countries)  # 最多3列

    # 创建包含子图的图形
    fig = plt.figure(figsize=(15, rows * 3.5))
    fig.suptitle(f'{continent}国家进口金额月度变化趋势', fontsize=16, fontweight='bold')
    gs = fig.add_gridspec(rows, cols)

    # 循环绘制子图
    for i, country in enumerate(african_countries):
        row, col = divmod(i, cols)
        ax = fig.add_subplot(gs[row, col])

        # 按国家和月份对金额进行汇总
        monthly_sum = (df[(df['大区'] == continent) & (df['进口国'] == country)].groupby('月份')['金额'].sum() / 10000).round(1)

        # 绘制折线图
        ax.plot(monthly_sum.index, monthly_sum.values, marker='o', linestyle='-')
        ax.set_title(f'{country}进口金额月度变化趋势')
        ax.set_xlabel('月份')
        ax.set_ylabel('金额(万美元)')
        ax.grid(False)
        ax.tick_params(axis='x', rotation=45)

    # 调整子图布局
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

    # 显示图形
    plt.show()
更多推荐

指针进阶2(内含库函数qsort的模拟实现)

指针进阶2函数指针数组之前给大家介绍过函数指针的相关知识,下面我们进一步讲解一下指针的相关知识:喜欢的小伙伴可以给追秋点点关注,三连走一波!!!我们学习了函数指针数组之后,那肯定有朋友要问了,这个知识点有点复杂,那该如使用呢?下面我们写一个初级的计算器程序简单说明函数指针数组的用途:下面是计算器的代码:#include

华为云HECS云服务器docker环境下安装mysql

华为云HECS云服务器,已经安装了docker环境,准备下docker环境下安装mysql。一、HECS云服务器安装docker登录华为HECS云服务器,安装docker环境。安装docker参考如下文章:华为云HECS安装docker并安装mysql-CSDN博客二、拉取mysql镜像1、拉取mysql5.7的镜像d

Flink1.14 Source概念入门讲解与源码解析

目录FlinkSource概念SourceSource源码getBoundedness()createReader(SourceReaderContextreaderContext)createEnumerator(SplitEnumeratorContextenumContext)SplitEnumeratorres

Redis的高性能之谜

介绍Redis通常用作缓存。当一致性要求不高时,它也可以用作存储。此外,Redis还提供消息订阅、事务、索引等功能。我们还可以使用集群功能构建分布式存储服务,并实现非强一致性的分布式锁服务。在上述各种情况下,Redis都具有一个共同的优势,即处理速度快(高性能)。Redis有多快?要了解Redis有多快,您需要有一个评

MySQL数据库入门到精通3--进阶篇(存储引擎,索引)

1.存储引擎1.1MySQL体系结构1).连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接

怎样使用 NFTScan Solana API 快速创建 NFT 应用程序?

之前,Solana凭借其超高的性能和低廉的费用,已然成为NFT项目最青睐的公链之一,众多知名NFT项目如DeGods、OkayBears、DegenerateApeAcademy等都选择在Solana上发行。意味着Solana链上每天都会产生海量的NFT交易数据,仅交易记录就超过了数百万条。不仅如此,Solana新建钱

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

【C++】STL之适配器---用deque实现栈和队列

目录前言一、deque1、deque的原理介绍2、deque的底层结构3、deque的迭代器4、deque的优缺点4.1、优点4.2、缺点二、stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现三、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现前

Python:为何成为当下最热门的编程语言?

文章目录🍋引言🍋1.简单易学🍋2.多领域应用🍋3.强大的社区支持🍋4.丰富的库和框架🍋5.跨平台兼容🍋6.开源和免费🍋7.数据科学和人工智能的崛起🍋8.自动化和脚本编写🍋9.大型组织的采用🍋10.教育和培训🍋引言在计算机编程的世界里,有数以百计的编程语言可供选择。然而,近年来,Python已经崭

偶现来电时手机操作出现重启

问题描述:偶现来电时手机操作出现重启问题分析:从系统Log看09-0610:22:44.79182914001425WWatchdog:***WATCHDOGKILLINGSYSTEMPROCESS:Blockedinhandleronmainthread(main)09-0610:22:44.794133140014

CSRF和SSRF有什么不同?

文章目录CSRF复现SSRF复现启动环境漏洞复现探测存活IP和端口服务计划任务反弹shell区别CSRF复现打开dvwa,将难度调为low,点击CSRF,打开后发现有一个修改密码的输入框:在这里修改密码,并用bp抓包,在httphistory查看数据包,点击engagementtools中的GenerateCSRFPo

热文推荐