{"id":"b4c66f51-0f57-4232-9198-88e21864674d","entityType":"agent","slug":"clawhub-veezvg-veezvg-data-visualization","name":"Data Visualization","canonicalUrl":"https://www.xpersona.co/agent/clawhub-veezvg-veezvg-data-visualization","canonicalPath":"/agent/clawhub-veezvg-veezvg-data-visualization","generatedAt":"2026-10-11T07:35:21.754Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":null},"description":"根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/... Skill: Data Visualization Owner: veezvg Summary: 根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-20T03:22:27.227Z | auto Initial release with professional multi-style data visualization code generation using matplotlib: - Intelligently selects optimal ch","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17852ervbnpeg1e5sf8abe7gs857gbr:veezvg-data-visualization","sourceUrl":"https://clawhub.ai/veezvg/veezvg-data-visualization","homepage":"https://clawhub.ai/veezvg/skills/veezvg-data-visualization","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/veezvg/veezvg-data-visualization","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/veezvg/skills/veezvg-data-visualization","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":null},"stars":null,"forks":null,"downloads":1157,"packageName":null,"latestVersion":"1.0.0","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:39:30.305Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T04:39:30.369Z","lastCrawledAt":"2026-10-11T04:39:30.305Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T04:39:30.305Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.0","createdAt":"2026-04-20T03:22:27.227Z","changelog":"Initial release with professional multi-style data visualization code generation using matplotlib: - Intelligently selects optimal chart type based on data type and user scenario. - Supports three professional style templates: BCG (default green), The Economist (media red-blue), McKinsey (bright cyan/grey). - Provides complete runnable Python script examples for each style and chart type. - Enforces strict visual guidelines, color schemes, and formatting for each style. - Offers clear workflow and chart selection guidance for fast, standardized visualization output.","fileCount":12,"zipByteSize":30059}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17852ervbnpeg1e5sf8abe7gs857gbr:veezvg-data-visualization","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T07:35:21.753Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-veezvg-veezvg-data-visualization/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":null},"readme":"Skill: Data Visualization\n\nOwner: veezvg\n\nSummary: 根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/...\n\nTags: latest:1.0.0\n\nVersion history:\n\nv1.0.0 | 2026-04-20T03:22:27.227Z | auto\n\nInitial release with professional multi-style data visualization code generation using matplotlib:\n\n- Intelligently selects optimal chart type based on data type and user scenario.\n- Supports three professional style templates: BCG (default green), The Economist (media red-blue), McKinsey (bright cyan/grey).\n- Provides complete runnable Python script examples for each style and chart type.\n- Enforces strict visual guidelines, color schemes, and formatting for each style.\n- Offers clear workflow and chart selection guidance for fast, standardized visualization output.\n\nArchive index:\n\nArchive v1.0.0: 12 files, 30059 bytes\n\nFiles: examples/bcg_hbar.py (2918b), examples/economist_hbar.py (5673b), examples/economist_line.py (3731b), examples/mckinsey_grouped_hbar.py (4045b), examples/mckinsey_grouped_vbar.py (4881b), examples/mckinsey_stack100.py (3314b), README.md (5611b), references/chart_selection.md (3660b), references/visualization_spec.md (27540b), skill-card.md (1955b), SKILL.md (4781b), _meta.json (144b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: veezvg-data-visualization\nversion: 1.0.0\ndescription: |\n  根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。\n  支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。\n  触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/热力图等。\n  关键词：可视化、图表、chart、plot、visualization、画图、matplotlib、数据图、经济学人风格、麦肯锡风格、BCG风格\n---\n\n# Data Visualization\n\n根据数据类型智能选择图表，按统一规范生成 Python matplotlib 代码。**三套风格均按真实报告视觉提取并可复刻。**\n\n## 工作流程\n\n1. **询问风格** - 若用户未指定风格，展示三套选项供选择\n2. **分析数据** - 识别数据类型（时序、分类、占比等）\n3. **选择图表** - 参考 `references/chart_selection.md` 匹配最佳图表类型\n4. **找对应示例** - **优先从 `examples/` 中找最接近的模板脚本，直接照着改**\n5. **查细节规范** - 遇到 examples 没覆盖的场景，查 `references/visualization_spec.md`\n6. **输出代码** - 生成完整可运行的 Python 代码\n\n## 风格选项\n\n| # | 风格 | 适用场景 | 主色 |\n|---|------|---------|------|\n| 1 | **BCG**（默认） | 通用数据分析、研究报告 | 绿色 `#2ca02c` |\n| 2 | **The Economist** | 媒体发布、公开报告 | 红线 `#E3120B` + 蓝 `#006BA2` |\n| 3 | **McKinsey** | 咨询汇报、高管演示 | 亮青 `#2CBDEF` + 浅灰 `#D4D4D4` |\n\n## 示例脚本（examples/）\n\n**所有示例都是完整可运行的脚本，改数据即用。**\n\n| 脚本 | 风格 | 图表类型 | 参考 |\n|------|------|---------|------|\n| `bcg_hbar.py` | BCG | 水平柱状图 | 通用调研报告 |\n| `economist_hbar.py` | Economist | 水平条形图 | 类别排行对比 |\n| `economist_line.py` | Economist | 折线图（时间序列） | 多系列趋势，重点上色 |\n| `mckinsey_grouped_vbar.py` | McKinsey | 分组垂直柱 | Exhibit 7 样式 |\n| `mckinsey_grouped_hbar.py` | McKinsey | 分组水平条 | Exhibit 4 样式 |\n| `mckinsey_stack100.py` | McKinsey | 100% 堆叠单条 | Exhibit 1 样式（Likert-scale） |\n\n## 图表选择速查\n\n| 数据类型 | 推荐图表 |\n|---------|---------|\n| 趋势变化 | Line Chart |\n| 类别比较 | Bar Chart |\n| 占比分布 (≤5项) | Pie/Donut |\n| 占比分布 (>5项) | Stacked Bar |\n| Top vs Others 对比 | 分组柱状图（McKinsey 标配） |\n| Likert-scale 分布 | 100% 堆叠单条（渐变色） |\n| 相关性 | Scatter Plot |\n| 层级结构 | Treemap |\n\n完整 25 种数据类型映射见 `references/chart_selection.md`。\n\n## 各风格核心规范速查\n\n### BCG 风格\n- 主色 `#2ca02c`（绿），无渐变\n- 标题含样本量 `(N=X)`\n- 去除上/右/下边框，无网格线\n\n### The Economist 风格\n- **白色背景**（非蓝灰）\n- 顶部标志元素：全宽红线 `#E3120B` + 左上角红色方块 tag，都用 `fig.transFigure + clip_on=False`（**禁用 `fig.add_axes`**）\n- 所有左对齐元素（红线起点/tag/标题/分类标签）共用基准 `LEFT_X=0.14`\n- 主数据系列 `#006BA2`，灰化对照 `#758D99`\n- 分类标签必须用 `blended_transform_factory(fig.transFigure, ax.transData)` 对齐，否则会超出 LEFT_X 左端\n\n### McKinsey 风格\n- **亮青 `#2CBDEF` + 浅灰 `#D4D4D4`** 二元对照（非单色高亮其他灰化）\n- 左上\"Exhibit X\"小灰字 + 下方全宽细分隔线\n- 超大粗体标题（15~17pt），结论句\n- 图例在**右上角**，色块 + 文字纵向排列\n- 柱子必须**窄**（`width=0.32~0.38`）\n- y 轴隐藏刻度，数字直接写在柱上\n- 来源注脚写 `Source:` 或\"资料来源：\"\n\n## 三条常见坑（必看）\n\n1. **禁用 `fig.add_axes`**（会与布局系统冲突）。Economist 的红线/tag 用 `ax.plot + mpatches.Rectangle` 配 `fig.transFigure + clip_on=False`。\n2. **禁用 `ax.set_ylabel` 放中文单位**（会伸出 `LEFT_X` 左侧破坏对齐）。y 方向单位写进副标题；`set_xlabel` 可用（在 x 轴下方居中）。\n3. **轴刻度 formatter 禁止含中文汉字**（字体缺失变方块）。中文单位用副标题或 `set_xlabel`。\n\n完整规范（三套共享工具函数 + 所有代码模板）见 `references/visualization_spec.md`。\n\n## 关键约束\n\n1. 占比数据超过 5 项时，用堆叠柱状图替代饼图\n2. 中文必须通过 `FontProperties` 显式设置（`/System/Library/Fonts/STHeiti Light.ttc`）\n3. BCG 标题含样本量 `(N=X)`；McKinsey 标题是结论句 + \"Exhibit X\"编号；Economist 标题是描述性短句\n4. 数据标签格式 `{:.1f}%` 或 `{:.2f}`（看量级）\n\nFile v1.0.0:README.md\n\n# data-visualization\n\n一个专门生成**专业咨询 / 媒体报告风格图表代码**的 Skill。\n\n它会根据数据类型自动选择合适图表，并输出可直接运行的 **Python matplotlib** 代码，重点支持三种常见的高质感配图风格：\n\n- **McKinsey**，麦肯锡咨询汇报风\n- **BCG**，波士顿咨询简洁分析风\n- **The Economist**，经济学人媒体图表风\n\n适合用在研究报告、咨询汇报、行业分析、内容配图、文章插图等场景。\n\n## 效果展示\n\n### BCG 风格\n\n![BCG 风格水平条形图](assets/showcase/bcg-income-hbar.png)\n\n六城居民可支配收入对比，绿色极简、适合研究报告和内部分析。\n\n### The Economist 风格\n\n![The Economist 风格水平条形图](assets/showcase/economist-income-hbar.png)\n\n同一组收入数据改写为经济学人媒体图表语言，顶部红线和蓝色主系列更适合公开内容配图。\n\n### McKinsey 风格\n\n![McKinsey 风格分组横条图](assets/showcase/mckinsey-grouped-hbar.png)\n\n典型咨询图表表达，适合做 Top performers vs Others 之类的对照分析。\n\n![McKinsey 风格柱线组合图](assets/showcase/mckinsey-bar-line-combo.png)\n\n柱线组合图示例，适合同时表达销量与人群规模等双指标趋势。\n\n## 这个 Skill 能做什么\n\n### 1. 按数据类型选图\n它不是只会“画柱状图”的模板集合，而是会先判断数据结构，再选更合适的图表形式。\n\n例如：\n- 趋势变化 -> 折线图\n- 类别比较 -> 柱状图 / 条形图\n- Likert 量表分布 -> 100% 堆叠条\n- Top vs Others -> 分组柱状图\n- 占比项过多 -> 用堆叠条替代饼图\n\n### 2. 输出可运行代码\n生成的是完整 **matplotlib Python 脚本**，不是抽象建议。拿去改数据就能用。\n\n### 3. 统一风格规范\n内置三套风格规范，不只是换个配色，而是连标题、标注、图例、留白、分隔线、标签对齐方式都做了约束。\n\n## 支持的三套风格\n\n### McKinsey\n适合：咨询汇报、高管材料、Exhibit 风格页面\n\n特点：\n- 亮青 + 浅灰的二元对照色\n- 左上角 Exhibit 编号\n- 强结论式标题\n- 右上角纵向图例\n- 柱子更窄，整体更克制\n\n### BCG\n适合：通用分析、研究报告、内部汇报\n\n特点：\n- 绿色主色\n- 简洁、直给、信息密度高\n- 标题中可包含样本量 N\n- 去掉多余边框和装饰\n\n### The Economist\n适合：公开发布、媒体内容、文章配图\n\n特点：\n- 顶部标志性红线 + 红色 tag\n- 蓝色主数据系列 + 灰蓝对照色\n- 白底、强识别度、偏媒体表达\n- 对标题、左侧标签对齐有明确规范\n\n## 仓库结构\n\n```text\n.\n├── SKILL.md\n├── README.md\n├── examples/\n│   ├── bcg_hbar.py\n│   ├── economist_hbar.py\n│   ├── economist_line.py\n│   ├── mckinsey_grouped_hbar.py\n│   ├── mckinsey_grouped_vbar.py\n│   └── mckinsey_stack100.py\n└── references/\n    ├── chart_selection.md\n    └── visualization_spec.md\n```\n\n## examples 里有什么\n\n仓库里的示例都是真正可运行的 matplotlib 脚本。\n\n- `bcg_hbar.py`，BCG 风格水平条形图\n- `economist_hbar.py`，经济学人风格水平条形图\n- `economist_line.py`，经济学人风格折线图\n- `mckinsey_grouped_vbar.py`，麦肯锡风格分组竖柱图\n- `mckinsey_grouped_hbar.py`，麦肯锡风格分组横条图\n- `mckinsey_stack100.py`，麦肯锡风格 100% 堆叠条图\n\n## references 里有什么\n\n### `references/chart_selection.md`\n给出“数据类型 -> 推荐图表类型”的映射，方便在生成代码前先判断用什么图更合适。\n\n### `references/visualization_spec.md`\n沉淀三套风格的视觉规范，包括：\n- 配色\n- 标题层级\n- 分隔线\n- 标签位置\n- 图例样式\n- 数据标签格式\n- 中文字体处理\n- matplotlib 里的实现细节\n\n## 使用方式\n\n### 在 OpenClaw / Agent 场景中\n把这个目录作为一个 Skill 使用。用户提出“帮我把这组数据画成麦肯锡风格图表”之类请求时，优先：\n\n1. 判断数据类型\n2. 选择图表形式\n3. 从 `examples/` 找最接近模板\n4. 参考 `references/visualization_spec.md` 补细节\n5. 输出完整 Python 代码\n\n### 你可以这样描述需求\n\n- 用经济学人风格画一个折线图\n- 把这组问卷结果做成麦肯锡风格 Exhibit\n- 用 BCG 风格画 Top 10 排行条形图\n- 帮我根据这张表自动选择合适图表并输出 matplotlib 代码\n\n## 适合谁用\n\n- 用户研究员\n- 商业分析师\n- 咨询顾问\n- 内容创作者\n- 需要快速做“像报告里那样的图”的人\n\n## 为什么这个 Skill 有价值\n\n很多“图表生成”工具只解决“能画出来”，但不解决“画得像专业报告”。\n\n这个 Skill 的重点是把三类高频视觉风格沉淀成**可复用规范 + 可运行模板**：\n\n- 不是只有灵感，而是能复刻\n- 不是只有截图，而是能生成代码\n- 不是只有单图，而是能变成持续产出的工作流\n\n## 注意事项\n\n- 中文图表建议显式设置字体\n- 占比项太多时不要硬上饼图\n- 经济学人风格对对齐要求高，尤其是左侧标签和顶部标志元素\n- 麦肯锡风格重点不只是配色，更在于标题语气、图例位置和版式秩序\n\n## 未来可扩展方向\n\n- 增加更多图表模板（散点图、热力图、瀑布图、桑基图）\n- 增加 seaborn / plotly 版本\n- 增加自动读 CSV / Excel 后直接出图的工作流\n- 增加适配中文商业报告的主题模板\n\n## License\n\n如需开源发布，建议补充许可证后再进一步传播。\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dmra4rnk024babj3zt1eh5s82gvd5\",\n  \"slug\": \"veezvg-data-visualization\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776655347227\n}\n\nFile v1.0.0:references/chart_selection.md\n\n# 图表选择指南\n\n根据数据类型智能选择最合适的图表类型。\n\n## 选择规则表\n\n| No. | 数据类型 | 关键词 | 推荐图表 | 备选图表 |\n|-----|---------|--------|---------|---------|\n| 1 | 趋势数据 | trend, time-series, line, growth, timeline, progress | Line Chart | Area Chart, Smooth Area |\n| 2 | 类别比较 | compare, categories, bar, comparison, ranking | Bar Chart (Horizontal/Vertical) | Column Chart, Grouped Bar |\n| 3 | 占比数据 | part-to-whole, pie, donut, percentage, proportion, share | Pie Chart / Donut | Stacked Bar, Treemap |\n| 4 | 相关性/分布 | correlation, distribution, scatter, relationship, pattern | Scatter Plot / Bubble Chart | Heat Map, Matrix |\n| 5 | 热力图/强度 | heatmap, heat-map, intensity, density, matrix | Heat Map / Choropleth | Grid Heat Map, Bubble Heat |\n| 6 | 地理数据 | geographic, map, location, region, geo, spatial | Choropleth Map, Bubble Map | Geographic Heat Map |\n| 7 | 漏斗/流程 | funnel, flow | Funnel Chart, Sankey | Waterfall |\n| 8 | 绩效 vs 目标 | performance, target | Gauge Chart / Bullet Chart | Dial, Thermometer |\n| 9 | 时序预测 | time-series, forecast | Line with Confidence Band | Ribbon Chart |\n| 10 | 异常检测 | anomaly, detection | Line Chart with Highlights | Scatter with Alert |\n| 11 | 层级/嵌套数据 | hierarchical, nested, data | Treemap | Sunburst, Nested Donut, Icicle |\n| 12 | 流程数据 | flow, process, data | Sankey Diagram | Alluvial, Chord Diagram |\n| 13 | 累计变化 | cumulative, changes | Waterfall Chart | Stacked Bar, Cascade |\n| 14 | 多变量比较 | multi-variable, comparison | Radar / Spider Chart | Parallel Coordinates, Grouped Bar |\n| 15 | 股票/交易 OHLC | stock, trading, ohlc | Candlestick Chart | OHLC Bar, Heikin-Ashi |\n| 16 | 关系/连接数据 | relationship, connection, data | Network Graph | Hierarchical Tree, Adjacency Matrix |\n| 17 | 分布/统计 | distribution, statistical | Box Plot | Violin Plot, Beeswarm |\n| 18 | 绩效目标(紧凑) | performance, target, compact | Bullet Chart | Gauge, Progress Bar |\n| 19 | 比例/百分比 | proportional, percentage | Waffle Chart | Pictogram, Stacked Bar 100% |\n| 20 | 层级比例 | hierarchical, proportional | Sunburst Chart | Treemap, Icicle, Circle Packing |\n| 21 | 根因分析 | root cause, decomposition, tree, hierarchy, drill-down, ai-split | Decomposition Tree | Decision Tree, Flow Chart |\n| 22 | 3D 空间数据 | 3d, spatial, immersive, terrain, molecular, volumetric | 3D Scatter / Surface Plot | Volumetric Rendering, Point Cloud |\n| 23 | 实时流数据 | streaming, real-time, ticker, live, velocity, pulse | Streaming Area Chart | Ticker Tape, Moving Gauge |\n| 24 | 情感/情绪 | sentiment, emotion, nlp, opinion, feeling | Word Cloud with Sentiment | Sentiment Arc, Radar Chart |\n| 25 | 流程挖掘 | process, mining, variants, path, bottleneck, log | Process Map / Graph | DAG, Petri Net |\n\n## 使用方法\n\n1. **识别数据类型**：根据数据特征和分析目的确定数据类型\n2. **匹配关键词**：查找与需求匹配的关键词\n3. **选择图表**：优先使用「推荐图表」，特殊情况可使用「备选图表」\n4. **应用规范**：按 `guidelines/visualization_spec.md` 中的规范生成图表\n\n## 常用场景速查\n\n### 展示趋势变化\n→ **Line Chart** (折线图)\n\n### 比较不同类别\n→ **Bar Chart** (柱状图)\n\n### 展示占比分布\n→ **Pie/Donut** (饼图/环形图) - 限5项以内\n→ **Stacked Bar** (堆叠柱状图) - 超过5项时使用\n\n### 展示相关性\n→ **Scatter Plot** (散点图)\n\n### 展示层级结构\n→ **Treemap** (矩形树图)\n\nFile v1.0.0:references/visualization_spec.md\n\n# 可视化规范\n\n支持三套专业风格模板，按用户选择应用对应规范。\n\n---\n\n## 通用约束（所有风格适用）\n\n- **中文字体**: 使用 `/System/Library/Fonts/STHeiti Light.ttc`，通过 `FontProperties` 对象显式设置所有文本元素\n- **图表尺寸**: 根据内容调整，一般为 `(10, 6)` 或 `(12, 7)`\n- **DPI**: 保存时使用 300 DPI\n- **占比数据**: 超过 5 项时用堆叠柱状图替代饼图\n- **数据标签**: 百分比格式 `{:.1f}%`\n\n## ⚠️ 布局关键规范（必须遵守，防止内容遮挡）\n\n**核心原则：标题、副标题、来源注脚均不得与数据区域重叠。**\n\n1. **禁止混用 `tight_layout` 和 `fig.add_axes`**  \n   `fig.add_axes`（如 Economist 的顶部红色标签栏）与 `tight_layout` 不兼容，会导致布局错乱。  \n   凡使用 `fig.add_axes` 的图表，**必须改用 `fig.subplots_adjust`** 显式控制子图边距。\n\n2. **标题文字与数据区域必须分离**  \n   使用 `fig.subplots_adjust(top=...)` 在子图上方预留足够空间，再用 `fig.text(x, y, ...)` 将标题放入该空间。  \n   **不要**用 `ax.set_title` + 大 `pad` 值来腾挪空间——这在有 `fig.add_axes` 时会失效。\n\n3. **推荐的安全边距设置**\n\n   ```python\n   # 有顶部标签栏（Economist 风格）\n   fig.subplots_adjust(left=0.10, right=0.90, top=0.72, bottom=0.12)\n   # 标题区：fig.text(x, 0.88~0.96, ...)\n   # 红色栏：fig.add_axes([0, 0.975, 1, 0.025])\n\n   # 无顶部标签栏（McKinsey / BCG 风格）\n   fig.subplots_adjust(left=0.08, right=0.95, top=0.72, bottom=0.14)\n   # 标题区：fig.text(x, 0.88~0.96, ...)\n   ```\n\n4. **y 轴上限留白**  \n   垂直柱状图的 `ax.set_ylim` 上限应比最大数据值高 **15~20%**，确保柱顶标签不被截断。  \n   例：最大值为 8.48，则 `ax.set_ylim(0, 10.5)`。\n\n5. **底部来源注脚**  \n   使用 `fig.text(x, 0.02~0.03, ...)` 放置，`subplots_adjust(bottom=0.12)` 确保不被裁切。\n\n---\n\n## Style 1：BCG 风格（默认）\n\n### 设计原则\n简洁、克制，数据说话。绿色为唯一主色，无渐变，无装饰。\n\n### 规范\n| 属性 | 值 |\n|------|-----|\n| 主色 | `#2ca02c`（BCG 绿） |\n| 背景 | 白色 |\n| 上/右边框 | 去除 |\n| 下/左边框 | 保留（黑色，1px） |\n| 网格线 | 关闭 |\n| 标题字号 | 20，加粗 |\n| 标题内容 | 描述性，含样本量 `(N=X)` |\n| 轴标签字号 | 16 |\n\n### 代码模板\n\n```python\nimport matplotlib.pyplot as plt\nfrom matplotlib.font_manager import FontProperties\n\n# ── 字体 ──────────────────────────────────────────────\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp = FontProperties(fname=font_path)\n\n# ── 配色 ──────────────────────────────────────────────\nCOLOR_MAIN = '#2ca02c'   # BCG 绿\n\n# ── 数据（示例） ───────────────────────────────────────\nlabels = ['类别A', '类别B', '类别C', '类别D']\nvalues = [42.5, 31.2, 16.8, 9.5]\nN = 200\n\n# ── 画布 ──────────────────────────────────────────────\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# ── 绘图（水平柱状图示例） ─────────────────────────────\nbars = ax.barh(range(len(labels)), values, color=COLOR_MAIN, height=0.6)\nax.set_yticks(range(len(labels)))\nax.set_yticklabels(labels, fontproperties=fp, fontsize=13)\nax.set_xlabel('占比 (%)', fontproperties=fp, fontsize=16)\nax.set_title(f'维度名称 (N={N})', fontproperties=fp, fontsize=20, fontweight='bold')\n\n# ── 边框处理 ───────────────────────────────────────────\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\nax.spines['bottom'].set_visible(False)\nax.spines['left'].set_color('black')\nax.spines['left'].set_linewidth(1)\n\n# ── 网格 ───────────────────────────────────────────────\nax.grid(False)\n\n# ── 数据标签 ───────────────────────────────────────────\nfor i, (bar, val) in enumerate(zip(bars, values)):\n    ax.text(val + 0.8, i, f'{val:.1f}%', va='center', fontproperties=fp, fontsize=12)\n\nplt.tight_layout()\nplt.savefig('output_bcg.png', dpi=300, bbox_inches='tight')\nplt.close()\n```\n\n---\n\n## Style 2：The Economist 风格\n\n> 参考：[Making Economist-Style Plots in Matplotlib](https://medium.com/data-science/making-economist-style-plots-in-matplotlib-e7de6d679739)\n\n### 设计原则\n严肃媒体风格，数据优先，排版精准。无论图表类型（柱状/折线/Dumbbell），都共享同一套视觉骨架：\n\n**五个必备元素（缺一不可）：**\n1. 顶部全宽红色横线（`#E3120B`）\n2. 左上角红色方块 tag（`#E3120B`）\n3. 左对齐基准线（红线起点 / tag / 标题 / 分类标签都从同一 x 坐标开始）\n4. 仅数据轴方向的网格线（其他方向关闭）\n5. 底部左侧数据来源注脚\n\n### 共享配色与常量\n\n```python\n# ── 字体 ──────────────────────────────────────────────\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp      = fm.FontProperties(fname=font_path)\nfp_bold = fm.FontProperties(fname=font_path, weight='bold')\n\n# ── Economist 配色（源自 ggthemes + 官网） ───────────\nECON_RED    = '#E3120B'   # 红线 + tag 方块\nECON_BLUE   = '#006BA2'   # 主系列\nECON_CYAN   = '#3EBCD2'   # 次系列 1\nECON_GREEN  = '#379A8B'   # 次系列 2\nECON_YELLOW = '#EBB434'   # 次系列 3（强调）\nECON_GREY   = '#758D99'   # 灰化系列 / 来源注脚\nECON_GRID   = '#A8BAC4'   # 网格线\nTEXT_DARK   = '#121212'\nTEXT_SUB    = '#555555'\n\n# ── 布局常量（三种图表类型共用） ──────────────────────\nLEFT_X       = 0.14   # 左对齐基准：红线起点/tag/标题/分类标签\nRED_LINE_Y   = 0.970  # 红线 y 位置（figure 最顶部）\nTAG_W, TAG_H = 0.055, 0.030\nTITLE_Y      = 0.920  # 标题位置（红线下方）\nSUBTITLE_Y   = 0.860  # 副标题位置\nSOURCE_Y     = 0.025  # 来源注脚位置\n```\n\n### 通用框架函数（复用）\n\n```python\ndef apply_economist_frame(fig, ax, title, subtitle, source):\n    \"\"\"为任意 Axes 套上经济学人的红线、tag、标题、来源外框。\"\"\"\n    # ① 红色横线\n    ax.plot([LEFT_X, 1.0], [RED_LINE_Y, RED_LINE_Y],\n            transform=fig.transFigure, clip_on=False,\n            color=ECON_RED, linewidth=2.5, solid_capstyle='butt', zorder=20)\n    # ② 左上角红色方块 tag\n    ax.add_patch(mpatches.Rectangle(\n        xy=(LEFT_X, RED_LINE_Y - TAG_H),\n        width=TAG_W, height=TAG_H,\n        facecolor=ECON_RED, edgecolor='none',\n        transform=fig.transFigure, clip_on=False, zorder=20))\n    # ③ 标题、副标题、来源（全部用 fig.text 对齐到 LEFT_X）\n    fig.text(LEFT_X, TITLE_Y,    title,\n             fontproperties=fp_bold, fontsize=13,\n             color=TEXT_DARK, va='top', ha='left')\n    fig.text(LEFT_X, SUBTITLE_Y, subtitle,\n             fontproperties=fp, fontsize=10.5,\n             color=TEXT_SUB, va='top', ha='left')\n    fig.text(LEFT_X, SOURCE_Y,   source,\n             fontproperties=fp, fontsize=9,\n             color=ECON_GREY, va='bottom', ha='left')\n\ndef style_economist_axes(ax, grid_axis='y'):\n    \"\"\"通用轴处理：只保留底部轴线，仅一个方向有网格，无刻度线。\"\"\"\n    for spine in ax.spines.values():\n        spine.set_visible(False)\n    ax.spines['bottom'].set_visible(True)\n    ax.spines['bottom'].set_color('#444444')\n    ax.spines['bottom'].set_linewidth(1.2)\n    if grid_axis == 'y':\n        ax.yaxis.grid(True, color=ECON_GRID, linewidth=1.0, zorder=0)\n        ax.xaxis.grid(False)\n    else:\n        ax.xaxis.grid(True, color=ECON_GRID, linewidth=1.0, zorder=0)\n        ax.yaxis.grid(False)\n    ax.set_axisbelow(True)\n    ax.tick_params(axis='both', length=0, labelsize=10, labelcolor=ECON_GREY)\n```\n\n### ⚠️ 四条铁律\n\n1. **红线和 tag 只能用 `ax.plot` / `mpatches.Rectangle` 加 `fig.transFigure + clip_on=False`**，禁用 `fig.add_axes`（会与布局系统冲突）。\n2. **背景必须白色**，不是蓝灰（蓝灰是 ggplot 主题的误导，真实经济学人图表是白底）。\n3. **轴刻度 formatter 禁止含中文汉字**（会变方块）。\n4. **禁用 `ax.set_ylabel` 放单位**：y 轴 label 默认在轴线左外侧（即使用 `loc='top'` 配 `rotation=0`），必然伸出 `LEFT_X` 之外破坏对齐。**y 方向的单位一律写进副标题**（如\"城镇居民人均可支配收入，万元\"）。`set_xlabel` 在 x 轴下方居中，不会破坏左对齐，可以使用。\n\n---\n\n### 模板 A：水平柱状图（Horizontal Bar Chart）\n\n**适用场景**：分类比较、排行榜。分类名放在**条形外部左侧**，左对齐到 `LEFT_X`。\n\n```python\ncities = ['上海', '北京', '杭州', '广州', '深圳', '武汉']\nvalues = [8.48, 8.18, 8.06, 8.05, 7.69, 6.17]\n\nfig, ax = plt.subplots(figsize=(10, 7))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\n# left=0.24 给外部标签留空间；标签本身 x=LEFT_X=0.14\nfig.subplots_adjust(left=0.24, right=0.94, top=0.76, bottom=0.10)\n\ny_pos = list(range(len(cities)))\nax.barh(y_pos, values, color=ECON_BLUE, height=0.55, zorder=3)\nax.set_yticks(y_pos)\nax.set_yticklabels([])      # 必须清空默认标签！\nax.set_xlim(0, max(values) * 1.2)\nax.set_xlabel('（单位）', fontproperties=fp, fontsize=11, color=ECON_GREY)\n\n# ── 分类标签：x 用 figure 坐标（对齐 LEFT_X），y 用数据坐标（跟随条形）─\ntrans = blended_transform_factory(fig.transFigure, ax.transData)\nfor i, label in enumerate(cities):\n    ax.text(LEFT_X, i, label, transform=trans, ha='left', va='center',\n            fontproperties=fp, fontsize=13, color=TEXT_DARK, clip_on=False)\n\n# ── 数据标签：条形右端，数据坐标 ───────────────────────\nfor i, val in enumerate(values):\n    ax.text(val + max(values) * 0.015, i, f'{val:.2f}',\n            va='center', fontproperties=fp, fontsize=11, color=TEXT_DARK)\n\nstyle_economist_axes(ax, grid_axis='x')   # 水平条形 → 垂直网格\napply_economist_frame(fig, ax,\n    title='标题：对比结论的一句话描述',\n    subtitle='副标题：单位与时间范围',\n    source='来源：数据来源说明')\n\nplt.savefig('output_economist_hbar.png', dpi=300, bbox_inches='tight', facecolor='white')\n```\n\n---\n\n### 模板 B：垂直柱状图（Column Chart）\n\n**适用场景**：分类比较且类别数 ≤ 10。分类名放在**x 轴下方**，与柱子中心对齐。\n\n```python\ncategories = ['2019', '2020', '2021', '2022', '2023']\nvalues     = [5.2, 6.1, 7.4, 8.0, 8.48]\n\nfig, ax = plt.subplots(figsize=(10, 7))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\n# 垂直柱状图不需要左侧标签空间，left 回到 LEFT_X\nfig.subplots_adjust(left=LEFT_X, right=0.94, top=0.76, bottom=0.14)\n\nx_pos = list(range(len(categories)))\nax.bar(x_pos, values, color=ECON_BLUE, width=0.55, zorder=3)\nax.set_xticks(x_pos)\nax.set_xticklabels(categories, fontproperties=fp, fontsize=12, color=TEXT_DARK)\nax.set_ylim(0, max(values) * 1.2)\nax.yaxis.set_major_formatter(plt.FuncFormatter(lambda v, _: f'{v:.0f}'))\n\n# ── 数据标签：柱顶上方 ────────────────────────────────\nfor i, val in enumerate(values):\n    ax.text(i, val + max(values) * 0.02, f'{val:.2f}',\n            ha='center', va='bottom',\n            fontproperties=fp, fontsize=11, color=TEXT_DARK)\n\nstyle_economist_axes(ax, grid_axis='y')   # 垂直柱 → 水平网格\nax.tick_params(axis='x', labelsize=12, labelcolor=TEXT_DARK)  # x 轴分类保持深色\n\napply_economist_frame(fig, ax,\n    title='标题：趋势结论',\n    subtitle='副标题：单位与时间范围',\n    source='来源：数据来源说明')\n\nplt.savefig('output_economist_vbar.png', dpi=300, bbox_inches='tight', facecolor='white')\n```\n\n---\n\n### 模板 C：折线图（Line Chart / 时间序列）\n\n**适用场景**：时间趋势，多系列对比。核心做法：**用颜色突出 1~2 条重点线，其余系列灰化 `#758D99`，每条线末端标注系列名**（替代传统图例）。\n\n```python\nyears = list(range(2019, 2024))\nshanghai = [7.0, 7.2, 7.7, 7.96, 8.48]\nbeijing  = [6.8, 7.1, 7.5, 7.77, 8.18]\nnational = [4.24, 4.38, 4.74, 4.93, 5.18]\nseries = [\n    ('上海', shanghai, ECON_RED),     # 重点\n    ('北京', beijing,  ECON_BLUE),    # 重点\n    ('全国', national, ECON_GREY),    # 灰化对照\n]\n\nfig, ax = plt.subplots(figsize=(10, 7))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\n# 折线图右侧留空间给末端系列名\nfig.subplots_adjust(left=LEFT_X, right=0.88, top=0.76, bottom=0.12)\n\nfor name, vals, color in series:\n    ax.plot(years, vals, color=color, linewidth=2.5,\n            marker='o', markersize=6, markerfacecolor=color,\n            markeredgecolor='white', markeredgewidth=1.5, zorder=3)\n    # ── 末端系列名（替代图例）──\n    ax.text(years[-1] + 0.12, vals[-1], name,\n            fontproperties=fp_bold, fontsize=11, color=color,\n            va='center', ha='left')\n\nax.set_xticks(years)\nax.set_xticklabels([str(y) for y in years], fontsize=11, color=TEXT_DARK)\nax.yaxis.set_major_formatter(plt.FuncFormatter(lambda v, _: f'{v:.0f}'))\nax.set_xlim(years[0] - 0.3, years[-1] + 1.0)   # 右侧预留末端标签空间\n\nstyle_economist_axes(ax, grid_axis='y')   # 折线图 → 水平网格\nax.tick_params(axis='x', labelsize=11, labelcolor=TEXT_DARK)\n\napply_economist_frame(fig, ax,\n    title='标题：趋势差异的结论',\n    subtitle='副标题：单位与时间范围',\n    source='来源：数据来源说明')\n\nplt.savefig('output_economist_line.png', dpi=300, bbox_inches='tight', facecolor='white')\n```\n\n---\n\n### 三种图表的关键差异\n\n| 元素 | 水平柱状图 | 垂直柱状图 | 折线图 |\n|------|-----------|-----------|--------|\n| `subplots_adjust(left)` | **0.24**（给外部标签留空间） | 0.14 | 0.14 |\n| `subplots_adjust(right)` | 0.94 | 0.94 | **0.88**（给末端标签留空间） |\n| 网格方向 | `grid_axis='x'`（垂直网格） | `grid_axis='y'`（水平网格） | `grid_axis='y'`（水平网格） |\n| 分类标签位置 | **条形外部左侧**（blended_transform） | x 轴下方（默认 tick） | 无（线末端标注系列名） |\n| 多系列突出方式 | 很少用多系列 | 很少用多系列 | **重点上色，其他灰化** |\n\n---\n\n## Style 3：McKinsey 风格\n\n> 参考：《McKinsey Global Survey on competitive advantage》《中国汽车行业 CEO 季刊》等官方报告\n\n### 设计原则\n**极简、高反差对比，Top performer 式的对照叙事。** 大部分麦肯锡图表只做一件事：**把重点组（通常是\"Top performers\"）用亮青蓝突出，对照组（\"Others\"）用浅灰**，两色贯穿全报告。\n\n### 七个标志特征\n1. **左上小灰字\"Exhibit X\"**（或中文\"图X\"），10pt，灰色 `#8C8C8C`\n2. **下方细分隔线**：紧贴 Exhibit 标签下方，全宽，浅灰 `#D4D4D4`，0.5pt\n3. **超大粗体结论句**标题，15~17pt（比常规标题大得多），黑色 `#051C2C`\n4. **副标题/说明**：黑色粗体，12~13pt，附带单位（如\"% of respondents\"）\n5. **图例位于右上角**，色块 + 文字，两系列纵向排列\n6. **柱子很窄**（`width=0.32~0.38`），给数据留呼吸空间\n7. **数据标签直接写在柱内或柱外**，粗体深色，无需 y 轴刻度\n\n### 配色（严格按真实报告）\n| 名称 | 变量 | hex | 用途 |\n|------|------|-----|------|\n| 亮青蓝（主） | `MCK_CYAN` | `#2CBDEF` | Top performers / 重点系列 |\n| 浅灰（辅） | `MCK_GRAY` | `#D4D4D4` | Others / 对照组 |\n| 深色文字 | `MCK_DARK` | `#051C2C` | 标题、数据标签 |\n| 中灰（Exhibit 标签/来源） | `MCK_META` | `#8C8C8C` | Exhibit 标签、来源注脚 |\n| 分隔线 | `MCK_LINE` | `#D4D4D4` | 顶部和底部的细分隔线 |\n\n### 共享配色与工具函数\n\n```python\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport matplotlib.font_manager as fm\n\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp      = fm.FontProperties(fname=font_path)\nfp_bold = fm.FontProperties(fname=font_path, weight='bold')\n\n# ── McKinsey 配色（2025 真实报告提取）──────────────\nMCK_CYAN = '#2CBDEF'   # Top performers / 重点\nMCK_GRAY = '#D4D4D4'   # Others / 对照\nMCK_DARK = '#051C2C'   # 文字主色\nMCK_META = '#8C8C8C'   # Exhibit 标签 / 来源\nMCK_LINE = '#D4D4D4'   # 分隔线\n\n# ── 布局常量 ──────────────────────────────────────────\nLEFT_X       = 0.08\nEXHIBIT_Y    = 0.96   # \"Exhibit X\" 标签\nSEP_LINE_Y   = 0.935  # 分隔线 y 位置\nTITLE_Y      = 0.90   # 超大结论句标题\nSUBTITLE_Y   = 0.78   # 副标题（描述 + 单位）\nLEGEND_RIGHT = 0.92   # 图例右上角 x 起点\nSOURCE_Y     = 0.04\n\ndef apply_mckinsey_frame(fig, ax, exhibit_label, title, subtitle,\n                         legend_items, source, notes=None):\n    \"\"\"\n    参数：\n      exhibit_label: 如 \"Exhibit 4\" 或 \"图4\"\n      title: 超大结论句\n      subtitle: 描述 + 单位，如 \"Share of annual budget... % of respondents\"\n      legend_items: [(name, color), ...]，右上角图例\n      source: 资料来源（不含前缀，会自动加 \"Source:\" 或 \"资料来源：\"）\n      notes: 可选，脚注列表 [\"¹ ...\", \"² ...\"]\n    \"\"\"\n    # ① Exhibit 标签\n    fig.text(LEFT_X, EXHIBIT_Y, exhibit_label,\n             fontproperties=fp, fontsize=10,\n             color=MCK_META, va='top', ha='left')\n\n    # ② 细分隔线（紧贴 Exhibit 下方，全宽）\n    ax.plot([LEFT_X, 1 - LEFT_X/2], [SEP_LINE_Y, SEP_LINE_Y],\n            transform=fig.transFigure, clip_on=False,\n            color=MCK_LINE, linewidth=0.8, zorder=20)\n\n    # ③ 超大结论句标题（分隔线下方）\n    fig.text(LEFT_X, TITLE_Y, title,\n             fontproperties=fp_bold, fontsize=16,\n             color=MCK_DARK, va='top', ha='left')\n\n    # ④ 副标题（加粗，含单位）\n    fig.text(LEFT_X, SUBTITLE_Y, subtitle,\n             fontproperties=fp_bold, fontsize=11.5,\n             color=MCK_DARK, va='top', ha='left')\n\n    # ⑤ 右上角图例（纵向排列，色块 + 文字）\n    legend_y = SUBTITLE_Y + 0.02\n    for name, color in legend_items:\n        ax.add_patch(mpatches.Rectangle(\n            xy=(LEGEND_RIGHT, legend_y - 0.018), width=0.02, height=0.016,\n            facecolor=color, edgecolor='none',\n            transform=fig.transFigure, clip_on=False, zorder=20))\n        fig.text(LEGEND_RIGHT + 0.026, legend_y - 0.010, name,\n                 fontproperties=fp, fontsize=10,\n                 color=MCK_DARK, va='center', ha='left')\n        legend_y -= 0.028\n\n    # ⑥ 底部脚注（可选）+ 资料来源\n    footer_y = SOURCE_Y + 0.03 * (len(notes) if notes else 0)\n    if notes:\n        for note in notes:\n            fig.text(LEFT_X, footer_y, note,\n                     fontproperties=fp, fontsize=8.5,\n                     color=MCK_DARK, va='bottom', ha='left')\n            footer_y -= 0.022\n    fig.text(LEFT_X, SOURCE_Y, f'Source: {source}',\n             fontproperties=fp, fontsize=9,\n             color=MCK_DARK, va='bottom', ha='left')\n\ndef style_mckinsey_axes(ax, show_bottom=True):\n    \"\"\"关闭所有边框和网格；可选保留 x 轴底线。\"\"\"\n    for spine in ax.spines.values():\n        spine.set_visible(False)\n    if show_bottom:\n        ax.spines['bottom'].set_visible(True)\n        ax.spines['bottom'].set_color(MCK_LINE)\n        ax.spines['bottom'].set_linewidth(0.8)\n    ax.grid(False)\n    ax.tick_params(axis='both', length=0, labelsize=10, labelcolor=MCK_DARK)\n    ax.set_yticks([])   # 默认隐藏 y 轴刻度（数字写在柱上）\n```\n\n### ⚠️ 五条铁律\n\n1. **主色是亮青 `#2CBDEF`、辅色是浅灰 `#D4D4D4`**——不是深蓝，不是中蓝。\n2. **柱子必须窄**：`width=0.32~0.38`（默认 0.8 太粗，不像麦肯锡）。\n3. **图例位置在右上角**（不是顶部或左上），色块 + 文字，纵向排列。\n4. **Exhibit 标签下方必须有细分隔线**，这是标志性视觉锚点。\n5. **标题字号要足够大**（15~17pt），远大于 Economist 风格的 13pt——麦肯锡标题是图表主角。\n\n---\n\n### 模板 A：分组垂直柱状图（Top performers vs Others）\n\n**参考：Exhibit 6、Exhibit 7。最常用的麦肯锡图表类型。**\n\n```python\ncategories = ['Less than\\n5% changed', '5% to less\\nthan 10%', '10% to less\\nthan 20%',\n              '20% to less\\nthan 30%', '30% to less\\nthan 50%', '50% to less\\nthan 75%',\n              '75% or\\nmore']\ntop_perf = [8, 16, 23, 17, 9, 7, 12]\nothers   = [20, 30, 26, 11, 5, 2, 0]\n\nfig, ax = plt.subplots(figsize=(11, 7.5))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\nfig.subplots_adjust(left=LEFT_X, right=0.96, top=0.70, bottom=0.18)\n\nx = range(len(categories))\nwidth = 0.35   # 窄柱，两组之间有呼吸空间\nax.bar([i - width/2 for i in x], top_perf, width=width,\n       color=MCK_CYAN, zorder=3)\nax.bar([i + width/2 for i in x], others, width=width,\n       color=MCK_GRAY, zorder=3)\n\n# 柱顶数字（深色粗体）\nfor i, (t, o) in enumerate(zip(top_perf, others)):\n    ax.text(i - width/2, t + 1, f'{t}', ha='center', va='bottom',\n            fontproperties=fp_bold, fontsize=11, color=MCK_DARK)\n    ax.text(i + width/2, o + 1, f'{o}', ha='center', va='bottom',\n            fontproperties=fp_bold, fontsize=11, color=MCK_DARK)\n\nax.set_xticks(x)\nax.set_xticklabels(categories, fontproperties=fp, fontsize=10, color=MCK_DARK)\nax.set_ylim(0, max(max(top_perf), max(others)) * 1.3)\n\nstyle_mckinsey_axes(ax)\napply_mckinsey_frame(fig, ax,\n    exhibit_label='Exhibit 7',\n    title='Top economic performers are much more likely than their peers\\nto significantly reallocate resources from year to year.',\n    subtitle='Share of annual budget that was reallocated to different\\nbusiness areas this year, % of respondents¹',\n    legend_items=[('Top performers²', MCK_CYAN), ('Others', MCK_GRAY)],\n    source='McKinsey Global Survey on competitive advantage, 1,257 participants')\n```\n\n---\n\n### 模板 B：分组水平条形图\n\n**参考：Exhibit 4。类别名在左侧，数值横向延伸。**\n\n```python\ncategories = ['Review findings from industry associations',\n              'Track new product launches of competitors',\n              'Monitor acquisitions by competitors',\n              'Conduct customer interviews or focus groups',\n              'Scan emerging external trends via start-ups',\n              'Use AI to identify relevant trends',\n              'Use AI to explore new uses',\n              'Track competitors outside traditional set',\n              'Monitor noncompetitors acquisitions',\n              'None of the above']\ntop_perf = [63, 57, 44, 42, 37, 35, 33, 34, 27, 4]\nothers   = [53, 50, 37, 31, 24, 24, 22, 21, 19, 4]\n\nfig, ax = plt.subplots(figsize=(11, 8.5))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\n# 横向布局需要更大左边距给类别标签\nfig.subplots_adjust(left=0.30, right=0.96, top=0.76, bottom=0.12)\n\ny = range(len(categories))\nheight = 0.35\nax.barh([i - height/2 for i in y], top_perf, height=height,\n        color=MCK_CYAN, zorder=3)\nax.barh([i + height/2 for i in y], others,   height=height,\n        color=MCK_GRAY, zorder=3)\n\nax.set_yticks(y)\nax.set_yticklabels(categories, fontproperties=fp, fontsize=10, color=MCK_DARK)\nax.invert_yaxis()\nax.set_xlim(0, 100)\nax.set_xticks([0, 20, 40, 60, 80, 100])\nax.tick_params(axis='x', labelsize=10, labelcolor=MCK_DARK)\n# 水平条形需要顶部 x 轴，不要底部\nax.xaxis.tick_top()\n\nstyle_mckinsey_axes(ax, show_bottom=False)\nax.set_yticks(y)\nax.set_yticklabels(categories, fontproperties=fp, fontsize=10, color=MCK_DARK)\n\napply_mckinsey_frame(fig, ax,\n    exhibit_label='Exhibit 4',\n    title='Top economic performers track the signs of shifting advantage\\nmore than others.',\n    subtitle='Actions that respondents\\' companies take at least quarterly\\nto explore new growth opportunities, % of respondents¹',\n    legend_items=[('Top performers²', MCK_CYAN), ('Others', MCK_GRAY)],\n    source='McKinsey Global Survey on competitive advantage, 1,257 participants')\n```\n\n---\n\n### 模板 C：100% 单条堆叠（Likert-scale / 分布）\n\n**参考：Exhibit 1。展示占比分布，颜色用亮青的渐变层级（越右越深）。**\n\n```python\nsegments = ['No clear\\nperspective', 'Minimally', 'Somewhat', 'Significantly', 'Completely']\nvalues   = [11, 17, 39, 30, 3]\n# 从左到右的渐变（可选，越右越深青）\npalette  = ['#FFFFFF', '#C3ECFA', '#7BD4ED', '#2CBDEF', '#0088CE']\nedges    = [MCK_LINE] + [None]*4   # 第一段白色需要描边\n\nfig, ax = plt.subplots(figsize=(12, 5.5))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\nfig.subplots_adjust(left=LEFT_X, right=0.96, top=0.56, bottom=0.35)\n\nleft_cursor = 0\nfor seg, val, color, edge in zip(segments, values, palette, edges):\n    ax.barh(0, val, left=left_cursor, height=0.5,\n            color=color, edgecolor=edge if edge else color,\n            linewidth=0.8 if edge else 0, zorder=3)\n    # 段内数字\n    text_color = MCK_DARK if color in ['#FFFFFF', '#C3ECFA', '#7BD4ED'] else 'white'\n    ax.text(left_cursor + val/2, 0, f'{val}',\n            ha='center', va='center',\n            fontproperties=fp_bold, fontsize=13, color=MCK_DARK)\n    # 段上方标签\n    ax.text(left_cursor + val/2, 0.55, seg,\n            ha='center', va='bottom',\n            fontproperties=fp, fontsize=10, color=MCK_DARK)\n    left_cursor += val\n\nax.set_xlim(0, 100)\nax.set_ylim(-0.6, 1.0)\nax.axis('off')\n\n# 底部 100% 标签\nfig.text(0.5, 0.30, '100%', fontproperties=fp, fontsize=10,\n         color=MCK_META, va='top', ha='center', style='italic')\n\napply_mckinsey_frame(fig, ax,\n    exhibit_label='Exhibit 1',\n    title='One-third of executives believe there will be significant changes\\nto the nature of their competitive advantage over the next five years.',\n    subtitle='Extent of expected change in the competitive advantages of respondents\\' companies,\\nnext 5 years, % of respondents',\n    legend_items=[],   # 100% 堆叠通常不需要图例\n    source='McKinsey Global Survey on competitive advantage, 1,257 participants')\n```\n\n---\n\n### 三种图表的关键差异\n\n| 元素 | 分组垂直柱（A） | 分组水平条（B） | 100% 堆叠（C） |\n|------|----------------|----------------|----------------|\n| 柱宽/条高 | `width=0.35` | `height=0.35` | 单条 `height=0.5` |\n| 类别标签位置 | x 轴下方 | y 轴左侧 | 各段上方 |\n| 数据标签位置 | 柱顶上方 | 条末端外 | 段中央 |\n| 图例 | 右上角两项 | 右上角两项 | 无（用颜色渐变） |\n| x 轴刻度 | 无 | **0~100** 顶部 | 无 |\n\nFile v1.0.0:skill-card.md\n\n## Description:\n\nGenerates professional Python matplotlib visualization code by selecting chart types from the data and applying BCG, The Economist, or McKinsey-style templates.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[veezvg](https://clawhub.ai/user/veezvg)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nAnalysts, consultants, researchers, and content creators use this skill to turn tabular or survey-style data requests into runnable matplotlib scripts for report-style charts.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Example scripts write chart image files to local output paths.\n\nMitigation: Review and adjust generated or example output filenames before running scripts in a working directory.\n\nRisk: Generated code may reference a hard-coded macOS Chinese font path.\n\nMitigation: Change the font path for non-macOS environments or when Chinese labels are not needed.\n\n## Reference(s):\n\n- [Chart Selection Guide](references/chart_selection.md)\n- [Visualization Specification](references/visualization_spec.md)\n- [Making Economist-Style Plots in Matplotlib](https://medium.com/data-science/making-economist-style-plots-in-matplotlib-e7de6d679739)\n\n## Skill Output:\n\n**Output Type(s):** [code, markdown, guidance]\n\n**Output Format:** [Markdown containing runnable Python matplotlib code blocks and brief chart-selection guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Generated scripts may save image files to local output paths and may require environment-specific font adjustments.]\n\n## Skill Version(s):\n\n1.0.0 (source: SKILL.md frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: Data Visualization Owner: veezvg Summary: 根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-20T03:22:27.227Z | auto Initial release with professional multi-style data visualization code generation using matplotlib: - Intelligently selects optimal ch","codeSnippets":[],"executableExamples":[{"language":"text","snippet":".\n├── SKILL.md\n├── README.md\n├── examples/\n│   ├── bcg_hbar.py\n│   ├── economist_hbar.py\n│   ├── economist_line.py\n│   ├── mckinsey_grouped_hbar.py\n│   ├── mckinsey_grouped_vbar.py\n│   └── mckinsey_stack100.py\n└── references/\n    ├── chart_selection.md\n    └── visualization_spec.md"},{"language":"python","snippet":"# 有顶部标签栏（Economist 风格）\n   fig.subplots_adjust(left=0.10, right=0.90, top=0.72, bottom=0.12)\n   # 标题区：fig.text(x, 0.88~0.96, ...)\n   # 红色栏：fig.add_axes([0, 0.975, 1, 0.025])\n\n   # 无顶部标签栏（McKinsey / BCG 风格）\n   fig.subplots_adjust(left=0.08, right=0.95, top=0.72, bottom=0.14)\n   # 标题区：fig.text(x, 0.88~0.96, ...)"},{"language":"python","snippet":"import matplotlib.pyplot as plt\nfrom matplotlib.font_manager import FontProperties\n\n# ── 字体 ──────────────────────────────────────────────\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp = FontProperties(fname=font_path)\n\n# ── 配色 ──────────────────────────────────────────────\nCOLOR_MAIN = '#2ca02c'   # BCG 绿\n\n# ── 数据（示例） ───────────────────────────────────────\nlabels = ['类别A', '类别B', '类别C', '类别D']\nvalues = [42.5, 31.2, 16.8, 9.5]\nN = 200\n\n# ── 画布 ──────────────────────────────────────────────\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# ── 绘图（水平柱状图示例） ─────────────────────────────\nbars = ax.barh(range(len(labels)), values, color=COLOR_MAIN, height=0.6)\nax.set_yticks(range(len(labels)))\nax.set_yticklabels(labels, fontproperties=fp, fontsize=13)\nax.set_xlabel('占比 (%)', fontproperties=fp, fontsize=16)\nax.set_title(f'维度名称 (N={N})', fontproperties=fp, fontsize=20, fontweight='bold')\n\n# ── 边框处理 ───────────────────────────────────────────\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\nax.spines['bottom'].set_visible(False)\nax.spines['left'].set_color('black')\nax.spines['left'].set_linewidth(1)\n\n# ── 网格 ───────────────────────────────────────────────\nax.grid(False)\n\n# ── 数据标签 ───────────────────────────────────────────\nfor i, (bar, val) in enumerate(zip(bars, values)):\n    ax.text(val + 0.8, i, f'{val:.1f}%', va='center', fontproperties=fp, fontsize=12)\n\nplt.tight_layout()\nplt.savefig('output_bcg.png', dpi=300, bbox_inches='tight')\nplt.close()"},{"language":"python","snippet":"# ── 字体 ──────────────────────────────────────────────\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp      = fm.FontProperties(fname=font_path)\nfp_bold = fm.FontProperties(fname=font_path, weight='bold')\n\n# ── Economist 配色（源自 ggthemes + 官网） ───────────\nECON_RED    = '#E3120B'   # 红线 + tag 方块\nECON_BLUE   = '#006BA2'   # 主系列\nECON_CYAN   = '#3EBCD2'   # 次系列 1\nECON_GREEN  = '#379A8B'   # 次系列 2\nECON_YELLOW = '#EBB434'   # 次系列 3（强调）\nECON_GREY   = '#758D99'   # 灰化系列 / 来源注脚\nECON_GRID   = '#A8BAC4'   # 网格线\nTEXT_DARK   = '#121212'\nTEXT_SUB    = '#555555'\n\n# ── 布局常量（三种图表类型共用） ──────────────────────\nLEFT_X       = 0.14   # 左对齐基准：红线起点/tag/标题/分类标签\nRED_LINE_Y   = 0.970  # 红线 y 位置（figure 最顶部）\nTAG_W, TAG_H = 0.055, 0.030\nTITLE_Y      = 0.920  # 标题位置（红线下方）\nSUBTITLE_Y   = 0.860  # 副标题位置\nSOURCE_Y     = 0.025  # 来源注脚位置"},{"language":"python","snippet":"def apply_economist_frame(fig, ax, title, subtitle, source):\n    \"\"\"为任意 Axes 套上经济学人的红线、tag、标题、来源外框。\"\"\"\n    # ① 红色横线\n    ax.plot([LEFT_X, 1.0], [RED_LINE_Y, RED_LINE_Y],\n            transform=fig.transFigure, clip_on=False,\n            color=ECON_RED, linewidth=2.5, solid_capstyle='butt', zorder=20)\n    # ② 左上角红色方块 tag\n    ax.add_patch(mpatches.Rectangle(\n        xy=(LEFT_X, RED_LINE_Y - TAG_H),\n        width=TAG_W, height=TAG_H,\n        facecolor=ECON_RED, edgecolor='none',\n        transform=fig.transFigure, clip_on=False, zorder=20))\n    # ③ 标题、副标题、来源（全部用 fig.text 对齐到 LEFT_X）\n    fig.text(LEFT_X, TITLE_Y,    title,\n             fontproperties=fp_bold, fontsize=13,\n             color=TEXT_DARK, va='top', ha='left')\n    fig.text(LEFT_X, SUBTITLE_Y, subtitle,\n             fontproperties=fp, fontsize=10.5,\n             color=TEXT_SUB, va='top', ha='left')\n    fig.text(LEFT_X, SOURCE_Y,   source,\n             fontproperties=fp, fontsize=9,\n             color=ECON_GREY, va='bottom', ha='left')\n\ndef style_economist_axes(ax, grid_axis='y'):\n    \"\"\"通用轴处理：只保留底部轴线，仅一个方向有网格，无刻度线。\"\"\"\n    for spine in ax.spines.values():\n        spine.set_visible(False)\n    ax.spines['bottom'].set_visible(True)\n    ax.spines['bottom'].set_color('#444444')\n    ax.spines['bottom'].set_linewidth(1.2)\n    if grid_axis == 'y':\n        ax.yaxis.grid(True, color=ECON_GRID, linewidth=1.0, zorder=0)\n        ax.xaxis.grid(False)\n    else:\n        ax.xaxis.grid(True, color=ECON_GRID, linewidth=1.0, zorder=0)\n        ax.yaxis.grid(False)\n    ax.set_axisbelow(True)\n    ax.tick_params(axis='both', length=0, labelsize=10, labelcolor=ECON_GREY)"},{"language":"python","snippet":"cities = ['上海', '北京', '杭州', '广州', '深圳', '武汉']\nvalues = [8.48, 8.18, 8.06, 8.05, 7.69, 6.17]\n\nfig, ax = plt.subplots(figsize=(10, 7))\nfig.patch.set_facecolor('white'); ax.set_facecolor('white')\n# left=0.24 给外部标签留空间；标签本身 x=LEFT_X=0.14\nfig.subplots_adjust(left=0.24, right=0.94, top=0.76, bottom=0.10)\n\ny_pos = list(range(len(cities)))\nax.barh(y_pos, values, color=ECON_BLUE, height=0.55, zorder=3)\nax.set_yticks(y_pos)\nax.set_yticklabels([])      # 必须清空默认标签！\nax.set_xlim(0, max(values) * 1.2)\nax.set_xlabel('（单位）', fontproperties=fp, fontsize=11, color=ECON_GREY)\n\n# ── 分类标签：x 用 figure 坐标（对齐 LEFT_X），y 用数据坐标（跟随条形）─\ntrans = blended_transform_factory(fig.transFigure, ax.transData)\nfor i, label in enumerate(cities):\n    ax.text(LEFT_X, i, label, transform=trans, ha='left', va='center',\n            fontproperties=fp, fontsize=13, color=TEXT_DARK, clip_on=False)\n\n# ── 数据标签：条形右端，数据坐标 ───────────────────────\nfor i, val in enumerate(values):\n    ax.text(val + max(values) * 0.015, i, f'{val:.2f}',\n            va='center', fontproperties=fp, fontsize=11, color=TEXT_DARK)\n\nstyle_economist_axes(ax, grid_axis='x')   # 水平条形 → 垂直网格\napply_economist_frame(fig, ax,\n    title='标题：对比结论的一句话描述',\n    subtitle='副标题：单位与时间范围',\n    source='来源：数据来源说明')\n\nplt.savefig('output_economist_hbar.png', dpi=300, bbox_inches='tight', facecolor='white')"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: veezvg-data-visualization\nversion: 1.0.0\ndescription: |\n  根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。\n  支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。\n  触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/热力图等。\n  关键词：可视化、图表、chart、plot、visualization、画图、matplotlib、数据图、经济学人风格、麦肯锡风格、BCG风格\n---\n\n# Data Visualization\n\n根据数据类型智能选择图表，按统一规范生成 Python matplotlib 代码。**三套风格均按真实报告视觉提取并可复刻。**\n\n## 工作流程\n\n1. **询问风格** - 若用户未指定风格，展示三套选项供选择\n2. **分析数据** - 识别数据类型（时序、分类、占比等）\n3. **选择图表** - 参考 `references/chart_selection.md` 匹配最佳图表类型\n4. **找对应示例** - **优先从 `examples/` 中找最接近的模板脚本，直接照着改**\n5. **查细节规范** - 遇到 examples 没覆盖的场景，查 `references/visualization_spec.md`\n6. **输出代码** - 生成完整可运行的 Python 代码\n\n## 风格选项\n\n| # | 风格 | 适用场景 | 主色 |\n|---|------|---------|------|\n| 1 | **BCG**（默认） | 通用数据分析、研究报告 | 绿色 `#2ca02c` |\n| 2 | **The Economist** | 媒体发布、公开报告 | 红线 `#E3120B` + 蓝 `#006BA2` |\n| 3 | **McKinsey** | 咨询汇报、高管演示 | 亮青 `#2CBDEF` + 浅灰 `#D4D4D4` |\n\n## 示例脚本（examples/）\n\n**所有示例都是完整可运行的脚本，改数据即用。**\n\n| 脚本 | 风格 | 图表类型 | 参考 |\n|------|------|---------|------|\n| `bcg_hbar.py` | BCG | 水平柱状图 | 通用调研报告 |\n| `economist_hbar.py` | Economist | 水平条形图 | 类别排行对比 |\n| `economist_line.py` | Economist | 折线图（时间序列） | 多系列趋势，重点上色 |\n| `mckinsey_grouped_vbar.py` | McKinsey | 分组垂直柱 | Exhibit 7 样式 |\n| `mckinsey_grouped_hbar.py` | McKinsey | 分组水平条 | Exhibit 4 样式 |\n| `mckinsey_stack100.py` | McKinsey | 100% 堆叠单条 | Exhibit 1 样式（Likert-scale） |\n\n## 图表选择速查\n\n| 数据类型 | 推荐图表 |\n|---------|---------|\n| 趋势变化 | Line Chart |\n| 类别比较 | Bar Chart |\n| 占比分布 (≤5项) | Pie/Donut |\n| 占比分布 (>5项) | Stacked Bar |\n| Top vs Others 对比 | 分组柱状图（McKinsey 标配） |\n| Likert-scale 分布 | 100% 堆叠单条（渐变色） |\n| 相关性 | Scatter Plot |\n| 层级结构 | Treemap |\n\n完整 25 种数据类型映射见 `references/chart_selection.md`。\n\n## 各风格核心规范速查\n\n### BCG 风格\n- 主色 `#2ca02c`（绿），无渐变\n- 标题含样本量 `(N=X)`\n- 去除上/右/下边框，无网格线\n\n### The Economist 风格\n- **白色背景**（非蓝灰）\n- 顶部标志元素：全宽红线 `#E3120B` + 左上角红色方块 tag，都用 `fig.transFigure + clip_on=False`（**禁用 `fig.add_axes`**）\n- 所有左对齐元素（红线起点/tag/标题/分类标签）共用基准 `LEFT_X=0.14`\n- 主数据系列 `#006BA2`，灰化对照 `#758D99`\n- 分类标签必须用 `blended_transform_factory(fig.transFigure, ax.transData)` 对齐，否则会超出 LEFT_X 左端\n\n### McKinsey 风格\n- **亮青 `#2CBDEF` + 浅灰 `#D4D4D4`** 二元对照（非单色高亮其他灰化）\n- 左上\"Exhibit X\"小灰字 + 下方全宽细分隔线\n- 超大粗体标题（15~17pt），结论句\n- 图例在**右上角**，色块 + 文字纵向排列\n- 柱子必须**窄**（`width=0.32~0.38`）\n- y 轴隐藏刻度，数字直接写在柱上\n- 来源注脚写 `Source:` 或\"资料来源：\"\n\n## 三条常见坑（必看）\n\n1. **禁用 `fig.add_axes`**（会与布局系统冲突）。Economist 的红线/tag 用 `ax.plot + mpatches.Rectangle` 配 `fig.transFigure + clip_on=False`。\n2. **禁用 `ax.set_ylabel` 放中文单位**（会伸出 `LEFT_X` 左侧破坏对齐）。y 方向单位写进副标题；`set_xlabel` 可用（在 x 轴下方居中）。\n3. **轴刻度 formatter 禁止含中文汉字**（字体缺失变方块）。中文单位用副标题或 `set_xlabel`。\n\n完整规范（三套共享工具函数 + 所有代码模板）见 `references/visualization_spec.md`。\n\n## 关键约束\n\n1. 占比数据超过 5 项时，用堆叠柱状图替代饼图\n2. 中文必须通过 `FontProperties` 显式设置（`/System/Library/Fonts/STHeiti Light.ttc`）\n3. BCG 标题含样本量 `(N=X)`；McKinsey 标题是结论句 + \"Exhibit X\"编号；Economist 标题是描述性短句\n4. 数据标签格式 `{:.1f}%` 或 `{:.2f}`（看量级）"},{"path":"README.md","content":"# data-visualization\n\n一个专门生成**专业咨询 / 媒体报告风格图表代码**的 Skill。\n\n它会根据数据类型自动选择合适图表，并输出可直接运行的 **Python matplotlib** 代码，重点支持三种常见的高质感配图风格：\n\n- **McKinsey**，麦肯锡咨询汇报风\n- **BCG**，波士顿咨询简洁分析风\n- **The Economist**，经济学人媒体图表风\n\n适合用在研究报告、咨询汇报、行业分析、内容配图、文章插图等场景。\n\n## 效果展示\n\n### BCG 风格\n\n![BCG 风格水平条形图](assets/showcase/bcg-income-hbar.png)\n\n六城居民可支配收入对比，绿色极简、适合研究报告和内部分析。\n\n### The Economist 风格\n\n![The Economist 风格水平条形图](assets/showcase/economist-income-hbar.png)\n\n同一组收入数据改写为经济学人媒体图表语言，顶部红线和蓝色主系列更适合公开内容配图。\n\n### McKinsey 风格\n\n![McKinsey 风格分组横条图](assets/showcase/mckinsey-grouped-hbar.png)\n\n典型咨询图表表达，适合做 Top performers vs Others 之类的对照分析。\n\n![McKinsey 风格柱线组合图](assets/showcase/mckinsey-bar-line-combo.png)\n\n柱线组合图示例，适合同时表达销量与人群规模等双指标趋势。\n\n## 这个 Skill 能做什么\n\n### 1. 按数据类型选图\n它不是只会“画柱状图”的模板集合，而是会先判断数据结构，再选更合适的图表形式。\n\n例如：\n- 趋势变化 -> 折线图\n- 类别比较 -> 柱状图 / 条形图\n- Likert 量表分布 -> 100% 堆叠条\n- Top vs Others -> 分组柱状图\n- 占比项过多 -> 用堆叠条替代饼图\n\n### 2. 输出可运行代码\n生成的是完整 **matplotlib Python 脚本**，不是抽象建议。拿去改数据就能用。\n\n### 3. 统一风格规范\n内置三套风格规范，不只是换个配色，而是连标题、标注、图例、留白、分隔线、标签对齐方式都做了约束。\n\n## 支持的三套风格\n\n### McKinsey\n适合：咨询汇报、高管材料、Exhibit 风格页面\n\n特点：\n- 亮青 + 浅灰的二元对照色\n- 左上角 Exhibit 编号\n- 强结论式标题\n- 右上角纵向图例\n- 柱子更窄，整体更克制\n\n### BCG\n适合：通用分析、研究报告、内部汇报\n\n特点：\n- 绿色主色\n- 简洁、直给、信息密度高\n- 标题中可包含样本量 N\n- 去掉多余边框和装饰\n\n### The Economist\n适合：公开发布、媒体内容、文章配图\n\n特点：\n- 顶部标志性红线 + 红色 tag\n- 蓝色主数据系列 + 灰蓝对照色\n- 白底、强识别度、偏媒体表达\n- 对标题、左侧标签对齐有明确规范\n\n## 仓库结构\n\n```text\n.\n├── SKILL.md\n├── README.md\n├── examples/\n│   ├── bcg_hbar.py\n│   ├── economist_hbar.py\n│   ├── economist_line.py\n│   ├── mckinsey_grouped_hbar.py\n│   ├── mckinsey_grouped_vbar.py\n│   └── mckinsey_stack100.py\n└── references/\n    ├── chart_selection.md\n    └── visualization_spec.md\n```\n\n## examples 里有什么\n\n仓库里的示例都是真正可运行的 matplotlib 脚本。\n\n- `bcg_hbar.py`，BCG 风格水平条形图\n- `economist_hbar.py`，经济学人风格水平条形图\n- `economist_line.py`，经济学人风格折线图\n- `mckinsey_grouped_vbar.py`，麦肯锡风格分组竖柱图\n- `mckinsey_grouped_hbar.py`，麦肯锡风格分组横条图\n- `mckinsey_stack100.py`，麦肯锡风格 100% 堆叠条图\n\n## references 里有什么\n\n### `references/chart_selection.md`\n给出“数据类型 -> 推荐图表类型”的映射，方便在生成代码前先判断用什么图更合适。\n\n### `references/visualization_spec.md`\n沉淀三套风格的视觉规范，包括：\n- 配色\n- 标题层级\n- 分隔线\n- 标签位置\n- 图例样式\n- 数据标签格式\n- 中文字体处理\n- matplotlib 里的实现细节\n\n## 使用方式\n\n### 在 OpenClaw / Agent 场景中\n把这个目录作为一个 Skill 使用。用户提出“帮我把这组数据画成麦肯锡风格图表”之类请求时，优先：\n\n1. 判断数据类型\n2. 选择图表形式\n3. 从 `examples/` 找最接近模板\n4. 参考 `references/visualization_spec.md` 补细节\n5. 输出完整 Python 代码\n\n### 你可以这样描述需求\n\n- 用经济学人风格画一个折线图\n- 把这组问卷结果做成麦肯锡风格 Exhibit\n- 用 BCG 风格画 Top 10 排行条形图\n- 帮我根据这张表自动选择合适图表并输出 matplotlib 代码\n\n## 适合谁用\n\n- 用户研究员\n- 商业分析师\n- 咨询顾问\n- 内容创作者\n- 需要快速做“像报告里那样的图”的人\n\n## 为什么这个 Skill 有价值\n\n很多“图表生成”工具只解决“能画出来”，但不解决“画得像专业报告”。\n\n这个 Skill 的重点是把三类高频视觉风格沉淀成**可复用规范 + 可运行模板**：\n\n- 不是只有灵感，而是能复刻\n- 不是只有截图，而是能生成代码\n- 不是只有单图，而是能变成持续产出的工作流\n\n## 注意事项\n\n- 中文图表建议显式设置字体\n- 占比项太多时不要硬上饼图\n- 经济学人风格对对齐要求高，尤其是左侧标签和顶部标志元素\n- 麦肯锡风格重点不只是配色，更在于标题语气、图例位置和版式秩序\n\n## 未来可扩展方向\n\n- 增加更多图表模板（散点图、热力图、瀑布图、桑基图）\n- 增加 seaborn / plotly 版本\n- 增加自动读 CSV / Excel 后直接出图的工作流\n- 增加适配中文商业报告的主题模板\n\n## License\n\n如需开源发布，建议补充许可证后再进一步传播。"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dmra4rnk024babj3zt1eh5s82gvd5\",\n  \"slug\": \"veezvg-data-visualization\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776655347227\n}"},{"path":"references/chart_selection.md","content":"# 图表选择指南\n\n根据数据类型智能选择最合适的图表类型。\n\n## 选择规则表\n\n| No. | 数据类型 | 关键词 | 推荐图表 | 备选图表 |\n|-----|---------|--------|---------|---------|\n| 1 | 趋势数据 | trend, time-series, line, growth, timeline, progress | Line Chart | Area Chart, Smooth Area |\n| 2 | 类别比较 | compare, categories, bar, comparison, ranking | Bar Chart (Horizontal/Vertical) | Column Chart, Grouped Bar |\n| 3 | 占比数据 | part-to-whole, pie, donut, percentage, proportion, share | Pie Chart / Donut | Stacked Bar, Treemap |\n| 4 | 相关性/分布 | correlation, distribution, scatter, relationship, pattern | Scatter Plot / Bubble Chart | Heat Map, Matrix |\n| 5 | 热力图/强度 | heatmap, heat-map, intensity, density, matrix | Heat Map / Choropleth | Grid Heat Map, Bubble Heat |\n| 6 | 地理数据 | geographic, map, location, region, geo, spatial | Choropleth Map, Bubble Map | Geographic Heat Map |\n| 7 | 漏斗/流程 | funnel, flow | Funnel Chart, Sankey | Waterfall |\n| 8 | 绩效 vs 目标 | performance, target | Gauge Chart / Bullet Chart | Dial, Thermometer |\n| 9 | 时序预测 | time-series, forecast | Line with Confidence Band | Ribbon Chart |\n| 10 | 异常检测 | anomaly, detection | Line Chart with Highlights | Scatter with Alert |\n| 11 | 层级/嵌套数据 | hierarchical, nested, data | Treemap | Sunburst, Nested Donut, Icicle |\n| 12 | 流程数据 | flow, process, data | Sankey Diagram | Alluvial, Chord Diagram |\n| 13 | 累计变化 | cumulative, changes | Waterfall Chart | Stacked Bar, Cascade |\n| 14 | 多变量比较 | multi-variable, comparison | Radar / Spider Chart | Parallel Coordinates, Grouped Bar |\n| 15 | 股票/交易 OHLC | stock, trading, ohlc | Candlestick Chart | OHLC Bar, Heikin-Ashi |\n| 16 | 关系/连接数据 | relationship, connection, data | Network Graph | Hierarchical Tree, Adjacency Matrix |\n| 17 | 分布/统计 | distribution, statistical | Box Plot | Violin Plot, Beeswarm |\n| 18 | 绩效目标(紧凑) | performance, target, compact | Bullet Chart | Gauge, Progress Bar |\n| 19 | 比例/百分比 | proportional, percentage | Waffle Chart | Pictogram, Stacked Bar 100% |\n| 20 | 层级比例 | hierarchical, proportional | Sunburst Chart | Treemap, Icicle, Circle Packing |\n| 21 | 根因分析 | root cause, decomposition, tree, hierarchy, drill-down, ai-split | Decomposition Tree | Decision Tree, Flow Chart |\n| 22 | 3D 空间数据 | 3d, spatial, immersive, terrain, molecular, volumetric | 3D Scatter / Surface Plot | Volumetric Rendering, Point Cloud |\n| 23 | 实时流数据 | streaming, real-time, ticker, live, velocity, pulse | Streaming Area Chart | Ticker Tape, Moving Gauge |\n| 24 | 情感/情绪 | sentiment, emotion, nlp, opinion, feeling | Word Cloud with Sentiment | Sentiment Arc, Radar Chart |\n| 25 | 流程挖掘 | process, mining, variants, path, bottleneck, log | Process Map / Graph | DAG, Petri Net |\n\n## 使用方法\n\n1. **识别数据类型**：根据数据特征和分析目的确定数据类型\n2. **匹配关键词**：查找与需求匹配的关键词\n3. **选择图表**：优先使用「推荐图表」，特殊情况可使用「备选图表」\n4. **应用规范**：按 `guidelines/visualization_spec.md` 中的规范生成图表\n\n## 常用场景速查\n\n### 展示趋势变化\n→ **Line Chart** (折线图)\n\n### 比较不同类别\n→ **Bar Chart** (柱状图)\n\n### 展示占比分布\n→ **Pie/Donut** (饼图/环形图) - 限5项以内\n→ **Stacked Bar** (堆叠柱状图) - 超过5项时使用\n\n### 展示相关性\n→ **Scatter Plot** (散点图)\n\n### 展示层级"},{"path":"references/visualization_spec.md","content":"# 可视化规范\n\n支持三套专业风格模板，按用户选择应用对应规范。\n\n---\n\n## 通用约束（所有风格适用）\n\n- **中文字体**: 使用 `/System/Library/Fonts/STHeiti Light.ttc`，通过 `FontProperties` 对象显式设置所有文本元素\n- **图表尺寸**: 根据内容调整，一般为 `(10, 6)` 或 `(12, 7)`\n- **DPI**: 保存时使用 300 DPI\n- **占比数据**: 超过 5 项时用堆叠柱状图替代饼图\n- **数据标签**: 百分比格式 `{:.1f}%`\n\n## ⚠️ 布局关键规范（必须遵守，防止内容遮挡）\n\n**核心原则：标题、副标题、来源注脚均不得与数据区域重叠。**\n\n1. **禁止混用 `tight_layout` 和 `fig.add_axes`**  \n   `fig.add_axes`（如 Economist 的顶部红色标签栏）与 `tight_layout` 不兼容，会导致布局错乱。  \n   凡使用 `fig.add_axes` 的图表，**必须改用 `fig.subplots_adjust`** 显式控制子图边距。\n\n2. **标题文字与数据区域必须分离**  \n   使用 `fig.subplots_adjust(top=...)` 在子图上方预留足够空间，再用 `fig.text(x, y, ...)` 将标题放入该空间。  \n   **不要**用 `ax.set_title` + 大 `pad` 值来腾挪空间——这在有 `fig.add_axes` 时会失效。\n\n3. **推荐的安全边距设置**\n\n   ```python\n   # 有顶部标签栏（Economist 风格）\n   fig.subplots_adjust(left=0.10, right=0.90, top=0.72, bottom=0.12)\n   # 标题区：fig.text(x, 0.88~0.96, ...)\n   # 红色栏：fig.add_axes([0, 0.975, 1, 0.025])\n\n   # 无顶部标签栏（McKinsey / BCG 风格）\n   fig.subplots_adjust(left=0.08, right=0.95, top=0.72, bottom=0.14)\n   # 标题区：fig.text(x, 0.88~0.96, ...)\n   ```\n\n4. **y 轴上限留白**  \n   垂直柱状图的 `ax.set_ylim` 上限应比最大数据值高 **15~20%**，确保柱顶标签不被截断。  \n   例：最大值为 8.48，则 `ax.set_ylim(0, 10.5)`。\n\n5. **底部来源注脚**  \n   使用 `fig.text(x, 0.02~0.03, ...)` 放置，`subplots_adjust(bottom=0.12)` 确保不被裁切。\n\n---\n\n## Style 1：BCG 风格（默认）\n\n### 设计原则\n简洁、克制，数据说话。绿色为唯一主色，无渐变，无装饰。\n\n### 规范\n| 属性 | 值 |\n|------|-----|\n| 主色 | `#2ca02c`（BCG 绿） |\n| 背景 | 白色 |\n| 上/右边框 | 去除 |\n| 下/左边框 | 保留（黑色，1px） |\n| 网格线 | 关闭 |\n| 标题字号 | 20，加粗 |\n| 标题内容 | 描述性，含样本量 `(N=X)` |\n| 轴标签字号 | 16 |\n\n### 代码模板\n\n```python\nimport matplotlib.pyplot as plt\nfrom matplotlib.font_manager import FontProperties\n\n# ── 字体 ──────────────────────────────────────────────\nfont_path = '/System/Library/Fonts/STHeiti Light.ttc'\nfp = FontProperties(fname=font_path)\n\n# ── 配色 ──────────────────────────────────────────────\nCOLOR_MAIN = '#2ca02c'   # BCG 绿\n\n# ── 数据（示例） ───────────────────────────────────────\nlabels = ['类别A', '类别B', '类别C', '类别D']\nvalues = [42.5, 31.2, 16.8, 9.5]\nN = 200\n\n# ── 画布 ──────────────────────────────────────────────\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# ── 绘图（水平柱状图示例） ─────────────────────────────\nbars = ax.barh(range(len(labels)), values, color=COLOR_MAIN, height=0.6)\nax.set_yticks(range(len(labels)))\nax.set_yticklabels(labels, fontproperties=fp, fontsize=13)\nax.set_xlabel('占比 (%)', fontproperties=fp, fontsize=16)\nax.set_title(f'维度名称 (N={N})', fontproperties=fp, fontsize=20, fontweight='bold')\n\n# ── 边框处理 ───────────────────────────────────────────\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\nax.spines['bottom'].set_visible(False)\nax.spines['left'].set_color('black')\nax.spines['left'].set_linewidth(1)\n\n# ── 网格 ───────────────────────────────────────────────\nax.grid(False)\n\n# ── 数据标签 ───────────────────────────────────────────\nfor i, (bar, val) in enumerate(zip(bars, values)):\n    ax.text(val + 0.8, i, f'{val:.1f}%', va='center', fontproperties=fp, fontsize=12)\n\nplt.tight_layout()\nplt.savefig('output_bcg.png', dpi=300, bbox"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/... Skill: Data Visualization Owner: veezvg Summary: 根据数据类型智能选择图表，并按统一规范生成专业 Python matplotlib 可视化代码。 支持三套专业风格模板：BCG（默认绿色简洁风）、The Economist（红线+青蓝媒体风）、McKinsey（亮青+浅灰咨询风）。 触发场景：用户需要可视化数据、生成图表、画图、制作柱状图/折线图/饼图/散点图/... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-20T03:22:27.227Z | auto Initial release with professional multi-style data visualization code generation using matplotlib: - Intelligently selects optimal ch","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1203,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T04:39:30.369Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:35:21.754Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}