每到月末,团队OKR复盘就是一场噩梦。产品、技术、设计三个团队各有6个维度的OKR指标,Excel表格扔过来一堆数字,老板开会问"哪个维度拖后腿了?""本月比上月进步了吗?""三组横向对比差异在哪?"——我盯着表格面面相觑。
传统做法是:把数据手动填进PPT雷达图模板,调格式,导出截图,再贴到汇报文档里。三组团队三张图,改一个数据就得重来一遍。更烦的是,PPT雷达图不支持团队切换、不显示达成率、不比对上月趋势——全是死图。
于是我用 WorkBuddy 花10分钟生成了一个单文件HTML页面,完美解决所有痛点:
下面完整记录整个实现过程,跟着操作就能复现。
核心思路:用 Canvas 手绘多边形雷达图,JavaScript 驱动数据切换,CSS Grid/Flexbox 搞定响应式布局。
打开 WorkBuddy,新建对话,输入以下提示词(这是我的原文):
帮我做一个团队OKR雷达图可视化页面,要求:
1. 单文件HTML,不依赖任何外部库
2. 6个维度:产品交付、技术质量、用户增长、团队协作、客户满意度、创新能力
3. 三组团队:产品团队、技术团队、设计团队,支持Tab切换
4. 每个维度显示目标值和实际值双环对比
5. 右侧栏显示:总体完成率(环形进度条)、最强/最弱维度、环比上月趋势
6. 响应式设计,手机和PC都能看WorkBuddy 直接生成了完整可用的代码。接下来我带你看每一块是怎么实现的。
雷达图的核心是数据。我们用一个三层嵌套的对象来管理三组团队:
const teamsData = {
product: {
name: '产品团队',
dims: ['产品交付', '技术质量', '用户增长', '团队协作', '客户满意度', '创新能力'],
target: [92, 85, 88, 90, 95, 80], // 目标值
actual: [85, 78, 75, 92, 88, 72], // 实际值
lastMonth: [80, 75, 70, 88, 85, 68], // 上月值(用于环比)
color: '#6c5ce7' // 专属色
},
tech: { /* 技术团队数据 */ },
design: { /* 设计团队数据 */ }
};每个维度值范围 0-100,代表达成百分比。三组团队共用6个维度但目标和实际值各不相同。
这是整个项目的核心技术点。不用任何图表库,纯 Canvas API 绘制网状雷达图:
步骤①:绘制背景网格
// 5层同心圆 + 从圆心发散的N条轴线
for (let level = 1; level <= 5; level++) {
const r = (maxR / 5) * level;
ctx.arc(cx, cy, r, 0, Math.PI * 2); // 同心圆
ctx.stroke();
}
for (let i = 0; i < N; i++) {
const angle = (Math.PI * 2 / N) * i - Math.PI / 2;
ctx.moveTo(cx, cy);
ctx.lineTo(cx + maxR * cos(angle), cy + maxR * sin(angle)); // 轴线
ctx.stroke();
}关键:6个维度均匀分布在360°圆周上,每个维度角度 = 2π / N。起始角度 -π/2 让第一个维度从正上方开始,视觉上更符合阅读习惯。
步骤②:绘制双环多边形
// 目标值 → 虚线多边形(六边形)
drawPolygon(ctx, data.target, ...); // 虚线描边
// 实际值 → 实心多边形 + 数据点
drawPolygon(ctx, data.actual, ...); // 半透明填充 + 实线 + 圆点drawPolygon 函数把百分比值转换成极坐标上的点,再连成多边形。目标值用虚线区分,实际值用半透明填充 + 圆点标注,一目了然。
步骤③:维度标签与数值标注
for (let i = 0; i < N; i++) {
const angle = (Math.PI * 2 / N) * i - Math.PI / 2;
// 标签放在多边形外侧
ctx.fillText(data.dims[i], lx, ly);
// 实际值标在对应数据点旁边
ctx.fillText(data.actual[i], vx, vy);
}切换逻辑非常简单,点击Tab触发 switchTeam() 函数:
function switchTeam(teamKey) {
currentTeam = teamKey;
// 1. 切换Tab高亮
document.querySelectorAll('.tab').forEach(t =>
t.classList.toggle('active', t.dataset.team === teamKey)
);
// 2. 重绘雷达图
drawRadar(teamKey);
// 3. 更新侧栏数据
updateSidebar(teamKey);
}三件事同步完成:Tab样式切换 → Canvas重绘 → 侧栏数据刷新。整个过程不到50ms,视觉上无缝过渡。
三个统计卡片,数据全部从 JavaScript 实时计算:
① 总体完成率(环形进度条)
const rates = data.actual.map((a, i) =>
Math.round(a / data.target[i] * 100)
);
const overall = Math.round(rates.reduce((s, v) => s + v, 0) / rates.length);用 Canvas 再画一个环形进度条,弧长 = 完成率 × 360°。
② 最强/最弱维度
let bestIdx = 0, worstIdx = 0;
rates.forEach((r, i) => {
if (r > rates[bestIdx]) bestIdx = i;
if (r < rates[worstIdx]) worstIdx = i;
});遍历6个维度的达成率,取最大值和最小值,配合绿色/红色高亮展示。
③ 环比趋势
const changes = data.actual.map((a, i) => ({
dim: data.dims[i],
pct: Math.round((a - data.lastMonth[i]) / data.lastMonth[i] * 100)
}));
changes.sort((a, b) => b.change - a.change); // 按涨幅排序直接用本月减上月算出环比变化百分比,涨了标绿、跌了标红。
CSS Flexbox + flex-wrap 搞定:
.main {
display: flex;
gap: 16px;
flex-wrap: wrap; /* 小屏自动换行 */
}
.chart-panel {
flex: 1 1 580px; /* 雷达图区弹性宽度 */
min-width: 400px;
}
.sidebar {
flex: 0 0 280px; /* 侧栏固定宽度 */
min-width: 260px;
}
@media (max-width: 900px) {
.main { flex-direction: column; } /* 窄屏纵向堆叠 */
}雷达图Canvas也随容器宽度自适应缩放,window.resize 事件触发重绘。
最终效果:
整个页面零依赖、零构建、零部署,保存为 .html 文件,浏览器直接打开就能用。发给老板或同事只需要传一个文件。
基于这个框架,你可以轻松改造成:
这个OKR雷达图的本质就是:一套极坐标绘图公式 + 一份结构化数据 + 一个Tab切换逻辑。WorkBuddy 帮我把这些用 Canvas API 和原生 JS 组装成可用的页面,省去了查文档、调布局、手写响应式CSS的时间。
整个过程最爽的地方是——我说需求,它出代码,我只需要微调数据就上线。对于非前端背景的PM/运营同学来说,这种"零代码搭看板"的能力是实打实提效的。
如果你也受够了PPT画雷达图的痛苦,现在就打开 WorkBuddy,把上面的提示词复制进去试试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。