- Support 9 chart types: line, bar, pie, scatter, bubble, donut, mixed, polar, radar - Multi-format output: ANSI, SVG, PNG, Markdown - Go + Fiber + gonum/plot - Docker support - Morandi color palette
277 lines
6.2 KiB
Markdown
277 lines
6.2 KiB
Markdown
# Picoclaw Chart
|
||
|
||
一个轻量级的图表生成 API 服务,支持多种图表类型,返回多种格式(ANSI、SVG、PNG、Markdown),适配命令行和 Web 场景。
|
||
|
||
## 功能特性
|
||
|
||
- **多种图表类型**:折线图、柱状图、饼图、散点图、气泡图、圆环图、混合图、极区图、雷达图
|
||
- **多格式输出**:ANSI(终端)、SVG(矢量图)、PNG(位图)、Markdown(Web)
|
||
- **轻量高效**:Go 语言编写,单二进制部署
|
||
- **Docker 支持**:开箱即用的容器化部署
|
||
|
||
## 支持的图表类型
|
||
|
||
| 类型 | 英文名 | 说明 |
|
||
|------|--------|------|
|
||
| `line` | 折线图 | 展示数据趋势变化 |
|
||
| `bar` | 柱状图 | 对比分类数据 |
|
||
| `pie` | 饼图 | 展示占比关系 |
|
||
| `scatter` | 散点图 | 展示数据分布 |
|
||
| `bubble` | 气泡图 | 展示多维度数据 |
|
||
| `donut` | 圆环图 | 饼图的变体 |
|
||
| `mixed` | 混合图 | 柱状图+折线图组合 |
|
||
| `polar` | 极区图 | 展示方向/角度数据 |
|
||
| `radar` | 雷达图 | 展示多维度对比 |
|
||
|
||
## 快速开始
|
||
|
||
### Docker 部署(推荐)
|
||
|
||
```bash
|
||
# 克隆项目
|
||
git clone <your-repo-url>
|
||
cd picoclaw-chart
|
||
|
||
# 启动服务
|
||
docker-compose up -d
|
||
|
||
# 查看日志
|
||
docker-compose logs -f
|
||
```
|
||
|
||
### 本地运行
|
||
|
||
```bash
|
||
# 下载依赖
|
||
go mod download
|
||
|
||
# 运行服务
|
||
go run ./cmd/server
|
||
|
||
# 或者编译后运行
|
||
go build -o server ./cmd/server
|
||
./server
|
||
```
|
||
|
||
### 环境变量
|
||
|
||
复制 `.env.example` 为 `.env` 并修改:
|
||
|
||
```bash
|
||
SERVER_PORT=3100
|
||
BASE_URL=http://localhost:3100
|
||
```
|
||
|
||
## API 文档
|
||
|
||
### 基本信息
|
||
|
||
| 属性 | 值 |
|
||
|------|-----|
|
||
| 端点 | `http://localhost:3100/api/v1/chart` |
|
||
| 方法 | `POST` |
|
||
| 内容类型 | `application/json` |
|
||
|
||
### 请求参数
|
||
|
||
```json
|
||
{
|
||
"type": "bar",
|
||
"title": "图表标题",
|
||
"data": {
|
||
"labels": ["一月", "二月", "三月"],
|
||
"datasets": [
|
||
{
|
||
"name": "销售额",
|
||
"values": [100, 150, 120],
|
||
"color": "#f9c2c8"
|
||
}
|
||
]
|
||
},
|
||
"options": {
|
||
"width": 600,
|
||
"height": 400
|
||
}
|
||
}
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `type` | string | 否 | 图表类型,默认 `line` |
|
||
| `title` | string | 否 | 图表标题 |
|
||
| `data.labels` | array | 是 | 数据标签 |
|
||
| `data.datasets` | array | 是 | 数据系列 |
|
||
| `datasets[].name` | string | 否 | 系列名称 |
|
||
| `datasets[].values` | array | **是** | 数值数组 |
|
||
| `datasets[].color` | string | 否 | 十六进制颜色 |
|
||
| `options.width` | integer | 否 | 图表宽度 |
|
||
| `options.height` | integer | 否 | 图表高度 |
|
||
|
||
### 响应字段
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `chart_id` | 图表唯一标识 |
|
||
| `text` | 纯文本描述 |
|
||
| `ansi` | ANSI 彩色文本(终端) |
|
||
| `svg` | SVG 矢量图代码 |
|
||
| `png_url` | PNG 下载 URL |
|
||
| `markdown` | Markdown 格式 |
|
||
|
||
### API 示例
|
||
|
||
```bash
|
||
# 创建柱状图
|
||
curl -X POST http://localhost:3100/api/v1/chart \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"type": "bar",
|
||
"title": "月度销售额",
|
||
"data": {
|
||
"labels": ["一月", "二月", "三月", "四月"],
|
||
"datasets": [
|
||
{ "name": "销售额", "values": [100, 150, 120, 180] }
|
||
]
|
||
}
|
||
}'
|
||
|
||
# 下载 PNG
|
||
curl -O http://localhost:3100/api/v1/chart/{chart_id}.png
|
||
|
||
# 健康检查
|
||
curl http://localhost:3100/api/v1/health
|
||
```
|
||
|
||
### API 端点
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| POST | `/api/v1/chart` | 创建图表 |
|
||
| GET | `/api/v1/chart/:id` | 获取 SVG |
|
||
| GET | `/api/v1/chart/:id.png` | 下载 PNG |
|
||
| GET | `/api/v1/health` | 健康检查 |
|
||
|
||
## 使用示例
|
||
|
||
### 折线图
|
||
|
||
```json
|
||
{
|
||
"type": "line",
|
||
"title": "温度趋势",
|
||
"data": {
|
||
"labels": ["周一", "周二", "周三", "周四", "周五"],
|
||
"datasets": [
|
||
{ "name": "最高温", "values": [22, 25, 28, 27, 30], "color": "#f9c2c8" },
|
||
{ "name": "最低温", "values": [15, 17, 18, 16, 19], "color": "#8fa3c4" }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 饼图
|
||
|
||
```json
|
||
{
|
||
"type": "pie",
|
||
"title": "市场份额",
|
||
"data": {
|
||
"labels": ["苹果", "三星", "华为", "其他"],
|
||
"datasets": [
|
||
{ "name": "销量", "values": [35, 25, 20, 20] }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 雷达图
|
||
|
||
```json
|
||
{
|
||
"type": "radar",
|
||
"title": "员工能力评估",
|
||
"data": {
|
||
"labels": ["速度", "力量", "耐力", "智力", "敏捷"],
|
||
"datasets": [
|
||
{ "name": "张三", "values": [80, 70, 90, 85, 75] }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 混合图
|
||
|
||
```json
|
||
{
|
||
"type": "mixed",
|
||
"title": "销售与目标对比",
|
||
"data": {
|
||
"labels": ["一月", "二月", "三月", "四月"],
|
||
"datasets": [
|
||
{ "name": "实际", "values": [100, 150, 120, 180] },
|
||
{ "name": "目标", "values": [120, 140, 130, 160] }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
## 默认配色
|
||
|
||
柔和莫兰迪色系:
|
||
|
||
| 索引 | 颜色 | HEX |
|
||
|------|------|-----|
|
||
| 0 | 粉橙 | `#f9c2c8` |
|
||
| 1 | 杏色 | `#f3d2b1` |
|
||
| 2 | 淡绿 | `#e1e9c5` |
|
||
| 3 | 浅蓝 | `#b2d5e8` |
|
||
| 4 | 灰蓝 | `#8fa3c4` |
|
||
| 5 | 青绿 | `#75B4A0` |
|
||
| 6 | 深青 | `#3b7f8d` |
|
||
| 7 | 棕灰 | `#a18b7c` |
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
picoclaw-chart/
|
||
├── cmd/server/ # 程序入口
|
||
├── internal/
|
||
│ ├── config/ # 配置管理
|
||
│ ├── handler/ # HTTP 处理层
|
||
│ ├── renderer/ # 图表渲染器
|
||
│ │ ├── svg.go # SVG 渲染
|
||
│ │ ├── png.go # PNG 渲染
|
||
│ │ ├── ansi.go # ANSI 渲染
|
||
│ │ ├── text.go # 文本渲染
|
||
│ │ └── utils.go # 工具函数
|
||
│ ├── service/ # 业务逻辑层
|
||
│ └── types/ # 数据结构
|
||
├── .env.example # 环境变量示例
|
||
├── Dockerfile
|
||
├── docker-compose.yml
|
||
├── skill.md # Skill 文档
|
||
└── README.md
|
||
```
|
||
|
||
## 与 picoclaw 集成
|
||
|
||
将此服务与 picoclaw Agent 集成,只需在 picoclaw 的 skills 配置中添加 `skill.md` 的内容即可。
|
||
|
||
Agent 可以通过 curl 调用此 API 生成图表,根据使用场景选择返回的格式:
|
||
- 终端显示:使用 `ansi` 字段
|
||
- Web 展示:使用 `markdown` 字段
|
||
- 内嵌 SVG:使用 `svg` 字段
|
||
|
||
## 技术栈
|
||
|
||
- **语言**:Go 1.21+
|
||
- **框架**:Fiber v2
|
||
- **图表库**:gonum/plot
|
||
- **容器**:Docker, Docker Compose
|
||
|
||
## License
|
||
|
||
MIT License
|