作者 | 幻灰龙
出品 | 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.5
matplotlib==3.4.2
pandas==1.2.4
numpy==1.19.5
moviepy==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可以让使用更友好:
@dataclass
class InputMeta:
'''
type: 指定类型,如果是 "json_str" 表示一个JSON文件夹,如果是"csv"表示一个csv文件
JSON 文件夹:
约定每个文件的文件名是月份,每个JSON文件是一个数组,数组元素是标签统计信息
name_field: 指定标签名字的字段名
count_field: 指定标签月份统计信息的字段名
CSV 文件
month_field: 指定月份字段
name_field: 指定标签名字的字段名
count_field: 指定标签月份统计信息的字段名
audio: 音频
'''
type: str
path: str
month_field: str
name_field: str
count_field: str
audio: str
@dataclass
class OutputMeta:
'''
输出配置
path: 输出路径
title: 标题
x_label: X轴名字
y_label: Y轴名字
month_count: 绘制月份,用来调试,使用较少的月份快速查看输出效果
'''
path: str
ext: str
title: str
x_label: str
y_label: str
month_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多家知名公司云原生和数字化一手实战经验!
☞
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.