Python编程实现超炫动态排序图

目录
  • 用 python 制作超燃动态排序视频
    • 1,数据预处理
    • 2,图表绘制
    • 3,制作的图表转化为视频、动画

用 python 制作超燃动态排序视频

在开始之前,先贴张图,之前网上一段时间下面这种排序风格视频很火,下面这张图当作是视频其中的一帧。

制作这样视频的原理:就是把不同的帧组合在一起拼接成视频;把不同时间的排序图拼接在一起,拼接在一起形成一个随时间快速变化的动画,转化成视频,为了观看效果加一首很燃的BGM,最后的效果很赞。

这种视频 python 也能做,基本上分为三大部分,主要用到的就是两个库函数 pandas做数据处理,matplotlib绘制表、制作视频动画

1,数据预处理

这一部分细分为:数据读取,随机生成颜色代码,城市地区与颜色映射关系构造。

本次选取的数据为从1500年到2018年各地区的人数统计(提醒一下,是各城市所在区域人口数量)

数据源链接:1500-2018各地区人口数量

# 导入库函数
import random
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.animation as animation
from IPython.display import HTML
import matplotlib
#防止动漫内存太大,报错
matplotlib.rcParams['animation.embed_limit'] = 2**128

原数据是这样的,数据之间以”,(逗号)“隔开,我们需要的只是其中的几列,所以这里利用pandas 中的 usecols做一些列提取;

#pandas读取数据,且去列名分别为name,group,year和value的值;
url = 'https://gist.githubusercontent.com/johnburnmurdoch/4199dbe55095c3e13de8d5b2e5e5307a/raw/fa018b25c24b7b5f47fd0568937ff6c04e384786/city_populations'
df = pd.read_csv(url, usecols=['name', 'group', 'year', 'value'])
df.head()

因为每个地区标记一个颜色,这里需要构造一个随机颜色代码生成函数:

#导入random函数,randomcolor用于生成颜色代码
# randomcolor生成颜色代码原理,
# 【1-9/A-F】15个数字随机组合成6位字符串前面再加上一个“#”号键
import random
def randomcolor():
    colorlist = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color =''
    for i in range(6):
        color += random.choice(colorlist)
    return '#'+ color

最后构造两个字典:一个是城市与颜色之间的,一个是城市与所在区域(亚洲、欧洲等)之间的,

形成一一映射关系方便后续处理

#对地区列表进行去重,分类;
area_list1 = set(df['name'])
# color_list用于存放随机生成颜色代码个数
# 因为后面区域个数 要与颜色个数保持一致,这里用了len函数;
color_list =[]
for i in range(len(area_list1)):
    str_1 = randomcolor()
    color_list.append(str_1)
    str_1 = randomcolor()
#area_list转化为列表
area_list_1 = [i for i in area_list1]
print(color_list)
print(area_list_1)

构造映射关系:

#colors表示 所在城市:颜色 一一对应字典形式;
colors =dict(zip(area_list_1,color_list))
print(colors)
#group_lk为 城市:所在区域 --对应字典形式;
group_lk = df.set_index('name')['group'].to_dict()
print(group_lk)

2,图表绘制

这一部分主要是利用matplotlib 写了一个在某一年中各地区人口分布的直方图绘制函数,在代码每一步中有详细注释,想实现的可以参照一下代码:

# 用plt加理图表,figsize表示图标长宽,ax表示标签
fig, ax = plt.subplots(figsize=(15, 8))
#dras_barchart生成current_year这一年各城市人口基本情况;
def draw_barchart(current_year):
    #dff对year==current_year的行,以value从升序方式排序,取后十名也就是最大值;
    dff = df[df['year'].eq(current_year)].sort_values(by='value',ascending = True).tail(12)
    # 所有坐标、标签清除
    ax.clear()
    #显示颜色、城市名字
    ax.barh(dff['name'],dff['value'],color = [colors[x] for x in dff['name']])
    dx = dff['value'].max()/200
    #ax.text(x,y,name,font,va,ha)
    # x,y表示位置;
    # name表示显示文本;
    # va,ba分别表示水平位置,垂直放置位置;
    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.transAxes表示轴坐标系,(1,0.4)表示放置位置
    ax.text(1,0.4,current_year,transform = ax.transAxes,color ='#777777',size = 46,ha ='right',weight=800)
    ax.text(0,1.06,'Population (throusands)',transform = ax.transAxes,size=12,color='#777777')
    #set_major_formatter表示刻度尺格式;
    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([])
    #margins表示自动缩放余额;
    ax.margins(0,0.01)
    # 设置后面的网格
    ax.grid(which='major',axis='x',linestyle='-')
    #刻度线和网格线是在图标上方还是下方,True为下方
    ax.set_axisbelow(True)
    ax.text(0,1.15,'The most population cities in the word from 1500 to 2018',
           transform=ax.transAxes,size=24,weight=600,ha='left',va='top')
    ax.text(1,0,'by@zeroing1',transform = ax.transAxes,color ='#777777',ha = 'right',
           bbox = dict(facecolor='white',alpha = 0.8,edgecolor='white'))
    #取消图表周围的方框显示
    plt.box(False)

#绘制2018年各城市人口情况
draw_barchart(2018)

图表如下:

3,制作的图表转化为视频、动画

用到的功能是 matplotlib 的 animation 函数,下面这个是生成一个jshtml页面,可以在线预览

#将原来的静态图拼接成动画
fig, ax = plt.subplots(figsize=(15, 8))
animator = animation.FuncAnimation(fig, draw_barchart, frames=range(1500, 2019))
#保存到jshtml
HTML(animator.to_jshtml())

展示效果如下:

当然,也可以直接生成视频保存到本地,但在此之前请确保你的电脑已经配置好 FFmpeg,然后运行下面的代码,否则的话无法生成

#生成video,并保存至指定文件夹中
animator.to_html5_video()
animator.save('E:/ceshi/country_populations1.mp4')

然后可以加上合适的背景音乐,一个超燃的动态排序视频就完成了!

以上就是Python编程实现超炫动态排序图的详细内容,更多关于Python实现动态排序图的资料请关注我们其它相关文章!

(0)

相关推荐

  • 利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有安装ImageMagick,先去这里按照自己的电脑系统下载对应版本,大家也可以通过我们下载:https://www.jb51.net/softs/140766.html,如果我们想用matplotlib的save方法渲染GIF动图,就需要安装ImageMagick. 下图是我们制作的一个动图示例:

  • python绘制动态曲线教程

    从txt种获取数据 并且通过动态曲线显示 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import time # Fixing random state for reproducibility np.random.seed(196) path = "feed.txt" file = open(path, 'r') data = [] for lin

  • python中对数据进行各种排序的方法

    Python列表具有内置的 list.sort()方法,可以在原地修改列表. 还有一个 sorted()内置的函数从迭代构建一个新的排序列表.在本文中,我们将探讨使用Python排序数据的各种技术. 请注意,sort()原始数据被破坏,sorted()没有对原始数据进行操作,而是新建了一个新数据. 一.基本的排序 最基本的排序很简单.只要使用sorted()函数即可返回一个 新的排序的列表 >>>sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] 咱们也可以使

  • 利用Python制作动态排名图的实现代码

    大家好,今天我们要讲的是如何使用 Pyecharts 制作动态排名变化图:point_down: 制作这样的一个动态图使用到的是 Pyecharts中的TimeLine(时间线轮播图) ,代码实现起来其实稍有难度,但我希望能 通过讲解这样一张动态图的制作过程,来让各位读者可以使用Pyecharts将任何一种图动起来 ,我们开始吧! 首先我们需要思考一下这样一种 动态图的生成逻辑 ,不就是把每天的数据制作成一张条形图然后轮动吗,OK那我们的 数据要整理成啥样 呢? 一个dataframe,每列是一

  • Python可视化工具如何实现动态图表

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于菜J学Python ,作者J哥 前言 这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观.如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择. 以下动态可视化地图就是J哥亲手绘制,展现了一段时间内广州市企事业单位在网上商城采购商品的分布及随时间的变化. 接下来,将手把手教你如何绘制这个动态

  • Python编程实现超炫动态排序图

    目录 用 python 制作超燃动态排序视频 1,数据预处理 2,图表绘制 3,制作的图表转化为视频.动画 用 python 制作超燃动态排序视频 在开始之前,先贴张图,之前网上一段时间下面这种排序风格视频很火,下面这张图当作是视频其中的一帧. 制作这样视频的原理:就是把不同的帧组合在一起拼接成视频:把不同时间的排序图拼接在一起,拼接在一起形成一个随时间快速变化的动画,转化成视频,为了观看效果加一首很燃的BGM,最后的效果很赞. 这种视频 python 也能做,基本上分为三大部分,主要用到的就是

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

    数据可视化动画还在用 Excel 做?今天分享一个简单的 Python 包就能分分钟搞定! 而且生成的动画也足够丝滑,效果是酱紫的: 这是一位专攻 Python 语言的程序员开发的安装包,名叫Pynimate. 目前可以直接通过PyPI安装使用. 使用指南 想要使用 Pynimate,直接import一下就行. import pynimate as nim 输入数据后,Pynimate将使用函数Barplot()来创建条形数据动画. 而创建这种动画,输入的数据必须是pandas数据结构(如下),

  • python之matplotlib学习绘制动态更新图实例代码

    简介 通过定时器Timer触发事件,定时更新绘图,可以形成动态更新图片.下面的实例是学习<matplotlib for python developers>一文的笔记. 实现 实现代码及简单介绍 通过self.user = self.user[1:] + [temp],每次删除列表的第一元素,在其尾部添加新的元素.这样完成user数据的动态更新.其他详细的解释见文中的注释部分. #-*-coding:utf-8-*- import wx from matplotlib.figure impor

  • Python 数据可视化超详细讲解折线图的实现

    绘制简单的折线图 在使用matplotlib绘制简单的折线图之前首先需要安装matplotlib,直接在pycharm终端pip install matplotlib即可 使用matplotlib绘制简单的折线图,再对其进行定制,实现数据的可视化操作 import matplotlib.pyplot as plt # 导入pyplot模块并设置别名为plt squares = [1, 4, 9, 16, 25] plt.plot(squares) plt.show() # 打开matplotib

  • Python编程使用matplotlib绘制动态圆锥曲线示例

    目录 椭圆 双曲线 抛物线 极坐标方程 作为让高中生心脏骤停的四个字,对于高考之后的人来说可谓刻骨铭心,所以定义不再赘述,直接撸图,其标准方程分别为 在Python中,绘制动图需要用到matplotlib中的animation包,其调用方法以及接下来要用到的参数为 ani = animation.FuncAnimation(fig, func, frames, interval) 其中fig为绘图窗口,func为绘图函数,其返回值为图像,frames为迭代参数,如果为整型的话,其迭代参数则为ra

  • Python编程使用PyQt5制作动态钟表示例

    目录 前言 环境配置 实现思路 老式钟表制作 电子表制作 合并两表界面 核心代码 总结 前言 大家好,我是小张~ 记得小时候,家里只有一个钟表用来看时间(含有时针.分针.秒针的那种),挂在墙上哒哒哒响个不停,现在生活条件好了.基本人手一部手机,看时间也不再依靠表了,而今天的文章内容就是与这类钟表相关: 环境配置 程序中用到的Python包 PyQt5 math sys 实现思路 实现思路分为大致分为三个部分:老式钟表制作.电子表制作.两表合并为一个界面 老式钟表制作 整体来看老式钟表界面,有以下

  • python编程冒泡排序法实现动图排序示例解析

    目录 先上个冒泡排序的效果图: 动态排序的原理 Python tkinter库Canvas操作 动态排序的完整代码 部分代码注释 先上个冒泡排序的效果图: 是不是,有那么一点点像了? 其实要做这个动图真不是很难,来看冒泡的代码: >>> def Bubble(List): L = len(List)-1 for i in range(L): for j in range(L-i): if List[j]>List[j+1]: List[j],List[j+1]=List[j+1],

  • Python编程使用PyQt5库实现动态水波进度条示例

    目录 原理介绍 代码实操 最近做了一个小项目,里面有一个需求需要添加一个动态进度条,进度条的样式就类似于水波来回起伏的那种形状,下面就是最初的展示效果(有一点区别,这里我加了一个进度自动增加的功能): 下面先说一下这个效果的制作原理 原理介绍 在介绍动态效果之前需要先看一下静态的: 如果仔细观察的话,静态图效果的呈现在于先后的两个线条的绘制,产生水波的主要是由于两线条的左右的水平错位 以及 设置的透明度不同 所造成的: 想要形成最后的水波荡漾的视觉效果,只需要把数张线条连续走向的静态图拼接在一起

  • python绘制超炫酷动态Julia集示例

    目录 前言 Mandelbrot集 无限缩放 Julia集 前言 此Julia非彼Julia,指的是对于某复数 c c c,使得迭代式 f ( z ) = z 2 + c f(z)=z^2+c f(z)=z2+c收敛的复数 z z z的集合.例如,当 c = 0 c=0 c=0时,那么其收敛区间为 z 2 < 1 z^2<1 z2<1的单位圆,对应的 c c c的Julia集便是 cos ⁡ θ + i sin ⁡ θ \cos\theta+i\sin\theta cosθ+isinθ.

随机推荐