Python利用pynimate实现制作动态排序图

Python利用pynimate实现制作动态排序图

什么是pynimate

pynimate是一个Python模块,用于可视化数据的动画制作。它基于Matplotlib构建,可以使用Matplotlib已有的绘图工具,创建动态、交互的图表。

pynimate构建于Matplotlib之上,因此,它的使用方法与Matplotlib非常相似,只需要稍作调整就可以将静态图转换成动态图,而且pynimate能够自动将图表转换成可播放的动画,无需使用其他工具。

制作动态排序图的步骤

  1. 准备数据

无论是制作静态还是动态排序图,数据都是必不可少的。在这里我们以一些姓氏在2010年至2020年的年度出现频率为例。

# 准备数据

import pandas as pd

data = {"Last_name": ["Smith", "Johnson", "Brown", "Taylor", "Miller"],
        "2010": [1000, 950, 800, 700, 500],
        "2011": [1050, 1000, 820, 750, 520],
        "2012": [1100, 1050, 840, 780, 550],
        "2013": [1150, 1100, 900, 820, 580],
        "2014": [1200, 1150, 940, 870, 610],
        "2015": [1250, 1200, 980, 910, 640],
        "2016": [1300, 1250, 1020, 950, 670],
        "2017": [1350, 1300, 1060, 990, 700],
        "2018": [1400, 1350, 1100, 1030, 730],
        "2019": [1450, 1400, 1140, 1070, 760],
        "2020": [1500, 1450, 1180, 1110, 790]}

df = pd.DataFrame(data)
  1. 安装pynimate

pynimate是不自带的模块,所以我们需要先安装它。可以使用pip命令进行安装。

# 安装pynimate

!pip install pynimate
  1. 设置图表

接下来我们要设置列表的样式和标签,以便后续使用。

# 设置图表

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots(figsize=(10, 6))

ax.set_xlim(0, 1500)
ax.set_ylim(0, 5)

ax.set_xlabel("出现频率", fontsize=12)
ax.set_ylabel("姓氏", fontsize=12)

ax.set_yticks(df.index)
ax.set_yticklabels(df["Last_name"], fontsize=12)

ax.invert_yaxis()

bars = ax.barh(df.index, df["2010"], align='center')
  1. 定义更新函数

定义一个函数用于更新图表,每帧的变换都将在该函数中实现。

# 定义更新函数

def update(num):
    year = str(num+2010)

    ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)

    values = df[year].values
    indices = values.argsort()[::-1]

    sorted_data = dict()
    sorted_data["Last_name"] = df["Last_name"].iloc[indices]
    sorted_data[year] = df[year].iloc[indices]

    for i, y in enumerate(sorted_data[year]):
        bars[i].set_width(y)
        bars[i].set_color('#4682B4')

    return bars
  1. 制作动画

最后,我们使用FuncAnimation功能来构建动画。该功能接收几个必要的参数,一个是图表的实例ax,一个是更新函数update,还需要设置总共需要更新的帧数frames。

# 制作动态排序图

ani = animation.FuncAnimation(fig, update, frames=range(11), interval=1000)
plt.show()

这段代码将生成一个可以在Jupyter Notebook界面内直接播放的动态图表。

示例一:不同颜色的动态排序图

如果你觉得默认颜色有些单调,可以考虑通过调整颜色方案来让图表更有视觉吸引力。

# 调整颜色的动态排序图

def update_colors(num, colors):
    year = str(num+2010)

    ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)

    values = df[year].values
    indices = values.argsort()[::-1]

    sorted_data = dict()
    sorted_data["Last_name"] = df["Last_name"].iloc[indices]
    sorted_data[year] = df[year].iloc[indices]

    for i, y in enumerate(sorted_data[year]):
        bars[i].set_width(y)
        if sorted_data["Last_name"].iloc[i] in colors:
            bars[i].set_color(colors[sorted_data["Last_name"].iloc[i]])
        else:
            bars[i].set_color('#4682B4')

    return bars

colors = {"Smith": "#FF5733", "Johnson": "#C70039", "Taylor": "#900C3F"}

ani = animation.FuncAnimation(fig, update_colors, frames=range(11), fargs=(colors,), interval=1000)
plt.show()

在这个例子里,我们利用了fargs参数,将颜色方案传递给update函数。update_colors是一个修改过的函数,用于动态生成柱状图的颜色。

示例二:交互式动态排序图

在pynimate模块中,我们可以添加回调函数,在图表上添加按钮和滑块等控件,实现交互式动态排序图的制作。

# 交互式动态排序图

def update_interact(year):
    ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)

    values = df[year].values
    indices = values.argsort()[::-1]

    sorted_data = dict()
    sorted_data["Last_name"] = df["Last_name"].iloc[indices]
    sorted_data[year] = df[year].iloc[indices]

    for i, y in enumerate(sorted_data[year]):
        bars[i].set_width(y)
        bars[i].set_color('#4682B4')

    return bars

def on_slider_change(event):
    year = str(int(event))
    update_interact(year)

from matplotlib.widgets import Slider

year_slider_ax = fig.add_axes([0.15, 0.1, 0.7, 0.05])
year_slider = Slider(year_slider_ax, 'Year', 2010, 2020, valinit=2010, valstep=1)

year_slider.on_changed(on_slider_change)

plt.subplots_adjust(bottom=0.3)

update_interact('2010')

plt.show()

在这个例子里,我们添加了一个滑块作为控件,可以通过滑动滑块来改变动态排序图的年份。滑块的回调函数是on_slider_change,每当滑块值发生变化时都会调用该函数,更新图表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用pynimate实现制作动态排序图 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • python 使用xlsxwriter循环向excel中插入数据和图片的操作

    下面是针对“python使用xlsxwriter循环向excel中插入数据和图片的操作”做出的完整实例教程。 1. 准备工作 首先,确保你已经安装好了 xlsxwriter 库。如果没有安装,可以使用如下命令进行安装: pip install xlsxwriter 然后,需要构建一个 Excel 文件,并创建一个工作簿,代码如下: import xlsxwr…

    python 2023年5月13日
    00
  • 在python中将list分段并保存为array类型的方法

    以下是详细讲解“在Python中将list分段并保存为array类型的方法”的完整攻略。 在Python中,可以使用array模块将list分段并保存为array类型。array模块提供了一种高效方式来处理数值数据,可以将数据储存在连续的内存块中,提高了数据访问的效率。本文将演示如何将list分段并保存为array类型。 将list分段 在Python中,可…

    python 2023年5月13日
    00
  • Python selenium实现断言3种方法解析

    Pythonselenium实现断言3种方法解析 在使用Python进行Web自动化测试时,断言是非常重要的一部分。断言可以帮助我们验证测试结果是否符合预期,从而提高测试的可靠性和准确性。本文将详细讲解Pythonselenium实现断言的3种方法,包括assert语句、unittest框架和pytest框架。 方法一:assert语句 assert语句是P…

    python 2023年5月15日
    00
  • 使用python把json文件转换为csv文件

    这里是使用Python将JSON文件转换为CSV文件的完整攻略,包含以下步骤: 步骤1:导入必要的库 Python中的JSON和CSV文件操作需要使用到两个库:json和csv。我们需要先导入这两个库。 import json import csv 步骤2:读取JSON文件 我们需要使用json库中的load()函数读取JSON文件,并将其转换为Python…

    python 2023年6月3日
    00
  • sqlalchemy 报错 Lost connection to MySQL server during query 解决

    最近在开发过程中遇到一个sqlalchemy lost connection的报错,记录解决方法。 报错信息 python后端开发,使用的框架是Fastapi + sqlalchemy。在一个接口请求中报错如下: [2023-03-24 06:36:35 +0000] [217] [ERROR] Exception in ASGI application T…

    python 2023年4月18日
    00
  • 详解用python写一个抽奖程序

    首先我们需要了解“抽奖程序”到底是什么。抽奖程序一般是应用在一些活动中的,比如在公司年会、朋友聚会或者其他各种场合,用来产生随机的中奖号码。在本攻略中,我们将用Python语言实现一个简单的抽奖程序。 第一步:引入模块我们需要使用Python中的random模块来产生随机数。在代码的开头,我们需要引入这个模块。 import random 第二步:定义候选人…

    python 2023年5月19日
    00
  • 对Python 2.7 pandas 中的read_excel详解

    对Python2.7pandas中的read_excel详解 简介 在Python2.7中,pandas是一个非常流行的数据分析库,提供了众多方便易用的功能。其中read_excel函数是常用的读取Excel文件的函数,本文将详细讲解该函数的使用方法和注意事项。 函数参数说明 read_excel函数有多个参数,这里主要介绍常用的参数及其含义。 filepa…

    python 2023年5月13日
    00
  • python requests 测试代理ip是否生效

    以下是关于使用Python requests测试代理IP是否生效的详细攻略: 使用Python requests测试代理IP是否生效 Python requests库支持使用代理IP发送HTTP请求。以下是使用Python requests测试代理IP是否生效的步骤: 获取代理IP 首先,需要获取一个可用的代理IP。可以从代理IP提供商处购买或免费获取代理I…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部