用 Python 复刻 B 站爆款!1960-2024 世界人口动态排名轮播图实战

用 Python 复刻 B 站爆款!1960-2024 世界人口动态排名轮播图实战 刷短视频时总能刷到动态排名柱状图Bar Chart Race尤其是世界人口变迁类视频画面丝滑、数据直观观感拉满。今天就用 Python pandas pyecharts从零实现一套 B 站风格的世界人口动态排序轮播图完整走完数据清洗、数据转换、可视化美化全流程复刻 1960—2024 年全球各国人口变迁全过程。一、项目整体介绍1.1 项目背景动态排序轮播图是当下热门的数据可视化形式凭借动态轮播、自动排名、视觉效果出众等特点广泛应用于短视频、数据分析报告中。本次项目选取1960-2024 年全球人口数据集还原六十余年间世界各国人口的兴衰与排名变化。1.2 项目核心目标数据提纯剔除大洲、地区汇总、收入分组、非主权地区等无效数据仅保留 195 个真实主权国家数据动态轮播按年份自动切换图表各国依据人口数量实时升降排名人口越多排名越靠前交互体验支持播放 / 暂停、手动切换年份、悬浮查看详细人口数值视觉美化复刻 B 站深色风格界面搭配动态渐变色柱体、圆角样式、精致时间轴达到商用级可视化效果。1.3 技术栈编程语言Python 3.x数据处理pandas数据读取、清洗、宽表转长表可视化组件pyecharts柱状图、时间轴轮播组件辅助工具JsCode实现柱体动态配色、CDN 镜像解决国内环境图表加载空白问题二、环境与依赖导入首先导入项目所需全部工具库并配置国内 ECharts 镜像彻底解决国内网络下 HTML 图表空白、加载失败的问题。python运行# 导入核心工具 import pandas as pd from pyecharts.charts import Bar, Timeline from pyecharts import options as opts from pyecharts.globals import ThemeType, CurrentConfig from pyecharts.commons.utils import JsCode # 配置国内CDN镜像修复图表加载异常 CurrentConfig.ONLINE_HOST https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/三、数据加载与初步探查3.1 加载原始数据集本次使用本地 CSV 人口数据集文件包含中文内容读取时指定编码为gbk避免乱码。数据集为宽表结构一行对应一个国家每一列代表单一年份人口数据。python运行# 读取中文版人口数据集 df pd.read_csv(rE:\python数据分析\hsz\code\世界人口\data\世界人口数据-中文版(1960-2024).csv, encodinggbk) # 查看前5行数据 df.head()3.2 数据结构分析通过df.info()探查数据集基本信息整体规模共 266 行、70 列基础属性列4 列国家名称、国家代码、指标名称、指标代码时间序列列66 列1960—2025 年人口数据其中2025 年无有效数据实际可用年份为 1960—2024数据类型属性列为文本类型人口数值为浮点型。原始数据混杂了大洲、区域汇总、非国家地区数据无法直接用于绘图必须进行深度清洗。四、数据清洗与预处理核心环节原始宽表数据杂乱、存在无效行预处理分为筛选列、剔除无效数据、宽表转长表、格式统一四大步骤。4.1 拆分属性列与年份列区分固定属性列和年份数值列为后续数据转换做准备python运行# 保留国家相关属性列 attr_cols [Country Name,Country Code,Indicator Name,Indicator Code] # 筛选所有列名为纯数字的列即所有年份列 year_cols [i for i in df.columns if i.isdigit()]4.2 剔除无效汇总数据这是清洗的核心步骤分两步过滤脏数据删除空值行国家名称为空的行多为大洲、区域汇总数据直接删除黑名单过滤自定义黑名单剔除全球 / 大洲汇总、收入等级分类、非主权领地、特殊经济区域等数据。python运行# 第一步删除国家名称为空的行 df df.dropna(subset[Country Name]) # 第二步自定义黑名单过滤无效区域 black_list [ # 全球、大洲、区域汇总 世界, 北美, 东亚与太平洋地区, 欧洲与中亚地区, 拉丁美洲与加勒比海地区, 撒哈拉以南非洲地区, 南亚, # 收入等级分类 高收入国家, 低收入国家, 中等收入国家, # 非主权地区、海外领地 阿鲁巴, 中国香港特别行政区, 中国澳门特别行政区, 波多黎各, 关岛 ] # 反向过滤保留真实主权国家 df df[~df[Country Name].isin(black_list)].reset_index(dropTrue) print(清洗后有效国家数量, df[Country Name].nunique())清洗完成后最终保留195 个真实主权国家数据质量达标。4.3 宽表转长表数据重塑原始宽表不适合时序轮播图展示使用pd.melt()将宽表转为长表拆分出Year年份和Population人口两列每条数据对应「单个国家 单一年份 人口数值」。python运行# 宽表转长表 df_long pd.melt( df, id_varsattr_cols, # 固定不变的属性列 value_varsyear_cols, # 需要拆分的年份列 var_nameYear, # 拆分后新列名年份 value_namePopulation# 拆分后新列名人口 ) df_long.head()4.4 格式统一与最终精简仅保留绘图必需的三列数据统一数据类型并剔除 2025 年空值数据python运行# 仅保留核心字段国家、年份、人口 df_clean df_long[[Country Name,Year,Population]] # 年份转为整数类型人口转为数值类型 df_clean[Year] df_clean[Year].astype(int) df_clean[Population] pd.to_numeric(df_clean[Population]) # 删除空值数据 df_clean.dropna(inplaceTrue)处理后得到 12675 条有效时序数据可正式进入可视化阶段。五、可视化开发从基础图到 B 站风格美化整体分三阶段开发单年份图表测试 → 基础时间轮播图 → 商业级美化完整版。5.1 单年份柱状图测试先以 1990 年数据做原型测试验证横向柱状图渲染、排序逻辑是否正常选用深色主题贴合 B 站风格python运行# 筛选1990年数据按人口降序取前20名 test_df df_clean[df_clean[Year]1990] test_df test_df.sort_values(byPopulation,ascendingFalse).head(20) # 绘制横向柱状图 bar_test ( Bar(init_optsopts.InitOpts(themeThemeType.DARK)) .add_xaxis(test_df[Country Name].tolist()) .add_yaxis(人口, test_df[Population].tolist()) .reversal_axis() # 转为横向柱状图 .set_global_opts( title_optsopts.TitleOpts(title1990年世界人口排名), legend_optsopts.LegendOpts(is_showFalse) # 隐藏多余图例 ) .set_series_opts(label_optsopts.LabelOpts(positionright)) ) # 渲染为HTML文件 bar_test.render(单年份人口排名.html)测试图表渲染正常横向布局、标签位置、深色主题均符合预期。5.2 基础版时间轮播图基于单图逻辑结合Timeline时间轴组件实现年份自动轮播、动态排名核心功能python运行# 初始化时间轴容器 timeline Timeline(init_optsopts.InitOpts(width1500px,height820px,themeThemeType.DARK)) # 获取所有年份列表 year_list df_clean[Year].unique().tolist() # 遍历每一个年份逐个生成柱状图并加入时间轴 for year in year_list: data_df df_clean[df_clean[Year]year] # 按人口降序取前20名再升序排列保证人口多的国家在图表上方 data_df data_df.sort_values(byPopulation,ascendingFalse).head(20) data_df data_df.sort_values(byPopulation,ascendingTrue) country data_df[Country Name].tolist() population data_df[Population].tolist() # 绘制单年份柱状图 bar ( Bar(init_optsopts.InitOpts(themeThemeType.DARK)) .add_xaxis(country) .add_yaxis(人口, population) .reversal_axis() .set_global_opts( title_optsopts.TitleOpts(titlef{year}年世界人口排名), legend_optsopts.LegendOpts(is_showFalse) ) .set_series_opts(label_optsopts.LabelOpts(positionright)) ) timeline.add(bar, str(year)) # 配置轮播规则自动播放、间隔600ms、循环播放 timeline.add_schema(is_auto_playTrue,play_interval600,is_loop_playTrue) # 导出基础轮播图 timeline.render(基础人口轮播图.html)运行代码后即可得到基础动态轮播图实现年份自动切换、国家排名随人口动态变化。5.3 B 站风格完整版深度美化在基础版之上做全方位视觉优化打造专业级动态图表核心优化点动态配色、圆角柱体、深色背景、精致时间轴、自定义悬浮提示框。python运行# 定义JS动态配色不同排名柱体显示不同颜色 color_js JsCode( function(params){ let c [#ff4757,#ffa502,#fffa65,#2ed573,#1e90ff,#3742fa,#a55eea,#48dbfb] return c[params.dataIndex % c.length]; } ) # 初始化高清时间轴设置深黑背景B站风格 timeline Timeline( init_optsopts.InitOpts( width1600px, height850px, themeThemeType.DARK, bg_color#080808 # 极深灰背景提升沉浸感 ) ) year_list df_clean[Year].unique().tolist() # 遍历年份生成美化版柱状图 for year in year_list: data_df df_clean[df_clean[Year]year] data_df data_df.sort_values(byPopulation,ascendingFalse).head(20) data_df data_df.sort_values(byPopulation,ascendingTrue) country data_df[Country Name].tolist() population data_df[Population].tolist() bar ( Bar() .add_xaxis(country) .add_yaxis( 人口, population, # 动态颜色、圆角、透明度 itemstyle_optsopts.ItemStyleOpts(colorcolor_js,opacity0.85,border_radius7), # 自定义标签格式显示「人口数人」 label_optsopts.LabelOpts(positionright,formatter{c}人,font_size11) ) .reversal_axis() .set_global_opts( title_optsopts.TitleOpts(titlef{year}年世界人口排名,pos_leftcenter), legend_optsopts.LegendOpts(is_showFalse) ) ) timeline.add(bar, str(year)) # 美化时间轴蓝色轴线、高亮节点、白色加粗文字 timeline.add_schema( is_auto_playTrue, play_interval600, is_loop_playTrue, label_optsopts.LabelOpts(color#ffffff, font_size11, font_weightbold), linestyle_optsopts.LineStyleOpts(color#00a1ff, width4), itemstyle_optsopts.ItemStyleOpts(color#00a1ff,border_color#ffffff, border_width2) ) # 导出最终成品图 timeline.render(B站风格_世界人口轮播图.html)六、项目总结与效果展示6.1 最终效果整体视觉深色极简背景 多彩圆角柱体完全对标 B 站热门动态排名视频风格交互功能自动循环轮播、手动点击年份跳转、悬浮查看精准人口数据数据价值完整呈现 1960—2024 年六十余年全球人口格局变迁直观看到各国人口增速、排名升降。6.2 技术亮点数据处理通过黑名单过滤、宽表转长表完成杂乱原始数据的标准化清洗是数据分析通用思路可视化技巧结合JsCode实现柱体动态配色利用reversal_axis()精准控制排名展示逻辑环境适配配置国内 CDN 镜像解决 ECharts 在国内网络加载失败的常见问题。6.3 拓展方向大家可以在此项目基础上二次开发限定区域单独统计亚洲、欧洲等大洲内部人口排名指标替换将人口数据替换为 GDP、GDP 增速、城市人口等指标样式升级增加动画时长、字体样式、图标水印等个性化设计。