[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71MSY2922AZEDVR980SHZEW":3,"skill-same:01M71MSY2922AZEDVR980SHZEW":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":15,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":67,"ownerHtmlUrl":68,"ownerBlogUrl":69,"ownerDescription":6,"updatedAt":70,"install":71,"resources":84},"01M71MSY2922AZEDVR980SHZEW","data-visualization",null,"Create effective data visualizations with Python (matplotlib, seaborn, plotly). Use when building charts, choosing the right chart type for a dataset, creating publication-quality figures, or applying design principles like accessibility and color theory.","monoes\u002Fmonomind","monoes","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F276744696?v=4","01M71KWF37AJ2NJBP3KWBVSDGT","01M71KWF4CSF8ADH0M6HA09VD2",23,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdata-visualization\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdata-visualization\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"data","data visualization","visualization","use","python","for","color","visualizations","figures","Publication","plotly","work","create","dataset","when","chart","design principles","knowledge","design","Charts","2026-11-10 10:56:23",false,"---\nname: data-visualization\ndescription: \"Create effective data visualizations with Python (matplotlib, seaborn, plotly). Use when building charts, choosing the right chart type for a dataset, creating publication-quality figures, or applying design principles like accessibility and color theory.\"\ntags: []\ntools: []\nlicense: Apache-2.0\nsource: https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\nsource_path: \"data\u002Fskills\u002Fdata-visualization\"\nsource_commit: 8444efcd48f7012f09797778a36a33e73d0861f4\n---\n# Data Visualization Skill\n\nChart selection guidance, Python visualization code patterns, design principles, and accessibility considerations for creating effective data visualizations.\n\n## Chart Selection Guide\n\n### Choose by Data Relationship\n\n| What You're Showing | Best Chart | Alternatives |\n|---|---|---|\n| **Trend over time** | Line chart | Area chart (if showing cumulative or composition) |\n| **Comparison across categories** | Vertical bar chart | Horizontal bar (many categories), lollipop chart |\n| **Ranking** | Horizontal bar chart | Dot plot, slope chart (comparing two periods) |\n| **Part-to-whole composition** | Stacked bar chart | Treemap (hierarchical), waffle chart |\n| **Composition over time** | Stacked area chart | 100% stacked bar (for proportion focus) |\n| **Distribution** | Histogram | Box plot (comparing groups), violin plot, strip plot |\n| **Correlation (2 variables)** | Scatter plot | Bubble chart (add 3rd variable as size) |\n| **Correlation (many variables)** | Heatmap (correlation matrix) | Pair plot |\n| **Geographic patterns** | Choropleth map | Bubble map, hex map |\n| **Flow \u002F process** | Sankey diagram | Funnel chart (sequential stages) |\n| **Relationship network** | Network graph | Chord diagram |\n| **Performance vs. target** | Bullet chart | Gauge (single KPI only) |\n| **Multiple KPIs at once** | Small multiples | Dashboard with separate charts |\n\n### When NOT to Use Certain Charts\n\n- **Pie charts**: Avoid unless \u003C6 categories and exact proportions matter less than rough comparison. Humans are bad at comparing angles. Use bar charts instead.\n- **3D charts**: Never. They distort perception and add no information.\n- **Dual-axis charts**: Use cautiously. They can mislead by implying correlation. Clearly label both axes if used.\n- **Stacked bar (many categories)**: Hard to compare middle segments. Use small multiples or grouped bars instead.\n- **Donut charts**: Slightly better than pie charts but same fundamental issues. Use for single KPI display at most.\n\n## Python Visualization Code Patterns\n\n### Setup and Style\n\n```python\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as mticker\nimport seaborn as sns\nimport pandas as pd\nimport numpy as np\n\n# Professional style setup\nplt.style.use('seaborn-v0_8-whitegrid')\nplt.rcParams.update({\n    'figure.figsize': (10, 6),\n    'figure.dpi': 150,\n    'font.size': 11,\n    'axes.titlesize': 14,\n    'axes.titleweight': 'bold',\n    'axes.labelsize': 11,\n    'xtick.labelsize': 10,\n    'ytick.labelsize': 10,\n    'legend.fontsize': 10,\n    'figure.titlesize': 16,\n})\n\n# Colorblind-friendly palettes\nPALETTE_CATEGORICAL = ['#4C72B0', '#DD8452', '#55A868', '#C44E52', '#8172B3', '#937860']\nPALETTE_SEQUENTIAL = 'YlOrRd'\nPALETTE_DIVERGING = 'RdBu_r'\n```\n\n### Line Chart (Time Series)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\nfor label, group in df.groupby('category'):\n    ax.plot(group['date'], group['value'], label=label, linewidth=2)\n\nax.set_title('Metric Trend by Category', fontweight='bold')\nax.set_xlabel('Date')\nax.set_ylabel('Value')\nax.legend(loc='upper left', frameon=True)\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\n# Format dates on x-axis\nfig.autofmt_xdate()\n\nplt.tight_layout()\nplt.savefig('trend_chart.png', dpi=150, bbox_inches='tight')\n```\n\n### Bar Chart (Comparison)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# Sort by value for easy reading\ndf_sorted = df.sort_values('metric', ascending=True)\n\nbars = ax.barh(df_sorted['category'], df_sorted['metric'], color=PALETTE_CATEGORICAL[0])\n\n# Add value labels\nfor bar in bars:\n    width = bar.get_width()\n    ax.text(width + 0.5, bar.get_y() + bar.get_height()\u002F2,\n            f'{width:,.0f}', ha='left', va='center', fontsize=10)\n\nax.set_title('Metric by Category (Ranked)', fontweight='bold')\nax.set_xlabel('Metric Value')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')\n```\n\n### Histogram (Distribution)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\nax.hist(df['value'], bins=30, color=PALETTE_CATEGORICAL[0], edgecolor='white', alpha=0.8)\n\n# Add mean and median lines\nmean_val = df['value'].mean()\nmedian_val = df['value'].median()\nax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:,.1f}')\nax.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:,.1f}')\n\nax.set_title('Distribution of Values', fontweight='bold')\nax.set_xlabel('Value')\nax.set_ylabel('Frequency')\nax.legend()\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('histogram.png', dpi=150, bbox_inches='tight')\n```\n\n### Heatmap\n\n```python\nfig, ax = plt.subplots(figsize=(10, 8))\n\n# Pivot data for heatmap format\npivot = df.pivot_table(index='row_dim', columns='col_dim', values='metric', aggfunc='sum')\n\nsns.heatmap(pivot, annot=True, fmt=',.0f', cmap='YlOrRd',\n            linewidths=0.5, ax=ax, cbar_kws={'label': 'Metric Value'})\n\nax.set_title('Metric by Row Dimension and Column Dimension', fontweight='bold')\nax.set_xlabel('Column Dimension')\nax.set_ylabel('Row Dimension')\n\nplt.tight_layout()\nplt.savefig('heatmap.png', dpi=150, bbox_inches='tight')\n```\n\n### Small Multiples\n\n```python\ncategories = df['category'].unique()\nn_cats = len(categories)\nn_cols = min(3, n_cats)\nn_rows = (n_cats + n_cols - 1) \u002F\u002F n_cols\n\nfig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows), sharex=True, sharey=True)\naxes = axes.flatten() if n_cats > 1 else [axes]\n\nfor i, cat in enumerate(categories):\n    ax = axes[i]\n    subset = df[df['category'] == cat]\n    ax.plot(subset['date'], subset['value'], color=PALETTE_CATEGORICAL[i % len(PALETTE_CATEGORICAL)])\n    ax.set_title(cat, fontsize=12)\n    ax.spines['top'].set_visible(False)\n    ax.spines['right'].set_visible(False)\n\n# Hide empty subplots\nfor j in range(i+1, len(axes)):\n    axes[j].set_visible(False)\n\nfig.suptitle('Trends by Category', fontsize=14, fontweight='bold', y=1.02)\nplt.tight_layout()\nplt.savefig('small_multiples.png', dpi=150, bbox_inches='tight')\n```\n\n### Number Formatting Helpers\n\n```python\ndef format_number(val, format_type='number'):\n    \"\"\"Format numbers for chart labels.\"\"\"\n    if format_type == 'currency':\n        if abs(val) >= 1e9:\n            return f'${val\u002F1e9:.1f}B'\n        elif abs(val) >= 1e6:\n            return f'${val\u002F1e6:.1f}M'\n        elif abs(val) >= 1e3:\n            return f'${val\u002F1e3:.1f}K'\n        else:\n            return f'${val:,.0f}'\n    elif format_type == 'percent':\n        return f'{val:.1f}%'\n    elif format_type == 'number':\n        if abs(val) >= 1e9:\n            return f'{val\u002F1e9:.1f}B'\n        elif abs(val) >= 1e6:\n            return f'{val\u002F1e6:.1f}M'\n        elif abs(val) >= 1e3:\n            return f'{val\u002F1e3:.1f}K'\n        else:\n            return f'{val:,.0f}'\n    return str(val)\n\n# Usage with axis formatter\nax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, p: format_number(x, 'currency')))\n```\n\n### Interactive Charts with Plotly\n\n```python\nimport plotly.express as px\nimport plotly.graph_objects as go\n\n# Simple interactive line chart\nfig = px.line(df, x='date', y='value', color='category',\n              title='Interactive Metric Trend',\n              labels={'value': 'Metric Value', 'date': 'Date'})\nfig.update_layout(hovermode='x unified')\nfig.write_html('interactive_chart.html')\nfig.show()\n\n# Interactive scatter with hover data\nfig = px.scatter(df, x='metric_a', y='metric_b', color='category',\n                 size='size_metric', hover_data=['name', 'detail_field'],\n                 title='Correlation Analysis')\nfig.show()\n```\n\n## Design Principles\n\n### Color\n\n- **Use color purposefully**: Color should encode data, not decorate\n- **Highlight the story**: Use a bright accent color for the key insight; grey everything else\n- **Sequential data**: Use a single-hue gradient (light to dark) for ordered values\n- **Diverging data**: Use a two-hue gradient with neutral midpoint for data with a meaningful center\n- **Categorical data**: Use distinct hues, maximum 6-8 before it gets confusing\n- **Avoid red\u002Fgreen only**: 8% of men are red-green colorblind. Use blue\u002Forange as primary pair\n\n### Typography\n\n- **Title states the insight**: \"Revenue grew 23% YoY\" beats \"Revenue by Month\"\n- **Subtitle adds context**: Date range, filters applied, data source\n- **Axis labels are readable**: Never rotated 90 degrees if avoidable. Shorten or wrap instead\n- **Data labels add precision**: Use on key points, not every single bar\n- **Annotation highlights**: Call out specific points with text annotations\n\n### Layout\n\n- **Reduce chart junk**: Remove gridlines, borders, backgrounds that don't carry information\n- **Sort meaningfully**: Categories sorted by value (not alphabetically) unless there's a natural order (months, stages)\n- **Appropriate aspect ratio**: Time series wider than tall (3:1 to 2:1); comparisons can be squarer\n- **White space is good**: Don't cram charts together. Give each visualization room to breathe\n\n### Accuracy\n\n- **Bar charts start at zero**: Always. A bar from 95 to 100 exaggerates a 5% difference\n- **Line charts can have non-zero baselines**: When the range of variation is meaningful\n- **Consistent scales across panels**: When comparing multiple charts, use the same axis range\n- **Show uncertainty**: Error bars, confidence intervals, or ranges when data is uncertain\n- **Label your axes**: Never make the reader guess what the numbers mean\n\n## Accessibility Considerations\n\n### Color Blindness\n\n- Never rely on color alone to distinguish data series\n- Add pattern fills, different line styles (solid, dashed, dotted), or direct labels\n- Test with a colorblind simulator (e.g., Coblis, Sim Daltonism)\n- Use the colorblind-friendly palette: `sns.color_palette(\"colorblind\")`\n\n### Screen Readers\n\n- Include alt text describing the chart's key finding\n- Provide a data table alternative alongside the visualization\n- Use semantic titles and labels\n\n### General Accessibility\n\n- Sufficient contrast between data elements and background\n- Text size minimum 10pt for labels, 12pt for titles\n- Avoid conveying information only through spatial position (add labels)\n- Consider printing: does the chart work in black and white?\n\n### Accessibility Checklist\n\nBefore sharing a visualization:\n- [ ] Chart works without color (patterns, labels, or line styles differentiate series)\n- [ ] Text is readable at standard zoom level\n- [ ] Title describes the insight, not just the data\n- [ ] Axes are labeled with units\n- [ ] Legend is clear and positioned without obscuring data\n- [ ] Data source and date range are noted\n","# Data Visualization Skill\n\nChart selection guidance, Python visualization code patterns, design principles, and accessibility considerations for creating effective data visualizations.\n\n## Chart Selection Guide\n\n### Choose by Data Relationship\n\n| What You're Showing | Best Chart | Alternatives |\n|---|---|---|\n| **Trend over time** | Line chart | Area chart (if showing cumulative or composition) |\n| **Comparison across categories** | Vertical bar chart | Horizontal bar (many categories), lollipop chart |\n| **Ranking** | Horizontal bar chart | Dot plot, slope chart (comparing two periods) |\n| **Part-to-whole composition** | Stacked bar chart | Treemap (hierarchical), waffle chart |\n| **Composition over time** | Stacked area chart | 100% stacked bar (for proportion focus) |\n| **Distribution** | Histogram | Box plot (comparing groups), violin plot, strip plot |\n| **Correlation (2 variables)** | Scatter plot | Bubble chart (add 3rd variable as size) |\n| **Correlation (many variables)** | Heatmap (correlation matrix) | Pair plot |\n| **Geographic patterns** | Choropleth map | Bubble map, hex map |\n| **Flow \u002F process** | Sankey diagram | Funnel chart (sequential stages) |\n| **Relationship network** | Network graph | Chord diagram |\n| **Performance vs. target** | Bullet chart | Gauge (single KPI only) |\n| **Multiple KPIs at once** | Small multiples | Dashboard with separate charts |\n\n### When NOT to Use Certain Charts\n\n- **Pie charts**: Avoid unless \u003C6 categories and exact proportions matter less than rough comparison. Humans are bad at comparing angles. Use bar charts instead.\n- **3D charts**: Never. They distort perception and add no information.\n- **Dual-axis charts**: Use cautiously. They can mislead by implying correlation. Clearly label both axes if used.\n- **Stacked bar (many categories)**: Hard to compare middle segments. Use small multiples or grouped bars instead.\n- **Donut charts**: Slightly better than pie charts but same fundamental issues. Use for single KPI display at most.\n\n## Python Visualization Code Patterns\n\n### Setup and Style\n\n```python\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as mticker\nimport seaborn as sns\nimport pandas as pd\nimport numpy as np\n\n# Professional style setup\nplt.style.use('seaborn-v0_8-whitegrid')\nplt.rcParams.update({\n    'figure.figsize': (10, 6),\n    'figure.dpi': 150,\n    'font.size': 11,\n    'axes.titlesize': 14,\n    'axes.titleweight': 'bold',\n    'axes.labelsize': 11,\n    'xtick.labelsize': 10,\n    'ytick.labelsize': 10,\n    'legend.fontsize': 10,\n    'figure.titlesize': 16,\n})\n\n# Colorblind-friendly palettes\nPALETTE_CATEGORICAL = ['#4C72B0', '#DD8452', '#55A868', '#C44E52', '#8172B3', '#937860']\nPALETTE_SEQUENTIAL = 'YlOrRd'\nPALETTE_DIVERGING = 'RdBu_r'\n```\n\n### Line Chart (Time Series)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\nfor label, group in df.groupby('category'):\n    ax.plot(group['date'], group['value'], label=label, linewidth=2)\n\nax.set_title('Metric Trend by Category', fontweight='bold')\nax.set_xlabel('Date')\nax.set_ylabel('Value')\nax.legend(loc='upper left', frameon=True)\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\n# Format dates on x-axis\nfig.autofmt_xdate()\n\nplt.tight_layout()\nplt.savefig('trend_chart.png', dpi=150, bbox_inches='tight')\n```\n\n### Bar Chart (Comparison)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# Sort by value for easy reading\ndf_sorted = df.sort_values('metric', ascending=True)\n\nbars = ax.barh(df_sorted['category'], df_sorted['metric'], color=PALETTE_CATEGORICAL[0])\n\n# Add value labels\nfor bar in bars:\n    width = bar.get_width()\n    ax.text(width + 0.5, bar.get_y() + bar.get_height()\u002F2,\n            f'{width:,.0f}', ha='left', va='center', fontsize=10)\n\nax.set_title('Metric by Category (Ranked)', fontweight='bold')\nax.set_xlabel('Metric Value')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')\n```\n\n### Histogram (Distribution)\n\n```python\nfig, ax = plt.subplots(figsize=(10, 6))\n\nax.hist(df['value'], bins=30, color=PALETTE_CATEGORICAL[0], edgecolor='white', alpha=0.8)\n\n# Add mean and median lines\nmean_val = df['value'].mean()\nmedian_val = df['value'].median()\nax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:,.1f}')\nax.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:,.1f}')\n\nax.set_title('Distribution of Values', fontweight='bold')\nax.set_xlabel('Value')\nax.set_ylabel('Frequency')\nax.legend()\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('histogram.png', dpi=150, bbox_inches='tight')\n```\n\n### Heatmap\n\n```python\nfig, ax = plt.subplots(figsize=(10, 8))\n\n# Pivot data for heatmap format\npivot = df.pivot_table(index='row_dim', columns='col_dim', values='metric', aggfunc='sum')\n\nsns.heatmap(pivot, annot=True, fmt=',.0f', cmap='YlOrRd',\n            linewidths=0.5, ax=ax, cbar_kws={'label': 'Metric Value'})\n\nax.set_title('Metric by Row Dimension and Column Dimension', fontweight='bold')\nax.set_xlabel('Column Dimension')\nax.set_ylabel('Row Dimension')\n\nplt.tight_layout()\nplt.savefig('heatmap.png', dpi=150, bbox_inches='tight')\n```\n\n### Small Multiples\n\n```python\ncategories = df['category'].unique()\nn_cats = len(categories)\nn_cols = min(3, n_cats)\nn_rows = (n_cats + n_cols - 1) \u002F\u002F n_cols\n\nfig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows), sharex=True, sharey=True)\naxes = axes.flatten() if n_cats > 1 else [axes]\n\nfor i, cat in enumerate(categories):\n    ax = axes[i]\n    subset = df[df['category'] == cat]\n    ax.plot(subset['date'], subset['value'], color=PALETTE_CATEGORICAL[i % len(PALETTE_CATEGORICAL)])\n    ax.set_title(cat, fontsize=12)\n    ax.spines['top'].set_visible(False)\n    ax.spines['right'].set_visible(False)\n\n# Hide empty subplots\nfor j in range(i+1, len(axes)):\n    axes[j].set_visible(False)\n\nfig.suptitle('Trends by Category', fontsize=14, fontweight='bold', y=1.02)\nplt.tight_layout()\nplt.savefig('small_multiples.png', dpi=150, bbox_inches='tight')\n```\n\n### Number Formatting Helpers\n\n```python\ndef format_number(val, format_type='number'):\n    \"\"\"Format numbers for chart labels.\"\"\"\n    if format_type == 'currency':\n        if abs(val) >= 1e9:\n            return f'${val\u002F1e9:.1f}B'\n        elif abs(val) >= 1e6:\n            return f'${val\u002F1e6:.1f}M'\n        elif abs(val) >= 1e3:\n            return f'${val\u002F1e3:.1f}K'\n        else:\n            return f'${val:,.0f}'\n    elif format_type == 'percent':\n        return f'{val:.1f}%'\n    elif format_type == 'number':\n        if abs(val) >= 1e9:\n            return f'{val\u002F1e9:.1f}B'\n        elif abs(val) >= 1e6:\n            return f'{val\u002F1e6:.1f}M'\n        elif abs(val) >= 1e3:\n            return f'{val\u002F1e3:.1f}K'\n        else:\n            return f'{val:,.0f}'\n    return str(val)\n\n# Usage with axis formatter\nax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, p: format_number(x, 'currency')))\n```\n\n### Interactive Charts with Plotly\n\n```python\nimport plotly.express as px\nimport plotly.graph_objects as go\n\n# Simple interactive line chart\nfig = px.line(df, x='date', y='value', color='category',\n              title='Interactive Metric Trend',\n              labels={'value': 'Metric Value', 'date': 'Date'})\nfig.update_layout(hovermode='x unified')\nfig.write_html('interactive_chart.html')\nfig.show()\n\n# Interactive scatter with hover data\nfig = px.scatter(df, x='metric_a', y='metric_b', color='category',\n                 size='size_metric', hover_data=['name', 'detail_field'],\n                 title='Correlation Analysis')\nfig.show()\n```\n\n## Design Principles\n\n### Color\n\n- **Use color purposefully**: Color should encode data, not decorate\n- **Highlight the story**: Use a bright accent color for the key insight; grey everything else\n- **Sequential data**: Use a single-hue gradient (light to dark) for ordered values\n- **Diverging data**: Use a two-hue gradient with neutral midpoint for data with a meaningful center\n- **Categorical data**: Use distinct hues, maximum 6-8 before it gets confusing\n- **Avoid red\u002Fgreen only**: 8% of men are red-green colorblind. Use blue\u002Forange as primary pair\n\n### Typography\n\n- **Title states the insight**: \"Revenue grew 23% YoY\" beats \"Revenue by Month\"\n- **Subtitle adds context**: Date range, filters applied, data source\n- **Axis labels are readable**: Never rotated 90 degrees if avoidable. Shorten or wrap instead\n- **Data labels add precision**: Use on key points, not every single bar\n- **Annotation highlights**: Call out specific points with text annotations\n\n### Layout\n\n- **Reduce chart junk**: Remove gridlines, borders, backgrounds that don't carry information\n- **Sort meaningfully**: Categories sorted by value (not alphabetically) unless there's a natural order (months, stages)\n- **Appropriate aspect ratio**: Time series wider than tall (3:1 to 2:1); comparisons can be squarer\n- **White space is good**: Don't cram charts together. Give each visualization room to breathe\n\n### Accuracy\n\n- **Bar charts start at zero**: Always. A bar from 95 to 100 exaggerates a 5% difference\n- **Line charts can have non-zero baselines**: When the range of variation is meaningful\n- **Consistent scales across panels**: When comparing multiple charts, use the same axis range\n- **Show uncertainty**: Error bars, confidence intervals, or ranges when data is uncertain\n- **Label your axes**: Never make the reader guess what the numbers mean\n\n## Accessibility Considerations\n\n### Color Blindness\n\n- Never rely on color alone to distinguish data series\n- Add pattern fills, different line styles (solid, dashed, dotted), or direct labels\n- Test with a colorblind simulator (e.g., Coblis, Sim Daltonism)\n- Use the colorblind-friendly palette: `sns.color_palette(\"colorblind\")`\n\n### Screen Readers\n\n- Include alt text describing the chart's key finding\n- Provide a data table alternative alongside the visualization\n- Use semantic titles and labels\n\n### General Accessibility\n\n- Sufficient contrast between data elements and background\n- Text size minimum 10pt for labels, 12pt for titles\n- Avoid conveying information only through spatial position (add labels)\n- Consider printing: does the chart work in black and white?\n\n### Accessibility Checklist\n\nBefore sharing a visualization:\n- [ ] Chart works without color (patterns, labels, or line styles differentiate series)\n- [ ] Text is readable at standard zoom level\n- [ ] Title describes the insight, not just the data\n- [ ] Axes are labeled with units\n- [ ] Legend is clear and positioned without obscuring data\n- [ ] Data source and date range are noted\n",{"name":5,"tags":57,"tools":58,"source":59,"license":14,"description":7,"source_path":60,"source_commit":61},[],[],"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","data\u002Fskills\u002Fdata-visualization","8444efcd48f7012f09797778a36a33e73d0861f4","main","f7cd4595d0f8959822163e14f9787117765c931a","packages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdata-visualization",2,"https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind","https:\u002F\u002Fmonoes.github.io\u002Fmonomind\u002F","https:\u002F\u002Fgithub.com\u002Fmonoes","https:\u002F\u002Fmonoes.me","2026-11-10 01:53:48",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add monoes\u002Fmonomind --skill data-visualization",{"tool":77,"command":78},"bunx","bunx skills add monoes\u002Fmonomind --skill data-visualization",{"tool":80,"command":81},"pnpm","pnpm dlx skills add monoes\u002Fmonomind --skill data-visualization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdata-visualization\u002FSKILL.md",true,[85],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":15},"LICENSE.txt","LICENSE","许可证",11607,[91,117,149,174,195,222],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":116},"01M71PB3SHWKMNJM6MD65VX8D6","zk-steward","Org role guidance for a ZK steward: engineer zero-knowledge proof systems with circuit design, SNARK vs STARK choice and security review. This is zero-knowledge cryptography, not Zettelkasten note-taking.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fzk-steward\u002FSKILL.md",[],[98,99,100,101,102,103,50,49,104,105,106,107,108,109,110,111,112,113,114,115],"zk","zk steward","steward","zero-knowledge","engineer","choice","impact","query","snark","review","monomind","security review","stark","zettelkasten","cryptography","security","org","blockchain","2026-11-10 13:02:02",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":121,"licenseFileUrl":122,"sourceHtmlUrl":123,"categories":124,"keywords":131,"publishedAt":116},"01M71PB18SDG28WBKPKJNB814K","writing-plans","Use when you have a spec or requirements for a multi-step coding task and must write an implementation plan before touching code. Produces bite-sized TDD tasks with exact file paths, code and commands for an engineer with zero context.","MIT","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwriting-plans\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwriting-plans\u002FSKILL.md",[125,128],{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":129,"categoryName":130,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者",[132,133,134,102,135,136,46,137,105,138,139,140,141,142,143,144,145,146,147,148],"writing","writing plans","plans","superpowers","implementation plan","you","code","tasks","plan","product","write","commands","paths","suggest","coding","context","ZeRO",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":153,"sourceHtmlUrl":154,"categories":155,"keywords":159,"publishedAt":116},"01M71PAXFM488X9ARXK0T04TF5","write-spec","Write a feature spec or PRD from a problem statement or feature idea. Use when turning a vague idea or user request into a structured document, scoping a feature with goals and non-goals, defining success metrics and acceptance criteria, or breaking a big ask into a phased spec.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-spec\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-spec\u002FSKILL.md",[156],{"categoryNo":157,"categoryName":158,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000031","产品经理",[142,160,161,162,163,49,164,46,165,166,43,141,167,168,169,170,171,172,35,173],"write spec","spec","user request","problem","acceptance","ask","vague","request","scoping","idea","metrics","feature","problem statement","document",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":178,"sourceHtmlUrl":179,"categories":180,"keywords":182,"publishedAt":116},"01M71PASSZY800C0RPEARBS918","write-query","Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-query\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-query\u002FSKILL.md",[181],{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[105,142,183,184,37,185,49,35,46,186,187,188,189,43,190,191,192,193,194,32],"write query","postgres","snowflake","best practices","natural-language","with","multi","github","sql","https","syntax","plugins",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":207,"publishedAt":116},"01M71PAPTX0T3PF6ETFVR96SJJ","workflow-automation","Org role guidance for workflow automation: build and maintain CI\u002FCD definitions in GitHub Actions or equivalent: triggers, jobs, matrices, caching. Covers path filters, dependency caching, parallel jobs, timeouts and fail-fast ordering.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fworkflow-automation\u002FSKILL.md",[201,204],{"categoryNo":202,"categoryName":203,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":205,"categoryName":206,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[208,209,210,211,37,212,213,214,215,104,216,217,218,105,108,190,219,220,221,192],"Workflow Automation","automation","workflow","parallel","actions","ci","triggers","github actions","maintain","filters","caching","build","dependency","devops",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":226,"categories":227,"keywords":229,"publishedAt":116},"01M71PAM19Z1XTV9NPCFSE2MY8","workflow-architect","Org role guidance for a workflow architect: map full workflow trees for systems, user journeys and agents, covering every branch and failure. Covers discovering workflows from code, handoff contracts, timeouts, recovery paths and observable state.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fworkflow-architect\u002FSKILL.md",[228],{"categoryNo":205,"categoryName":206,"taxonomyType":21,"taxonomyTypeDesc":22},[210,230,231,232,233,234,235,37,236,237,138,238,239,240,108,190,241,242,192,243],"workflow architect","architect","trees","user journeys","branch","planning","map","workflows","architecture","state","leadership","recovery","operations","systems"]