Python轮子:bar-chat-race 让数据飞起来

原文链接: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环境
  • 中文显示需额外配置字体

模块官网链接:API Reference – Bar Chart Race

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注