作者 | 幻灰龙
出品 | CSDN博客
近日,CSDN开源了一个topN词竞赛动画项目topn_race:
GitCode仓库:https://gitcode.net/csdn/topn_race
核心功能:
输入:按月统计的topN词频数据
输出:topN词频竞赛动画(可带音效)
源码结构
本项目基于开源项目:https://github.com/dexplo/bar_chart_race定制,src/bar_chart_race从bar_chart_race项目的源代码修改以适配需求。
依赖库:
progress==1.5matplotlib==3.4.2pandas==1.2.4numpy==1.19.5moviepy==1.0.3
源码结构:
.├── LICENSE├── README.md├── data│ ├── csdn_ask_top10_month│ │ ├── 2008-05-01.json│ │ ├── 2008-06-01.json│ │ ├── ...│ └── csdn_trends_top10_month│ └── csdn_index_top_10.csv├── demo│ ├── csdn_ask_top10_month.gif│ ├── csdn_trends_top10_month.gif│ └── demo.md├── main.py├── pub│ ├── ...├── requirements.txt└── src├── bar_chart_race│ ├── __init__.py│ ├── chart.py│ └── colormaps.py├── common│ ├── __init__.py│ ├── error.py│ ├── gif.py│ ├── json.py│ ├── path.py│ ├── random.py│ └── utils.py└── top.py
其中:
main.py是测试程序入口
src/top.py是topN竞赛动画的逻辑组织控制层
src/common提供了一些基本的utils
src/bar_chart_race从bar_chart_race项目的源代码修改以适配需求
基本样式的内部调整
使用漫画风格
代码说明
基本用法如下:
def test_build_csdn_trend_top10_tag_race():input = InputMeta(type='csv',path='data/csdn_trends_top10_month/csdn_index_top_10.csv',month_field='date',name_field='tag_name',count_field='index_value',audio='pub/mali.mp3')output = OutputMeta(path='pub/csdn_trends_top10_month',ext='gif',title='CSDN topN指数月排行榜',x_label='csdn.net/trends',y_label='指数',month_count=None)top = Top(input, output)top.build()
Top类的构造函数传入两个参数,input: InputMeta 和output: OutputMeta。很多Python代码的参数能有几十个参数,通过InputMeta和OutputMeta两个dataclass可以让使用更友好:
@dataclassclass InputMeta:'''type: 指定类型,如果是 "json_str" 表示一个JSON文件夹,如果是"csv"表示一个csv文件JSON 文件夹:约定每个文件的文件名是月份,每个JSON文件是一个数组,数组元素是标签统计信息name_field: 指定标签名字的字段名count_field: 指定标签月份统计信息的字段名CSV 文件month_field: 指定月份字段name_field: 指定标签名字的字段名count_field: 指定标签月份统计信息的字段名audio: 音频'''type: strpath: strmonth_field: strname_field: strcount_field: straudio: str@dataclassclass OutputMeta:'''输出配置path: 输出路径title: 标题x_label: X轴名字y_label: Y轴名字month_count: 绘制月份,用来调试,使用较少的月份快速查看输出效果'''path: strext: strtitle: strx_label: stry_label: strmonth_count: int
Top 类的 build 里的处理流程包括:
转换输入数据到每月一行的 DataFrame
每12个月数据生成一个竞赛动图 GIF
原因之一:太大的GIF文件生成会有内存占用问题,分片处理。
原因之二:分片后,规避出错时要从头再来的问题。
合并多个GIF,生成一个MP4文件
如果输入指定了音频文件,使用音频源采用repeat方式与MP4合成轨道并输出带音效的文件
输出目录pub下的文件不提交到git仓库,需要注意的是,构建过程中不同平台上的中文字体会有差异,目前适配了Mac和Linux的字体,其他平台待测试。
实例:CSDN topN指数月排行榜竞赛动图
CSDN指数
CSDN指数是基于自2000年以来CSDN平台产生的海量内容数据、用户行为计算而来,作为中国知名专业IT技术社区,CSDN指数具备高度权威性,您可通过查询关键字,用以进行技术领域趋势分析、技术选型变迁历史探索、技术内容消费特征洞察、开发者岗位需求预测等。
我们用CSDN指数的数据做了一个topN指数月排行榜竞赛动图。竞赛动画部分片段GIF:
完整版本请看:
CSDN topN指数月排行榜竞赛动画(2000.1-2021.12)独立视频:https://vedu.csdnimg.cn/original/e1eb794defa74b8c8bae0fcb1daaefda/3e1fbcc6-17e0a46ff27.mp4
CSDN topN指数月排行榜竞赛动画(2000.1-2021.12)社区帖子:https://bbs.csdn.net/topics/603979017
数据可视化
数据经过可视化处理后,可以发现数据间的规律,欢迎对项目提交贡献。开箱即用的漫画风格topN竞赛动图:https://gitcode.net/csdn/topn_race
《新程序员003》正式上市,50余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
☞
☞