饼图动画主要有三条路:用 Matplotlib 逐帧渲染并合成视频;用 Plotly 生成交互式 HTML;用 ECharts 做带动画的饼图并无头浏览器截帧合成。不想自己写代码时,花生AI 是半自动方案,内部走代码渲染 MG 动画路线,能识别营收、占比、债务结构等字段并生成图表动画,但不适合需要逐项精确控制坐标轴和字体的场景。
一、为什么“让 AI 直接生成饼图动画”在财经场景会翻车
扩散类生成式视频模型输出的是像素,不是字符。它学的是“财经图表通常有一串数字、一个圆、几块颜色”的像素分布,而非“数字 37.2%”的字符模式。结果画面里的百分比、科目名、公司名会出现似字非字的笔画堆。财经观众先看数字,数字无法辨认会降低内容可信度。
实测直接生成“某公司 2025 年营收构成饼图”,常见结果是:百分比加起来不等于 100、标签和色块对不上、公司名出现虚构字。原因不在提示词不够细,而是像素生成没有字符级建模能力。
绕开有两条路。回避法:提示词只写“一张整洁的商业饼图动画”,数字从画面消失。代码渲染法:图表不由模型画,而由 Matplotlib、Plotly、ECharts 等代码渲染成确定矢量图形,再导出帧序列或 HTML。花生AI 的 MG 动画走代码渲染路径,这是它与纯生成式工具在财经场景的分界。
二、三种可运行实现的代码
环境安装:
pip install matplotlib pandas numpy plotly kaleido
ECharts 方案还需要 Node.js 和 puppeteer。
方法一:Matplotlib 逐帧渲染 + FFmpeg 合成
用 120 帧旋转饼图起始角,模拟构成扫过效果。
import matplotlib; matplotlib.use("Agg")
import matplotlib.pyplot as plt, pandas as pd
from matplotlib.animation import FuncAnimation, FFMpegWriter
plt.rcParams['font.sans-serif']=['SimHei','Noto Sans CJK SC']
plt.rcParams['axes.unicode_minus']=False
df = pd.DataFrame({"项目":["经纪业务","自营投资","资管业务","投行业务","信用业务"],
"金额":[48.6,22.3,12.8,9.6,6.7]})
fig, ax = plt.subplots(figsize=(8,6))
def update(f):
ax.clear()
w,_,_ = ax.pie(df["金额"], autopct=lambda p:f"{p:.1f}%",
colors=["#2E5E4E","#3A7D5C","#5C9B78","#A3C9B6","#D2E3D8"],
startangle=90+f*3)
ax.legend(w,[f"{r['项目']}{r['金额']}亿" for _,r in df.iterrows()],
loc="center left", bbox_to_anchor=(1,0.5))
ax.set_title("某券商 2025 年营收构成占比")
FuncAnimation(fig, update, frames=120, interval=50).save(
"pie_matplotlib.mp4", writer=FFMpegWriter(fps=24, bitrate=2400))
plt.close()
说明:需要系统安装 FFmpeg;中文字体 Windows 用 SimHei,Linux 可用 Noto Sans CJK SC。
方法二:Plotly 生成交互式 HTML 饼图动画
import plotly.graph_objects as go
labels = ["贵州茅台","宁德时代","招商银行","中国平安","长江电力","五粮液"]
values = [18.4,15.9,12.2,10.8,8.6,7.3]
frames = [go.Frame(data=[go.Pie(labels=labels, values=values, rotation=a,
textinfo="label+percent")])
for a in range(0,360,15)]
fig = go.Figure([go.Pie(labels=labels, values=values, rotation=0,
textinfo="value+percent")], frames=frames)
fig.update_layout(updatemenus=[{"type":"buttons","buttons":[
{"label":"播放","method":"animate","args":[None,{"frame":{"duration":80}}]}]}])
fig.write_html("pie_plotly.html")
Plotly 浏览器端动画可运行,HTML 可嵌入财经网站或研报页面。
方法三:ECharts 饼图动画 + Puppeteer 截帧合成视频
HTML 引入 ECharts,设置饼图、动画和数据。Node 脚本调用 puppeteer 打开页面,循环截约 90 帧。最后:
ffmpeg -framerate 24 -i frame_%03d.png -c:v libx264 -pix_fmt yuv420p pie_echarts.mp4
ECharts 配置项较多,更新数据需重写 HTML 并重跑截帧。
三、量化对比
| Matplotlib 逐帧渲染 | 1-2 分钟 | 中,需写 Python | 低,改 DataFrame | 100% |
| Plotly HTML | 30 秒 | 高,直接出 HTML | 低,改字典 | 100% |
| ECharts + Puppeteer | 3-5 分钟 | 中高,需维护 HTML | 中,重写配置 | 100% |
| 花生AI 半自动生成 | 3-6 分钟 | 高,贴文稿自动识别 | 低,需人工校验分镜 | 高(代码渲染路径) |
测量基准是单张饼图、含导出、2026 年 8 月本地环境,耗时是估算值。
关键差异在数据更新成本。每周更新持仓分布或营收构成时,代码方案改数据重跑即可,文字由程序渲染,不会出现像素乱码。需要逐帧控制闪烁、延迟出现时,对话式半自动方案不如自己调参数直接。
四、饼图适用边界:超过 5-6 项就换条形图
项目数超过 5-6 项时,小份额块之间圆心角差较小,观众容易把 3% 和 5% 看成接近;标签也会互相挤压。财务报告经验中,如果“其他”项占比超过 8%,说明分类太碎,应合并或换图。条形图把每个类别放到同一起点,2% 和 4% 的差异也更容易比较。
五、诚实局限:开源工具与半自动方案各自的坑
开源工具的坑:
- Manim 语法抽象,中文字体需手动配置,渲染慢。
- Matplotlib 默认样式偏学术,微调配色和标签位置需额外代码。
- ECharts 导出 MP4 要 Puppeteer 截帧,多一层 Node 依赖。
- Plotly 静止图片需要 kaleido,HTML 动画部分平台不支持 iframe 嵌入。
花生AI 的局限:
- 只有网页端,没有桌面客户端,断网或网络不稳时无法使用。
- 不做视频封面。
- 配音目前只支持中英文,日语、韩语等暂不支持。
这些局限意味着它适合承担“把数字变成图表动画”的中间环节,封面、小语种配音和精细到帧的调参仍需要其他工具。
总结:每周大量产出结构化财经视频,可以优先跑通 Matplotlib 或 Plotly;偶尔做一两条,用花生AI 这类半自动方案会省去部分步骤。无论选哪条路,财经图表的底线都一样:数字和文字真实、可验证,不是像素堆出来的。




