[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACKJT1GS0J80JWBZX7RTVX":3,"skill-same:01M6ACKJT1GS0J80JWBZX7RTVX":103},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":32,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6ACKJT1GS0J80JWBZX7RTVX","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.","Significant-Gravitas\u002Fskills-catalog","Significant-Gravitas","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130738209?v=4","01M6AC83EPDGBFN19MWYRREJD0","AutoGPT","01M6ACEY98TKHDWJH0B93PHNMG",2,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fdata-visualization\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fdata-visualization\u002FSKILL.md",[19,24,27],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":25,"categoryName":26,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":28,"categoryName":29,"taxonomyType":30,"taxonomyTypeDesc":31},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[33,34,35,36,37,38,39],"data visualization","visualization","design","python","github","accessibility","create","2026-11-10 10:12:30",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.\nuser-invocable: false\nlicense: Apache-2.0\nmetadata:\n  author: Anthropic\n  source: anthropics\u002Fknowledge-work-plugins\u002Fdata\u002Fskills\u002Fdata-visualization\n  source_url: https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002F1c7187c4fc17feefa6cde39517f12dae1249e6c4\u002Fdata\u002Fskills\u002Fdata-visualization\u002FSKILL.md\n  upstream-commit: 1c7187c4fc17feefa6cde39517f12dae1249e6c4\n  original-name: data-visualization\n  packaged-by: AutoGPT\n  packaged-on: '2026-09-25'\n---\n\n> Packaging adaptation by AutoGPT, 2026-09-25. Original authorship and licence are retained. Changes are limited to the recorded name, metadata and file references; see ATTRIBUTION.md in this skill package.\n\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","> Packaging adaptation by AutoGPT, 2026-09-25. Original authorship and licence are retained. Changes are limited to the recorded name, metadata and file references; see ATTRIBUTION.md in this skill package.\n\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",{"name":5,"license":15,"metadata":45,"description":7,"user-invocable":41},{"author":46,"source":47,"source_url":48,"packaged-by":12,"packaged-on":49,"original-name":5,"upstream-commit":50},"Anthropic","anthropics\u002Fknowledge-work-plugins\u002Fdata\u002Fskills\u002Fdata-visualization","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002F1c7187c4fc17feefa6cde39517f12dae1249e6c4\u002Fdata\u002Fskills\u002Fdata-visualization\u002FSKILL.md","2026-09-25","1c7187c4fc17feefa6cde39517f12dae1249e6c4","main","7ed3b73314d5186120e8d4006febfd7e1c92cf08","skills\u002Fdata-visualization",0,"https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas","agpt.co","2026-11-14 03:40:57",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add Significant-Gravitas\u002Fskills-catalog --skill data-visualization",{"tool":65,"command":66},"bunx","bunx skills add Significant-Gravitas\u002Fskills-catalog --skill data-visualization",{"tool":68,"command":69},"pnpm","pnpm dlx skills add Significant-Gravitas\u002Fskills-catalog --skill data-visualization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fdata-visualization\u002FSKILL.md",true,[73,79,83,87,91,95,99],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"ATTRIBUTION.md","REFERENCE","参考文档",4593,"https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fdata-visualization\u002FATTRIBUTION.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"behaviors.md",1478,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Favalonia-layout-zafiro\u002Fbehaviors.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"components.md",1429,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Favalonia-layout-zafiro\u002Fcomponents.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"containers.md",1560,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Favalonia-layout-zafiro\u002Fcontainers.md",{"path":92,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":93,"sourceHtmlUrl":94},"icons.md",1777,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Favalonia-layout-zafiro\u002Ficons.md",{"path":96,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":98,"sourceHtmlUrl":16},"LICENSE","许可证",11358,{"path":100,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":101,"sourceHtmlUrl":102},"themes.md",1864,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Favalonia-layout-zafiro\u002Fthemes.md",[104,117,141,151,165,183],{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":108,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":40},"01M6AD3S89TGF74S7MK4K5CGC7","workplace-memory-management","Two-tier memory system that makes Claude a true workplace collaborator. Decodes shorthand, acronyms, nicknames, and internal language so Claude understands requests like a colleague would. CLAUDE.md for working memory, memory\u002F directory for the full knowledge base.","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fworkplace-memory-management\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fworkplace-memory-management\u002FSKILL.md",[],[112,113,114,115,37,116],"workplace memory management","memory","plugins","https","directory",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":122,"sourceHtmlUrl":123,"categories":124,"keywords":134,"publishedAt":40},"01M6AD3F5X5DYW1BABD49BQKP8","website-seo-audit","Audit a website, investigate its real search opportunities, and deliver a short data-backed report on the few changes most likely to grow organic traffic that converts.","MIT","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fwebsite-seo-audit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fwebsite-seo-audit\u002FSKILL.md",[125,128,131],{"categoryNo":126,"categoryName":127,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":129,"categoryName":130,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":132,"categoryName":133,"taxonomyType":30,"taxonomyTypeDesc":31},"01JBSEEDCAT000000000000035","市场营销",[135,136,137,37,114,115,138,139,140],"website seo audit","audit","website","search","report","plugin",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":145,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":40},"01M6AD32RYMK03P50DM0T184NJ","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fverification-before-completion\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fverification-before-completion\u002FSKILL.md",[],[149,150,115,37],"verification before completion","verification",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":155,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":40},"01M6AD2WSQG7BGPXA7XP4DFZX8","vendor-evaluation","Evaluate a vendor — cost analysis, risk assessment, and recommendation. Use when reviewing a new vendor proposal, deciding whether to renew or replace a contract, comparing two vendors side-by-side, or building a TCO breakdown and negotiation points before procurement sign-off.","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fvendor-evaluation\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fvendor-evaluation\u002FSKILL.md",[],[159,160,114,115,161,162,163,37,164],"vendor evaluation","negotiation","assessment","risk assessment","cost analysis","review",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":169,"sourceHtmlUrl":170,"categories":171,"keywords":178,"publishedAt":40},"01M6AD2RBT6004C07RZRDSTA52","vendor-contract-status","Check the status of existing agreements with a vendor across all connected systems — CLM, CRM, email, and document storage — with gap analysis and upcoming deadlines. Use when onboarding or renewing a vendor, when you need a consolidated view of what's signed and what's missing (MSA, DPA, SOW), or when checking for approaching expirations and surviving obligations.","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fvendor-contract-status\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fvendor-contract-status\u002FSKILL.md",[172,175],{"categoryNo":173,"categoryName":174,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":176,"categoryName":177,"taxonomyType":30,"taxonomyTypeDesc":31},"01JBSEEDCAT000000000000037","律师与法务",[179,180,37,181,114,182,115],"vendor contract status","status","storage","onboarding",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":187,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":40},"01M6AD2KPNXN5CNS3CA4FRWT97","user-cohort-analysis","Perform cohort analysis on user engagement data — retention curves, feature adoption trends, and segment-level insights. Use when analyzing user retention by cohort, studying feature adoption over time, investigating churn patterns, or identifying engagement trends.","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fuser-cohort-analysis\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002Fskills-catalog\u002Fblob\u002Fmain\u002Fskills\u002Fuser-cohort-analysis\u002FSKILL.md",[190],{"categoryNo":28,"categoryName":29,"taxonomyType":30,"taxonomyTypeDesc":31},[192,193,115,37],"user cohort analysis","analytics"]