data-visualization

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Data Visualization

数据可视化

Create clear, effective data visualizations via inference.sh CLI.
通过inference.sh CLI创建清晰、有效的数据可视化内容。

Quick Start

快速开始

bash
curl -fsSL https://cli.inference.sh | sh && infsh login
bash
curl -fsSL https://cli.inference.sh | sh && infsh login

Generate a chart with Python

Generate a chart with Python

infsh app run infsh/python-executor --input '{ "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use("Agg")\n\nmonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]\nrevenue = [42, 48, 55, 61, 72, 89]\n\nfig, ax = plt.subplots(figsize=(10, 6))\nax.bar(months, revenue, color="#3b82f6", width=0.6)\nax.set_ylabel("Revenue ($K)")\nax.set_title("Monthly Revenue Growth", fontweight="bold")\nfor i, v in enumerate(revenue):\n ax.text(i, v + 1, f"${v}K", ha="center", fontweight="bold")\nplt.tight_layout()\nplt.savefig("revenue.png", dpi=150)\nprint("Saved")" }'
undefined
infsh app run infsh/python-executor --input '{ "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use("Agg")\n\nmonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]\nrevenue = [42, 48, 55, 61, 72, 89]\n\nfig, ax = plt.subplots(figsize=(10, 6))\nax.bar(months, revenue, color="#3b82f6", width=0.6)\nax.set_ylabel("Revenue ($K)")\nax.set_title("Monthly Revenue Growth", fontweight="bold")\nfor i, v in enumerate(revenue):\n ax.text(i, v + 1, f"${v}K", ha="center", fontweight="bold")\nplt.tight_layout()\nplt.savefig("revenue.png", dpi=150)\nprint("Saved")" }'
undefined

Chart Selection Guide

图表选择指南

Which Chart for Which Data?

不同数据对应哪种图表?

Data RelationshipBest ChartNever Use
Change over timeLine chartPie chart
Comparing categoriesBar chart (horizontal for many categories)Line chart
Part of a wholeStacked bar, treemapPie chart (controversial but: bar is always clearer)
DistributionHistogram, box plotBar chart
CorrelationScatter plotBar chart
RankingHorizontal bar chartVertical bar, pie
GeographicChoropleth mapBar chart
Composition over timeStacked area chartMultiple pie charts
Single metricBig number (KPI card)Any chart (overkill)
Flow / processSankey diagramBar chart
数据关系最佳图表避免使用
随时间变化折线图饼图
类别对比柱状图(类别较多时用横向)折线图
整体占比堆叠柱状图、树形图饼图(虽有争议,但柱状图始终更清晰)
分布情况直方图、箱线图柱状图
相关性散点图柱状图
排名排序横向柱状图纵向柱状图、饼图
地理数据分级统计图柱状图
随时间的构成变化堆叠面积图多饼图
单一指标大数字(KPI卡片)任何图表(小题大做)
流程/流向桑基图柱状图

The Pie Chart Problem

饼图的问题

Pie charts are almost always the wrong choice:
❌ Pie chart problems:
   - Hard to compare similar-sized slices
   - Can't show more than 5-6 categories
   - 3D pie charts are always wrong
   - Impossible to read exact values

✅ Use instead:
   - Horizontal bar chart (easy comparison)
   - Stacked bar (part of whole)
   - Treemap (hierarchical parts)
   - Just a table (if precision matters)
饼图几乎总是错误的选择:
❌ 饼图的问题:
   - 难以对比相似大小的扇区
   - 无法展示超过5-6个类别
   - 3D饼图绝对不可用
   - 无法读取精确数值

✅ 替代方案:
   - 横向柱状图(便于对比)
   - 堆叠柱状图(展示占比)
   - 树形图(层级占比)
   - 直接用表格(如果需要精确值)

Design Rules

设计规则

Axes

坐标轴

RuleWhy
Always start Y-axis at 0 (bar charts)Prevents misleading visual
Line charts CAN start above 0When showing change, not absolute values
Label both axesReader shouldn't have to guess units
Remove unnecessary gridlinesReduce visual noise
Use horizontal labelsVertical text is hard to read
Sort bar charts by valueDon't use alphabetical order unless there's a reason
规则原因
柱状图Y轴始终从0开始避免视觉误导
折线图可以从0以上开始当展示变化而非绝对值时
为两个坐标轴添加标签读者无需猜测单位
移除不必要的网格线减少视觉干扰
使用横向标签垂直文本难以阅读
柱状图按数值排序除非有特殊原因,否则不要按字母顺序

Color

色彩

PrincipleApplication
Max 5-7 colors per chartMore becomes unreadable
Highlight one thingGrey everything else, color the focus
Sequential for magnitudeLight → dark for low → high
Diverging for positive/negativeRed ← neutral → blue
Categorical for groupsDistinct hues, similar brightness
Colorblind-safeAvoid red/green only — add shapes or labels
Consistent meaningIf blue = revenue, keep it blue everywhere
原则应用
每张图表最多5-7种颜色过多颜色会导致难以阅读
突出重点内容其他内容设为灰色,仅高亮重点
连续色用于量级浅→深代表低→高
发散色用于正负值红←中性色→蓝
分类色用于分组不同色调,亮度相近
色盲友好避免仅用红/绿——添加形状或标签
颜色含义一致如果蓝色代表收入,所有地方都用蓝色

Good Color Palettes

优质色彩调色板

python
undefined
python
undefined

Sequential (low to high)

Sequential (low to high)

sequential = ["#eff6ff", "#bfdbfe", "#60a5fa", "#2563eb", "#1d4ed8"]
sequential = ["#eff6ff", "#bfdbfe", "#60a5fa", "#2563eb", "#1d4ed8"]

Diverging (negative to positive)

Diverging (negative to positive)

diverging = ["#ef4444", "#f87171", "#d1d5db", "#34d399", "#10b981"]
diverging = ["#ef4444", "#f87171", "#d1d5db", "#34d399", "#10b981"]

Categorical (distinct groups)

Categorical (distinct groups)

categorical = ["#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#ef4444"]
categorical = ["#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#ef4444"]

Colorblind-safe

Colorblind-safe

cb_safe = ["#0077BB", "#33BBEE", "#009988", "#EE7733", "#CC3311"]
undefined
cb_safe = ["#0077BB", "#33BBEE", "#009988", "#EE7733", "#CC3311"]
undefined

Text and Labels

文本与标签

ElementRule
TitleStates the insight, not the data type. "Revenue doubled in Q2" not "Q2 Revenue Chart"
AnnotationsCall out key data points directly on the chart
LegendAvoid if possible — label directly on chart lines/bars
Font sizeMinimum 12px, 14px+ for presentations
Number formatUse K, M, B for large numbers (42K not 42,000)
Data labelsAdd to bars/points when exact values matter
元素规则
标题阐述洞察,而非数据类型。例如“第二季度收入翻倍”而非“第二季度收入图表”
注释在图表上直接标注关键数据点
图例尽可能避免——直接在图表线条/柱状上标注
字体大小最小12px,演示文稿用14px以上
数字格式大数字用K、M、B(如42K而非42,000)
数据标签当需要精确值时,添加到柱状/数据点上

Chart Recipes

图表示例

Line Chart (Time Series)

折线图(时间序列)

bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(12, 6))\nfig.patch.set_facecolor(\"white\")\n\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nthis_year = [120, 135, 148, 162, 178, 195, 210, 228, 245, 268, 290, 320]\nlast_year = [95, 102, 108, 115, 122, 130, 138, 145, 155, 165, 178, 190]\n\nax.plot(months, this_year, color=\"#3b82f6\", linewidth=2.5, marker=\"o\", markersize=6, label=\"2024\")\nax.plot(months, last_year, color=\"#94a3b8\", linewidth=2, linestyle=\"--\", label=\"2023\")\nax.fill_between(range(len(months)), last_year, this_year, alpha=0.1, color=\"#3b82f6\")\n\nax.annotate(\"$320K\", xy=(11, 320), fontsize=14, fontweight=\"bold\", color=\"#3b82f6\")\nax.annotate(\"$190K\", xy=(11, 190), fontsize=12, color=\"#94a3b8\")\n\nax.set_ylabel(\"Revenue ($K)\", fontsize=12)\nax.set_title(\"Revenue grew 68% year-over-year\", fontsize=16, fontweight=\"bold\")\nax.legend(fontsize=12)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.3)\nplt.tight_layout()\nplt.savefig(\"line-chart.png\", dpi=150)\nprint(\"Saved\")"
}'
bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(12, 6))\nfig.patch.set_facecolor(\"white\")\n\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nthis_year = [120, 135, 148, 162, 178, 195, 210, 228, 245, 268, 290, 320]\nlast_year = [95, 102, 108, 115, 122, 130, 138, 145, 155, 165, 178, 190]\n\nax.plot(months, this_year, color=\"#3b82f6\", linewidth=2.5, marker=\"o\", markersize=6, label=\"2024\")\nax.plot(months, last_year, color=\"#94a3b8\", linewidth=2, linestyle=\"--\", label=\"2023\")\nax.fill_between(range(len(months)), last_year, this_year, alpha=0.1, color=\"#3b82f6\")\n\nax.annotate(\"$320K\", xy=(11, 320), fontsize=14, fontweight=\"bold\", color=\"#3b82f6\")\nax.annotate(\"$190K\", xy=(11, 190), fontsize=12, color=\"#94a3b8\")\n\nax.set_ylabel(\"Revenue ($K)\", fontsize=12)\nax.set_title(\"Revenue grew 68% year-over-year\", fontsize=16, fontweight=\"bold\")\nax.legend(fontsize=12)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.3)\nplt.tight_layout()\nplt.savefig(\"line-chart.png\", dpi=150)\nprint(\"Saved\")"
}'

Horizontal Bar Chart (Comparison)

横向柱状图(对比)

bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ncategories = [\"Email\", \"Social\", \"SEO\", \"Paid Ads\", \"Referral\", \"Direct\"]\nvalues = [12, 18, 35, 22, 8, 5]\ncolors = [\"#94a3b8\"] * len(values)\ncolors[2] = \"#3b82f6\"  # Highlight the winner\n\n# Sort by value\nsorted_pairs = sorted(zip(values, categories, colors))\nvalues, categories, colors = zip(*sorted_pairs)\n\nax.barh(categories, values, color=colors, height=0.6)\nfor i, v in enumerate(values):\n    ax.text(v + 0.5, i, f\"{v}%\", va=\"center\", fontsize=12, fontweight=\"bold\")\n\nax.set_xlabel(\"% of Total Traffic\", fontsize=12)\nax.set_title(\"SEO drives the most traffic\", fontsize=16, fontweight=\"bold\")\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nplt.tight_layout()\nplt.savefig(\"bar-chart.png\", dpi=150)\nprint(\"Saved\")"
}'
bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ncategories = [\"Email\", \"Social\", \"SEO\", \"Paid Ads\", \"Referral\", \"Direct\"]\nvalues = [12, 18, 35, 22, 8, 5]\ncolors = [\"#94a3b8\"] * len(values)\ncolors[2] = \"#3b82f6\"  # Highlight the winner\n\n# Sort by value\nsorted_pairs = sorted(zip(values, categories, colors))\nvalues, categories, colors = zip(*sorted_pairs)\n\nax.barh(categories, values, color=colors, height=0.6)\nfor i, v in enumerate(values):\n    ax.text(v + 0.5, i, f\"{v}%\", va=\"center\", fontsize=12, fontweight=\"bold\")\n\nax.set_xlabel(\"% of Total Traffic\", fontsize=12)\nax.set_title(\"SEO drives the most traffic\", fontsize=16, fontweight=\"bold\")\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nplt.tight_layout()\nplt.savefig(\"bar-chart.png\", dpi=150)\nprint(\"Saved\")"
}'

KPI / Big Number Card

KPI / 大数字卡片

bash
infsh app run infsh/html-to-image --input '{
  "html": "<div style=\"display:flex;gap:20px;padding:20px;background:white;font-family:system-ui\"><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Monthly Revenue</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">$89K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 23% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Active Users</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">12.4K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 8% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Churn Rate</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">2.1%</p><p style=\"color:#ef4444;font-size:14px;margin:0\">↑ 0.3% vs last month</p></div></div>"
}'
bash
infsh app run infsh/html-to-image --input '{
  "html": "<div style=\"display:flex;gap:20px;padding:20px;background:white;font-family:system-ui\"><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Monthly Revenue</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">$89K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 23% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Active Users</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">12.4K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 8% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Churn Rate</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">2.1%</p><p style=\"color:#ef4444;font-size:14px;margin:0\">↑ 0.3% vs last month</p></div></div>"
}'

Heatmap

热力图

bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport numpy as np\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ndays = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\nhours = [\"9AM\", \"10AM\", \"11AM\", \"12PM\", \"1PM\", \"2PM\", \"3PM\", \"4PM\", \"5PM\"]\ndata = np.random.randint(10, 100, size=(len(hours), len(days)))\ndata[2][1] = 95  # Tuesday 11AM peak\ndata[2][3] = 88  # Thursday 11AM\n\nim = ax.imshow(data, cmap=\"Blues\", aspect=\"auto\")\nax.set_xticks(range(len(days)))\nax.set_yticks(range(len(hours)))\nax.set_xticklabels(days, fontsize=12)\nax.set_yticklabels(hours, fontsize=12)\n\nfor i in range(len(hours)):\n    for j in range(len(days)):\n        color = \"white\" if data[i][j] > 60 else \"black\"\n        ax.text(j, i, data[i][j], ha=\"center\", va=\"center\", fontsize=10, color=color)\n\nax.set_title(\"Website Traffic by Day & Hour\", fontsize=16, fontweight=\"bold\")\nplt.colorbar(im, label=\"Visitors\")\nplt.tight_layout()\nplt.savefig(\"heatmap.png\", dpi=150)\nprint(\"Saved\")"
}'
bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport numpy as np\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ndays = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\nhours = [\"9AM\", \"10AM\", \"11AM\", \"12PM\", \"1PM\", \"2PM\", \"3PM\", \"4PM\", \"5PM\"]\ndata = np.random.randint(10, 100, size=(len(hours), len(days)))\ndata[2][1] = 95  # Tuesday 11AM peak\ndata[2][3] = 88  # Thursday 11AM\n\nim = ax.imshow(data, cmap=\"Blues\", aspect=\"auto\")\nax.set_xticks(range(len(days)))\nax.set_yticks(range(len(hours)))\nax.set_xticklabels(days, fontsize=12)\nax.set_yticklabels(hours, fontsize=12)\n\nfor i in range(len(hours)):\n    for j in range(len(days)):\n        color = \"white\" if data[i][j] > 60 else \"black\"\n        ax.text(j, i, data[i][j], ha=\"center\", va=\"center\", fontsize=10, color=color)\n\nax.set_title(\"Website Traffic by Day & Hour\", fontsize=16, fontweight=\"bold\")\nplt.colorbar(im, label=\"Visitors\")\nplt.tight_layout()\nplt.savefig(\"heatmap.png\", dpi=150)\nprint(\"Saved\")"
}'

Storytelling with Data

数据叙事

The Narrative Arc

叙事结构

StepWhat to DoExample
1. ContextSet up what the reader needs to know"We track customer acquisition cost monthly"
2. TensionShow the problem or change"CAC increased 40% in Q3"
3. ResolutionShow the insight or solution"But LTV increased 80%, so unit economics improved"
步骤操作示例
1. 背景说明读者需要了解的信息“我们每月跟踪客户获取成本”
2. 冲突展示问题或变化“第三季度CAC增长了40%”
3. 解决展示洞察或方案“但LTV增长了80%,所以单位经济效益提升了”

Title as Insight

标题即洞察

❌ Descriptive titles (what the chart shows):
   "Q3 Revenue by Product Line"
   "Monthly Active Users 2024"
   "Customer Satisfaction Survey Results"

✅ Insight titles (what the chart means):
   "Enterprise product drives 70% of revenue growth"
   "User growth accelerated after the free tier launch"
   "Support response time is the #1 satisfaction driver"
❌ 描述性标题(图表展示内容):
   "第三季度各产品线收入"
   "2024年月活跃用户"
   "客户满意度调查结果"

✅ 洞察性标题(图表含义):
   "企业产品带动70%的收入增长"
   "免费套餐推出后用户增长加速"
   "支持响应时间是满意度的首要驱动因素"

Annotation Techniques

注释技巧

TechniqueWhen to Use
Call-out labelHighlight a specific data point ("Peak: 320K")
Reference lineShow target/benchmark ("Goal: 100K")
Shaded regionMark a time period ("Product launch window")
Arrow + textDraw attention to trend change
Before/after lineShow impact of an event
技巧使用场景
标注标签高亮特定数据点(“峰值:320K”)
参考线展示目标/基准(“目标:100K”)
阴影区域标记时间段(“产品发布窗口”)
箭头+文本吸引注意力到趋势变化
前后对比线展示事件的影响

Dark Mode Charts

深色模式图表

bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\n# Dark theme\nplt.rcParams.update({\n    \"figure.facecolor\": \"#0f172a\",\n    \"axes.facecolor\": \"#0f172a\",\n    \"axes.edgecolor\": \"#334155\",\n    \"axes.labelcolor\": \"white\",\n    \"text.color\": \"white\",\n    \"xtick.color\": \"white\",\n    \"ytick.color\": \"white\",\n    \"grid.color\": \"#1e293b\"\n})\n\nfig, ax = plt.subplots(figsize=(12, 6))\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]\nvalues = [45, 52, 58, 72, 85, 98]\n\nax.plot(months, values, color=\"#818cf8\", linewidth=3, marker=\"o\", markersize=8)\nax.fill_between(range(len(months)), values, alpha=0.15, color=\"#818cf8\")\nax.set_title(\"MRR Growth: On track for $100K\", fontsize=18, fontweight=\"bold\")\nax.set_ylabel(\"MRR ($K)\", fontsize=13)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.2)\n\nfor i, v in enumerate(values):\n    ax.annotate(f\"${v}K\", (i, v), textcoords=\"offset points\", xytext=(0, 12), ha=\"center\", fontsize=11, fontweight=\"bold\")\n\nplt.tight_layout()\nplt.savefig(\"dark-chart.png\", dpi=150, facecolor=\"#0f172a\")\nprint(\"Saved\")"
}'
bash
infsh app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\n# Dark theme\nplt.rcParams.update({\n    \"figure.facecolor\": \"#0f172a\",\n    \"axes.facecolor\": \"#0f172a\",\n    \"axes.edgecolor\": \"#334155\",\n    \"axes.labelcolor\": \"white\",\n    \"text.color\": \"white\",\n    \"xtick.color\": \"white\",\n    \"ytick.color\": \"white\",\n    \"grid.color\": \"#1e293b\"\n})\n\nfig, ax = plt.subplots(figsize=(12, 6))\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]\nvalues = [45, 52, 58, 72, 85, 98]\n\nax.plot(months, values, color=\"#818cf8\", linewidth=3, marker=\"o\", markersize=8)\nax.fill_between(range(len(months)), values, alpha=0.15, color=\"#818cf8\")\nax.set_title(\"MRR Growth: On track for $100K\", fontsize=18, fontweight=\"bold\")\nax.set_ylabel(\"MRR ($K)\", fontsize=13)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.2)\n\nfor i, v in enumerate(values):\n    ax.annotate(f\"${v}K\", (i, v), textcoords=\"offset points\", xytext=(0, 12), ha=\"center\", fontsize=11, fontweight=\"bold\")\n\nplt.tight_layout()\nplt.savefig(\"dark-chart.png\", dpi=150, facecolor=\"#0f172a\")\nprint(\"Saved\")"
}'

Common Mistakes

常见错误

MistakeProblemFix
Pie chartsHard to compare, always misleadingUse bar charts or treemaps
Y-axis not starting at 0 (bar charts)Exaggerates differencesStart at 0 for bars, OK to truncate for lines
Too many colorsVisual noise, confusingMax 5-7 colors, highlight only what matters
No title or generic titleReader doesn't know the insightTitle = the takeaway, not the data type
3D chartsDistorts data, looks unprofessionalAlways use 2D
Dual Y-axesMisleading, hard to readUse two separate charts
Alphabetical sort on bar chartsHides the storySort by value (largest first)
No labels on axesReader can't interpretAlways label with units
Chartjunk (decorative elements)Distracts from dataRemove everything that doesn't convey information
Red/green only for color codingColorblind users can't readUse shapes, patterns, or colorblind-safe palettes
错误问题修复方案
使用饼图难以对比,具有误导性使用柱状图或树形图
柱状图Y轴不从0开始夸大差异柱状图从0开始,折线图可以截断
颜色过多视觉干扰,令人困惑最多5-7种颜色,仅高亮重点
无标题或通用标题读者无法获取洞察标题即核心结论,而非数据类型
3D图表扭曲数据,看起来不专业始终使用2D
双Y轴误导性强,难以阅读使用两个独立图表
柱状图按字母排序隐藏故事性按数值排序(从大到小)
坐标轴无标签读者无法解读始终标注单位
图表垃圾(装饰元素)分散对数据的注意力移除所有不传达信息的元素
仅用红/绿编码色盲用户无法读取使用形状、图案或色盲友好调色板

Related Skills

相关技能

bash
npx skills add inference-sh/skills@pitch-deck-visuals
npx skills add inference-sh/skills@technical-blog-writing
npx skills add inference-sh/skills@competitor-teardown
Browse all apps:
infsh app list
bash
npx skills add inference-sh/skills@pitch-deck-visuals
npx skills add inference-sh/skills@technical-blog-writing
npx skills add inference-sh/skills@competitor-teardown
浏览所有应用:
infsh app list