Python Matplotlib 动画教程:提高可视化吸引力的强大工具【第24篇—python:Matplotlib】

文章目录

    • 🍖 方法一:使用pause()函数
    • 🚀 方法二:使用FuncAnimation()函数
      • 🥋 线性图动画:
      • 🎻 Python中的条形图追赶动画
      • 🌌 Python中的散点图动画:
      • 🛹 条形图追赶的水平移动:
    • 🛬 wuhu!起飞!

动画是提高可视化吸引力和用户吸引度的优秀手段。它能够以有意义的方式展示数据可视化。Python提供了强大的库,使我们能够轻松创建动画可视化。Matplotlib是一个广受欢迎的数据可视化库,通常用于绘制数据图表以及创建基于内置函数的动画。

使用Matplotlib创建动画有两种主要方法:

  • 使用pause()函数
  • 使用FuncAnimation()函数

🍖 方法一:使用pause()函数

在这种方法中,我们使用matplotlib库的pyplot模块中的pause()函数来实现暂停。该函数在程序执行过程中会暂停指定的时间间隔,使动画能够逐帧展示。下面是一个示例,演示了如何使用Matplotlib创建一个简单的线性图,并通过pause()函数设置适当的时间间隔展示动画:

from matplotlib import pyplot as plt

x = []
y = []

for i in range(100):
    x.append(i)
    y.append(i)

    plt.xlim(0, 100)
    plt.ylim(0, 100)

    plt.plot(x, y, color='green')
    plt.pause(0.01)

plt.show()

输出:

在这里插入图片描述

同样,pause()函数也可以用于在各种图形中创建动画。

🚀 方法二:使用FuncAnimation()函数

FuncAnimation()函数不会自行创建动画,而是从我们传递的一系列图形中生成动画。其语法如下:

from matplotlib.animation import FuncAnimation

animation = FuncAnimation(figure, animation_function, frames=None, init_func=None, fargs=None, save_count=None, cache_frame_data=True, **kwargs)

现在,我们可以使用FuncAnimation函数创建多种类型的动画。以下是几个示例:

🥋 线性图动画:

在这个例子中,我们创建了一个简单的线性图,展示了线条的动画效果。通过FuncAnimation,我们可以定义动画的具体表现形式,然后将其传递给FuncAnimation。

from matplotlib.animation import FuncAnimation
import numpy as np

x = []
y = []
figure, ax = plt.subplots()

ax.set_xlim(0, 100)
ax.set_ylim(0, 12)

line, = ax.plot(0, 0)

def animation_function(i):
    x.append(i * 15)
    y.append(i)

    line.set_xdata(x)
    line.set_ydata(y)
    return line,

animation = FuncAnimation(figure,
                          func=animation_function,
                          frames=np.arange(0, 10, 0.1),
                          interval=10)
plt.show()

输出:

在这里插入图片描述

🎻 Python中的条形图追赶动画

在这个例子中,我们展示了一个条形图动画,每个条形图都有自己的动画效果。

import numpy as np

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
fig = plt.figure(figsize=(7, 5))
axes = fig.add_subplot(1, 1, 1)
axes.set_ylim(0, 300)
palette = ['blue', 'red', 'green', 'darkorange', 'maroon', 'black']

y1, y2, y3, y4, y5, y6 = [], [], [], [], [], []

def animation_function(i):
    y1 = i
    y2 = 6 * i
    y3 = 3 * i
    y4 = 2 * i
    y5 = 5 * i
    y6 = 3 * i

    plt.xlabel("国家")
    plt.ylabel("国家GDP")

    plt.bar(["印度", "中国", "德国", "美国", "加拿大", "英国"],
            [y1, y2, y3, y4, y5, y6],
            color=palette)

plt.title("条形图动画")

animation = FuncAnimation(fig, animation_function,
                          interval=50)
plt.show()

输出:

在这里插入图片描述

🌌 Python中的散点图动画:

在这个例子中,我们使用随机函数在Python中创建了一个动画散点图。通过迭代animation_func,在每次迭代时绘制随机的x和y坐标值。

import random

x = []
y = []
colors = []
fig = plt.figure(figsize=(7, 5))

def animation_func(i):
    x.append(random.randint(0, 100))
    y.append(random.randint(0, 100))
    colors.append(np.random.rand(1))
    area = random.randint(0, 30) * random.randint(0, 30)
    plt.xlim(0, 100)
    plt.ylim(0, 100)
    plt.scatter(x, y, c=colors, s=area, alpha=0.5)

animation = FuncAnimation(fig, animation_func,
                          interval=100)
plt.show()

输出:

在这里插入图片描述

🛹 条形图追赶的水平移动:

在这个例子中,我们使用城市数据集中最高人口的城市创建了一个条形图竞赛动画。每个城市都有自己的条形图,而动画则会在1990年到2018年之间迭代。数据集可以从这里下载。

import pandas

 as pd
import matplotlib.ticker as ticker
from matplotlib.animation import FuncAnimation

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
df = pd.read_csv('city_populations.csv', usecols=['name', 'group', 'year', 'value'])

colors = dict(zip(['India', 'Europe', 'Asia', 'Latin America', 'Middle East', 'North America', 'Africa'],
                  ['#adb0ff', '#ffb3ff', '#90d595', '#e48381', '#aafbff', '#f7bb5f', '#eafb50']))

group_lk = df.set_index('name')['group'].to_dict()

def draw_barchart(year):
    dff = df[df['year'].eq(year)].sort_values(by='value', ascending=True).tail(10)
    ax.clear()
    ax.barh(dff['name'], dff['value'], color=[colors[group_lk[x]] for x in dff['name']])
    dx = dff['value'].max() / 200

    for i, (value, name) in enumerate(zip(dff['value'], dff['name'])):
        ax.text(value-dx, i, name, size=14, weight=600, ha='right', va='bottom')
        ax.text(value-dx, i-.25, group_lk[name], size=10, color='#444444', ha='right', va='baseline')
        ax.text(value+dx, i, f'{value:,.0f}', size=14, ha='left', va='center')

    ax.text(1, 0.4, year, transform=ax.transAxes, color='#777777', size=46, ha='right', weight=800)
    ax.text(0, 1.06, 'Population (thousands)', transform=ax.transAxes, size=12, color='#777777')

    ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
    ax.xaxis.set_ticks_position('top')
    ax.tick_params(axis='x', colors='#777777', labelsize=12)
    ax.set_yticks([])
    ax.margins(0, 0.01)
    ax.grid(which='major', axis='x', linestyle='-')
    ax.set_axisbelow(True)
    ax.text(0, 1.12, '从 1500 年到 2018 年世界上人口最多的城市',
            transform=ax.transAxes, size=24, weight=600, ha='left')

    ax.text(1, 0, 'by haiyong.site | 海拥', transform=ax.transAxes, ha='right', color='#777777',
            bbox=dict(facecolor='white', alpha=0.8, edgecolor='white'))
    plt.box(False)
    plt.show()

fig, ax = plt.subplots(figsize=(15, 8))
animator = FuncAnimation(fig, draw_barchart, frames=range(1990, 2019))
plt.show()

输出:

在这里插入图片描述

🛬 wuhu!起飞!

如果您从这篇文章中学到了新知识并喜欢它,请收藏并与您的朋友分享。最后,请不要忘记给予❤或📑支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/320723.html

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

相关文章

<软考高项备考>《论文专题 - 65 质量管理(4) 》

4 过程3-管理质量 4.1 问题 4W1H过程做什么为了评估绩效,确保项目输出完整、正确且满足客户期望,而监督和记录质量管理活动执行结果的过程作用:①核实项目可交付成果和工作已经达到主要干系人的质量要求,可供最终验收;②确定项目…

乐意购项目前端开发 #2

一、Axios的安装和简单封装 安装Axios npm install axios在utils目录下创建 http.js 文件, 内容如下 import axios from axios// 创建axios实例 const http axios.create({baseURL: http://localhost:9999,//后端服务器地址timeout: 5000 })// axios请求拦截器 http.interc…

【用法总结】无障碍AccessibilityService

一、背景 本文仅用于做学习总结,转换成自己的理解,方便需要时快速查阅,深入研究可以去官网了解更多:官网链接点这里 之前对接AI语音功能时,发现有些按钮(或文本)在我没有主动注册唤醒词场景…

【JAVA】在 Queue 中 poll()和 remove()有什么区别

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 poll() 方法: remove() 方法: 区别总结: 结语 我的其他博客 前言 在Java的Queue接口中&…

计算机找不到msvcp120.dll如何解决?总结五个可靠的教程

在计算机使用过程中,遇到“找不到msvcp120.dll”这一问题常常令人困扰。msvcp120.dll作为Windows系统中至关重要的动态链接库文件,对于许多应用程序的正常运行起着不可或缺的作用。那么,究竟是什么原因导致找不到msvcp120.dll呢?又…

Multi-View-Information-Bottleneck

encoder p θ ( z 1 ∣ v 1 ) _θ(z_1|v_1) θ​(z1​∣v1​),D S K L _{SKL} SKL​ represents the symmetrized KL divergence. I ˆ ξ ( z 1 ; z 2 ) \^I_ξ(z_1; z_2) Iˆξ​(z1​;z2​) refers to the sample-based parametric mutual information estimatio…

vim升级和配置

vim升级和配置 1、背景2、环境说明3、操作3.1 升级VIM3.2 配置VIM3.2.1、编辑vimrc文件3.2.2、安装插件 1、背景 日常工作跟linux系统打交道比较多,目前主要用到的是Cenots7和Ubuntu18这两个版本的linux系统,其中Centos7主要是服务器端,Ubun…

如何开启文件共享及其他设备如何获取

1.场景分析 日常生活中,常常会遇到多台电脑共同办公文件却不能共享的问题,频繁的用移动硬盘、U盘等拷贝很是繁琐,鉴于此,可以在同一内网环境下设置共享文件夹,减少不必要的文件拷贝工作,提升工作效率。废话…

Maven《一》-- 一文带你快速了解Maven

目录 🐶1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 🐶1.2 什么是Maven &#x…

C语言数据结构(1)复杂度(大o阶)

欢迎来到博主的专栏——C语言与数据结构 博主ID——代码小豪 文章目录 如何判断代码的好坏时间复杂度什么是时间复杂度如何计算时间复杂度 空间复杂度 如何判断代码的好坏 实现相同作用的不同代码,如何分辨这些代码的优劣之处呢? 有人说了&#xff0c…

stm32学习笔记:USART串口通信

1、串口通信协议(简介软硬件规则) 全双工:打电话。半双工:对讲机。单工:广播 时钟:I2C和SPI有单独的时钟线,所以它们是同步的,接收方可以在时钟信号的指引下进行采样。串口、CAN和…

行业内参~移动广告行业大盘趋势-2023年12月

前言 2024年,移动广告的钱越来越难赚了。市场竞争激烈到前所未有的程度,小型企业和独立开发者在巨头的阴影下苦苦挣扎。随着广告成本的上升和点击率的下降,许多原本依赖广告收入的创业者和自由职业者开始感受到前所未有的压力。 &#x1f3…

IPv6组播--SSM Mapping

概念 SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。 如果成员主机上运行MLDv2,可以在MLDv2报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行MLDv1,为了使其也能够使用SSM服务,组播路由器上需要提…

swing快速入门(四十)JList、JComboBox实现列表框

注释很详细,直接上代码 上一篇 新增内容 🧧1.列表的属性设置与选项监听器 🧧2.下拉框的属性设置与选项监听器 🧧3.Box中组件填充情况不符合预期的处理方法 🧧4.LIst向Vector的转化方法 源码: package swing…

操作系统期末考复盘

简答题4题*5 20分计算题2题*5 10分综合应用2题*10 20分程序填空1题10 10分 1、简答题(8抽4) 1、在计算机系统上配置OS的目标是什么?作用主要表现在哪个方面? 在计算机系统上配置OS,主要目标是实现:方便性、…

操作系统复习 七、八章

操作系统复习 七、八章 文章目录 操作系统复习 七、八章第七章 内存管理内存管理的基本要求和原理覆盖与交换连续分配管理方式非连续分配管理方式基本分段存储管理方式段页式管理方式补充 第八章 虚拟内存虚拟内存的基本概念请求分页管理方式易混知识点页面置换算法页面分配策略…

memory泄露分析方法(java篇)

#memory泄露主要分为java和native 2种,本文主要介绍java# 测试每天从monkey中筛选出内存超标的app,提单流转到我 首先,辨别内存泄露类型(java,还是native) 从采到的dumpsys_meminfo_pid看java heap&…

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例,主要介绍了数据请求和touch事件的使用。包含以下功能: 数据请求。列表下拉刷新。列表上拉加载…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…

C++11 异常

C异常概念 在C中,异常是程序在执行过程中遇到意外情况或错误时抛出的一种机制。当程序运行过程中发生异常,可以通过抛出异常、捕获异常和处理异常来改变程序的正常执行流程。 抛出异常:在程序中,可以使用关键字 throw 来抛出异常…