Files
smart-fin-chart/README.md
T
2026-08-23 21:23:41 +08:00

165 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 财报图表 · Joey 谨制
基于 **ECharts 5.5** 的财报数据可视化项目,模仿"方木博制"风格。
修改 CSV 数据,刷新页面即可更新图表;每张图表都可独立导出为高清 PNG。
---
## 快速开始
### 1. 启动本地服务器
```bash
# 方案 APython 3Mac/Linux 自带)
python3 -m http.server 8899
# 方案 BNode.js(需要先安装 Node
npx http-server -p 8899
# 方案 CPHPMac 自带)
php -S localhost:8899
```
### 2. 打开浏览器
访问 **http://localhost:8899**,会看到 5 张示例图表和 11 张泡泡玛特财报图表:
**示例图表:**
1. **存货、营收与存货周转天数** — 双柱 + 折线,双 Y 轴
2. **利润率与费用率拆解** — 四条率线对比
3. **毛利率与非国际净利率** — 两条主要率线
4. **营收到利润的增速对比** — 四条增速线
5. **人民币汇率两种口径** — 中间价 vs 在岸即期,带说明卡片
**泡泡玛特财报分析:**
6. **资产结构演变** — 堆叠柱状图展示类现金、应收账款、投资、经营资产
7. **盈利能力分析** — 营收、毛利、净利润及毛利率变化
8. **主要 IP 收入趋势** — 多条折线展示 MOLLY、SKULLPANDA、CRYBABY 等 IP 表现
9. **品类收入结构** — 毛绒、手办、MEGA、衍生品的占比和增长
10. **利润流向(2026H1** — 桑基图,营收拆到成本、费用、净利
11. **区域渠道同比增速** — 分区域 × 渠道的增速对比
12. **营收到利润的增速对比** — 泡泡玛特口径
13. **利润率与费用率拆解** — 毛利率、销售/管理费用率、非 GAAP 净利率
14. **净利率同比拆解** — 瀑布图,含税盾换算与税率单列项
15. **核心利润及同比增速** — 柱 + 折线
16. **核心利润率** — 毛利率 − 销售费用率 − 管理费用率
17. **主要 IP 收入占比(2026H1** — 饼图,右侧图例带收入与占比
18. **各 IP 半年收入占比(21H1-26H1** — 归一化堆叠柱状图,看收入结构变迁
19. **除 THE MONSTERS 外的 IP 收入及同比** — 柱 + 折线双轴,剔掉爆款看其余盘子
### 3. 修改数据
编辑 `data/*.csv`,保存后点击页面右上角的 **「重新加载数据」** 按钮。
CSV 格式:首行是表头,逗号分隔,数字列会自动转换。示例:
```csv
period,inventory,revenue,turnover_days
22H1,9.6,23.6,160
22年,8.7,46.2,154
```
### 4. 导出图表
每张图表右上角都有 **「导出 PNG」** 按钮,点击即可下载 2 倍分辨率的图片(适合微信公众号等场景)。
---
## 项目结构
```
echart-demo/
├── index.html # 主页面
├── data/ # 数据文件
│ ├── inventory.csv # 图 1-5:示例数据
│ ├── margin.csv
│ ├── growth.csv
│ ├── fx.csv
│ ├── ppmt.xlsx # 泡泡玛特原始财报
│ └── ppmt_*.csv # 图 6-16:从 xlsx 提取的各口径数据
├── js/
│ ├── main.js # 入口:CHARTS 清单、渲染、导出 PNG
│ ├── csv.js # CSV 解析工具
│ ├── theme.js # 主题:配色、字体、水印、共享系列构造器
│ └── charts/ # 一图一文件,共 16 张
├── test/
│ └── regress.mjs # 回归测试:SSR 渲染 16 张图 + 样式规范断言
└── css/
└── style.css # 页面样式
```
## 测试
```bash
npm test
```
用 ECharts 的 SSR 模式把 16 张图渲染成 SVG,断言:
- `legend.top` = 85、`grid.top` = 145(统一间距)
- 折线 `symbolSize` = 9、`borderWidth` = 2.5(空心圆点规范)
- SVG 属性未被字体名里的引号提前闭合
加新图后往 `regress.mjs` 顶部的 `all` 数组加一行,否则不会被测到。
---
## 设计原则
### 统一的视觉语言
所有图表共用 `js/theme.js` 的配色、字体、坐标轴样式,确保视觉一致性:
- **配色**:低饱和莫兰迪系(棕色、沙色、珊瑚红、海军蓝等)
- **字体**:苹方 / 微软雅黑,中文友好
- **坐标轴**:只留浅灰网格线,去掉轴线的存在感
- **水印**:全画布平铺"Joey 谨制",旋转 20°,透明度 0.10
### 数据标签全标注
每个数据点都显示标签,避免读者"猜数值"。密集时上下交错放置(见图 2),不用 hover tooltip 替代。
### 底部注释
重要的计算口径、数据来源写在图表底部(用 `graphic.text`),不依赖外部文档。
---
## 常见问题
**Q:为什么必须用本地服务器,不能直接双击 `index.html`**
A:浏览器的同源策略禁止 `file://` 协议读取 CSV,会报 CORS 错误。启动服务器后用 `http://` 访问即可。
**Q:修改 CSV 后刷新页面,图表没变化?**
A:点击页面右上角的 **「重新加载数据」** 按钮。普通刷新可能吃到浏览器缓存,按钮会加时间戳绕过缓存。
**Q:如何添加新图表?**
A
1.`data/` 下创建新 CSV
2.`js/charts/` 下创建新 `.js`,从 `theme.js` 取共享配置(`lineSeries()``barSeries()``standardLegend()``periodAxis`),不要手写等价值
3.`js/main.js``CHARTS` 数组里加一行
4.`index.html` 加一个 `<div class="card">` 容器
5.`test/regress.mjs``all` 数组里加一行,然后跑 `npm test`
**Q:能改水印文字吗?**
A:编辑 `js/theme.js``WATERMARK_TEXT` 常量。
**Q:能改配色吗?**
A:编辑 `js/theme.js``PALETTE` 对象,所有图表自动同步。
---
## 技术细节
- **ECharts 5.5.1**:从 jsDelivr CDN 加载,无需 npm install
- **ES6 Modules**:用原生 `<script type="module">`,无构建步骤
- **Canvas 渲染**:页面用 canvas(性能好),导出时用 ECharts 自带的 `getDataURL` 生成 PNG
- **响应式**window resize 时重绘(水印数量跟着画布尺寸变化)
---
## 许可
本项目代码采用 MIT 协议,数据仅供示例。