51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 661|回复: 0
打印 上一主题 下一主题

[python] Python做可视化数据还是非常丝滑的

[复制链接]
  • TA的每日心情
    无聊
    前天 09:19
  • 签到天数: 933 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-2-2 11:49:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    数据可视化动画还在用Excel做?
      现在一个简单的Python包就能分分钟搞定!
      而且生成的动画也足够丝滑,效果是酱紫的:

      这是一位专攻Python语言的程序员开发的安装包,名叫Pynimate。
      目前可以直接通过PyPI安装使用。

      使用指南
      想要使用Pynimate,直接import一下就行。
    1.  import pynimate as nim
    复制代码


    而创建这种动画,输入的数据必须是pandas数据结构(如下),其中将时间列设置为索引,换句话说索引代表的是自变量。
    1. time, col1, col2, col3
    2.   2012   1     2     1
    3.   2013   1     1     2
    4.   2014   2     1.5   3
    5.   2015   2.5   2     3.5
    复制代码


    具体的代码形式如下:
    1. import pandas as pd
    2.   df = pd.read_csv('data'csv').set_index('time')
    复制代码


    比如要处理具体的数据,写成代码应该是这样子的。
    1.  df = pd.DataFrame(
    2.       {
    3.           "time": ["1960-01-01", "1961-01-01", "1962-01-01"],
    4.           "Afghanistan": [1, 2, 3],
    5.           "Angola": [2, 3, 4],
    6.           "Albania": [1, 2, 5],
    7.           "USA": [5, 3, 4],
    8.           "Argentina": [1, 4, 5],
    9.       }
    10.   ).set_index("time")
    复制代码


    此外,要制作条形数据动画,Barplot还有三个必需的参数得注意:data、time_format和ip_freq(Interpolation frequency)。
      data就是表格的数据,这里也就不再赘述。
      time_format是指数据索引的时间日期格式,一般为:”%Y-%m-%d”。
      最后是ip_freq,它是制作动画中比较关键的一步,通过线性插值使动画更加流畅丝滑。
      一般来说,并不是所有的原始数据都适合做成动画,现在一个典型的视频是24fps,即每秒有24帧。
      举个栗子,下面这个表格中的数据只有三个时间点,按理说只能生成3帧视频,最终动画也只有3/24秒。
    1.  time, col1, col2
    2.   2012   1     3  
    3.   2013   2     2   
    4.   2014   3     1
    复制代码


    这时候,ip_freq插值(线性)就开始发挥作用了,如果插值是一个季度,则得出的数据就变成了这样:
    1. time     col1  col2
    2.   2012-01-01  1.00  3.00
    3.   2012-04-01  1.25  2.75
    4.   2012-07-01  1.50  2.50
    5.   2012-10-01  1.75  2.25
    6.   2013-01-01  2.00  2.00
    7.   2013-04-01  2.25  1.75
    8.   2013-07-01  2.50  1.50
    9.   2013-10-01  2.75  1.25
    10.   2014-01-01  3.00  1.00
    复制代码


    具体的插值时间间隔为多久,则要视具体的数据而定,一般绘制大数据时,设置为ip_freq = None。
      至此,就能生成数据动画了,完整代码如下所示:
    1. from matplotlib import pyplot as plt
    2.   import pandas as pd
    3.   import pynimate as nim
    4.   df = pd.DataFrame(
    5.       {
    6.           "time": ["1960-01-01", "1961-01-01", "1962-01-01"],
    7.           "Afghanistan": [1, 2, 3],
    8.           "Angola": [2, 3, 4],
    9.           "Albania": [1, 2, 5],
    10.           "USA": [5, 3, 4],
    11.           "Argentina": [1, 4, 5],
    12.       }
    13.   ).set_index("time")
    14.   cnv = nim.Canvas()
    15.   bar = nim.Barplot(df, "%Y-%m-%d", "2d")
    16.   bar.set_time(callback=lambda i, datafier: datafier.data.index[i].year)
    17.   cnv.add_plot(bar)
    18.   cnv.animate()
    19.   plt.show()
    复制代码


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

      最后还有一个问题,那就是保存动画,有两个格式可以选择:gif或者mp4。
      保存为动图一般使用:
    1.   cnv.save("file", 24, "gif")
    复制代码


    若要保存为mp4的话,ffmpeg是个不错的选择,它是保存为mp4的标准编写器。
    1.    pip install ffmpeg-python
    复制代码


    或者:
      conda install ffmpeg

      当然,同样也可以使用Canvas.save()来保存。
      cnv.save("file", 24 ,"mp4")






    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-21 00:19 , Processed in 0.065732 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表