2

丢掉Excel,手把手教你用Python做可视化,还能调节动画丝滑度

 1 year ago
source link: https://www.qbitai.com/2023/01/41596.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

丢掉Excel,手把手教你用Python做可视化,还能调节动画丝滑度

head.jpgPine 2023-01-27 13:35:46 来源:量子位

可以生成Gif和MP4格式

Pine 发自 凹非寺

量子位 | 公众号 QbitAI

数据可视化动画还在用Excel做?

现在一个简单的Python包就能分分钟搞定!

而且生成的动画也足够丝滑,效果是酱紫的:

413c5ce9f0df499a9596bffcc3e1da0a~tplv-tt-shrink:640:0.image?traceid=202301271328380A1CBA80CE056CA2FAF4&x-expires=2147483647&x-signature=AR2GpmDKF9xEjE6NKPrf1yxqXwU%3D

这是一位专攻Python语言的程序员开发的安装包,名叫Pynimate

目前可以直接通过PyPI安装使用。

88b4478f347e46f6b8472bec0d2b90e6~tplv-tt-shrink:640:0.image?traceid=202301271328380A1CBA80CE056CA2FAF4&x-expires=2147483647&x-signature=EUAGVxl3fpiZ2w%2FlMHsHD%2FVCW54%3D

想要使用Pynimate,直接import一下就行。

import pynimate as nim

输入数据后,Pynimate将使用函数Barplot()来创建条形数据动画。

而创建这种动画,输入的数据必须是pandas数据结构(如下),其中将时间列设置为索引,换句话说索引代表的是自变量。

time, col1, col2, col3
2012   1     2     1
2013   1     1     2
2014   2     1.5   3
2015   2.5   2     3.5

具体的代码形式如下:

import pandas as pd
df = pd.read_csv('data'csv').set_index('time')

比如要处理具体的数据,写成代码应该是这样子的。

df = pd.DataFrame(
    {
        "time": ["1960-01-01", "1961-01-01", "1962-01-01"],
        "Afghanistan": [1, 2, 3],
        "Angola": [2, 3, 4],
        "Albania": [1, 2, 5],
        "USA": [5, 3, 4],
        "Argentina": [1, 4, 5],
    }
).set_index("time")

此外,要制作条形数据动画,Barplot还有三个必需的参数得注意:data、time_format和ip_freq(Interpolation frequency)。

data就是表格的数据,这里也就不再赘述。

time_format是指数据索引的时间日期格式,一般为:”%Y-%m-%d”。

最后是ip_freq,它是制作动画中比较关键的一步,通过线性插值使动画更加流畅丝滑。

一般来说,并不是所有的原始数据都适合做成动画,现在一个典型的视频是24fps,即每秒有24帧。

举个栗子,下面这个表格中的数据只有三个时间点,按理说只能生成3帧视频,最终动画也只有3/24秒。

time, col1, col2
2012   1     3  
2013   2     2   
2014   3     1

这时候,ip_freq插值(线性)就开始发挥作用了,如果插值是一个季度,则得出的数据就变成了这样:

time     col1  col2
2012-01-01  1.00  3.00
2012-04-01  1.25  2.75
2012-07-01  1.50  2.50
2012-10-01  1.75  2.25
2013-01-01  2.00  2.00
2013-04-01  2.25  1.75
2013-07-01  2.50  1.50
2013-10-01  2.75  1.25
2014-01-01  3.00  1.00

具体的插值时间间隔为多久,则要视具体的数据而定,一般绘制大数据时,设置为ip_freq = None。

至此,就能生成数据动画了,完整代码如下所示:

from matplotlib import pyplot as plt
import pandas as pd
import pynimate as nim

df = pd.DataFrame(
    {
        "time": ["1960-01-01", "1961-01-01", "1962-01-01"],
        "Afghanistan": [1, 2, 3],
        "Angola": [2, 3, 4],
        "Albania": [1, 2, 5],
        "USA": [5, 3, 4],
        "Argentina": [1, 4, 5],
    }
).set_index("time")

cnv = nim.Canvas()
bar = nim.Barplot(df, "%Y-%m-%d", "2d")
bar.set_time(callback=lambda i, datafier: datafier.data.index[i].year)
cnv.add_plot(bar)
cnv.animate()
plt.show()

这是插值为两天,生成的动画效果。

4407ddcdf8664852921694d6b451124f~tplv-tt-shrink:640:0.image?traceid=202301271328380A1CBA80CE056CA2FAF4&x-expires=2147483647&x-signature=T1geDgdH5nf9gRIqdF89GIjt3EY%3D

最后还有一个问题,那就是保存动画,有两个格式可以选择:gif或者mp4。

保存为动图一般使用:

cnv.save("file", 24, "gif")

若要保存为mp4的话,ffmpeg是个不错的选择,它是保存为mp4的标准编写器。

 pip install ffmpeg-python
conda install ffmpeg

当然,同样也可以使用Canvas.save()来保存。

cnv.save("file", 24 ,"mp4")

julkar9,Python/Flutter 开发人员,研究的方向为数据分析与可视化

小哥表示,Pynimate还会不断更新,目前正在接受大家的反馈,之后还会上线等值区域图等功能。

3ff556a6401b43e89f43cbe5dd9108b9~tplv-tt-shrink:640:0.image?traceid=202301271328380A1CBA80CE056CA2FAF4&x-expires=2147483647&x-signature=WWyI9y3tdU40uZV0gCW63cHsPos%3D

他还开发了一个应用程序:Chatmetry,同样也与数据统计有关,是一个用于创建whatsapp聊天统计数据的机器人应用程序。

这个程序可以从导出的聊天中生成各种统计信息,同时支持个人和群组聊天,并且是完全离线的,既不会保存也不会共享。

55e607fe5cfb4505aba7c773820f30cf~tplv-tt-shrink:640:0.image?traceid=202301271328380A1CBA80CE056CA2FAF4&x-expires=2147483647&x-signature=C2w87fE02VItL89ykGlW4jrfRQ4%3D

传送门:
https://julkaar9.github.io/pynimate/

版权所有,未经授权不得以任何形式转载及使用,违者必究。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK