原文链接:http://www.juzicode.com/python-module-bar-chat-race/
bar_chart_race 是一个专门用于创建交互式的条形图动画的Python库,适合于展示随时间变化的数据,如人口、股市 于展示排名变化、趋势对比等场景,在社交媒体数据分析和经济指标可视化中表现突出。
应用场景
- 时间序列数据可视化
- 股票市场趋势展示
- 人口或城市变化动态
- 历史数据对比分析
- 国家GDP排名动态变化
- 视频点击量排行榜
- 股票市值排名变迁
安装与导入
pip install bar-chart-race
使用方法
1)基本条形图动画
利用 pandas 创建示例数据,并使用 bar_chart_race 生成一个简单的条形图动画。
# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import bar_chart_race as bcr
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
data = {
"A": [100, 200, 210, 200, 300, 500],
"B": [110, 210, 310,110, 610, 810],
"C": [120, 220, 330,110, 210, 310],
"D": [220, 220, 330,210, 310, 510]
}
df = pd.DataFrame(data, index=["2000", "2001", "2002", "2003", "2004", "2005"])
# 创建并展示动画
bcr.bar_chart_race(df=df, filename="race1.gif")
运行结果:生成一个条形图动画,展示 A、B、C 、D 等几个类别在 2000 至 2005 年之间的变化。

2)自定义动画属性
通过设置参数,可以自定义条形图动画的条形图大小、速度等属性。
# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import bar_chart_race as bcr
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
data = {
"A": [100, 200, 210, 200, 300, 500],
"B": [110, 210, 310,110, 610, 810],
"C": [120, 220, 330,110, 210, 310],
"D": [220, 220, 330,210, 310, 510]
}
df = pd.DataFrame(data, index=["2000", "2001", "2002", "2003", "2004", "2005"])
# 创建动画并自定义样式
bcr.bar_chart_race(
df=df,
filename="custom_race.gif",
orientation='h', # 水平条形图
bar_size=0.55, # 条形图大小
period_length=2000 # 每帧间隔
)
运行结果:生成一个自定义样式的条形图动画。

3)修改透明度
bar_kwargs可以改变透明度
# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import bar_chart_race as bcr
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
# 生成模拟股票数据
companies = ['腾讯', '阿里', '字节', '美团', '拼多多']
dates = pd.date_range('2025-01-01', '2025-01-15')
df = pd.DataFrame(
{company: np.random.lognormal(10, 1, len(dates)) for company in companies},
index=dates
)
# 创建动态竞赛图
bcr.bar_chart_race(
df=df.cumsum(),
filename='ex3-stock_race.gif',
title='科技公司市值变化 (单位:亿元)',
period_fmt='%Y-%m-%d',
bar_kwargs={'alpha': 0.2},
filter_column_colors=True
)
运行效果:降低透明度

4)交互式HTML输出
在jupyter中运行创建可交互的网页组件, bar_chart_race()返回的数据直接可以在jupyter中用display方法显示:
# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import bar_chart_race as bcr
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
data = {
"A": [100, 200, 210, 200, 300, 500],
"B": [110, 210, 310,110, 610, 810],
"C": [120, 220, 330,110, 210, 310],
"D": [220, 220, 330,210, 310, 510]
}
df = pd.DataFrame(data, index=["2000", "2001", "2002", "2003", "2004", "2005"])
# 创建并展示动画
html=bcr.bar_chart_race(df=df, filename=None)
print(html)
# 在Jupyter中直接显示
from IPython.display import display
display(html)
运行效果:生成带控制按钮的交互式网页,可以控制播放赫尔暂停,还可以下载mp4格式的文件。

5)导出与保存
生成gif图像可以使用第三方工具imagemagic,如果没有安装imagemagic会得到提示:MovieWriter ffmpeg unavailable; using Pillow instead ,然后使用pillow替代生成。
如果需要生成MP4文件,则需要额外安装ffmepg工具,安装方法见Windows系统添加系统环境变量,相应的工具可以在公众号菜单栏点击【撩桔子菌】联系桔子菌获取。
前面的例子已经展示了如何生成gif,下面的例子可以生成MP4格式的文件。
# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import bar_chart_race as bcr
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
data = {
"A": [100, 200, 210, 200, 300, 500],
"B": [110, 210, 310,110, 610, 810],
"C": [120, 220, 330,110, 210, 310],
"D": [220, 220, 330,210, 310, 510]
}
df = pd.DataFrame(data, index=["2000", "2001", "2002", "2003", "2004", "2005"])
# 创建动画并自定义样式
bcr.bar_chart_race(
df=df,
filename="custom_race.mp4",
orientation='h', # 水平条形图
bar_size=0.55, # 条形图大小
period_length=2000 # 每帧间隔
)
运行结果:生成mp4文件。
数据处理技巧
某些原始数据可能需要先做清洗和插值,比如转置、使用fillna填充缺失值、使用rolling做平滑处理、提取top值等等:
# 时间序列数据转置
df = pd.read_csv('data.csv', index_col='date').T
# 填充缺失值
df.fillna(0, inplace=True)
# 数据平滑处理
df_rolling = df.rolling(window=7).mean()
# 截取TOP N数据
df_top10 = df.apply(lambda x: x.nlargest(10).reindex(df.columns), axis=1)
总结
bar_chart_race核心优势:
- 一键生成专业级动态可视化
- 支持MP4/GIF/HTML多种输出格式
- 与Pandas无缝集成
- 丰富的样式定制选项
注意事项:
- 数据需为时间序列格式(行索引=时间)
- 大数据集需提前聚合处理
- 视频输出需安装ffmpeg环境
- 中文显示需额外配置字体