data-visualization
Pythonの matplotlib、seaborn、plotly を使って効果的なデータビジュアライゼーションを作成します。グラフの作成、データセットに適したチャートタイプの選定、出版品質の図表生成、アクセシビリティや配色理論などのデザイン原則の適用が必要な場面で活用してください。
description の原文を見る
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.
SKILL.md 本文
データビジュアライゼーション スキル
効果的なデータビジュアライゼーションを作成するためのチャート選択ガイダンス、Python ビジュアライゼーション コードパターン、設計原則、およびアクセシビリティに関する考慮事項。
チャート選択ガイド
データ関係別の選択
| 表示内容 | 最適なチャート | 代替案 |
|---|---|---|
| 時間経過による傾向 | 折れ線グラフ | 面グラフ(累積または構成を表示する場合) |
| カテゴリ全体での比較 | 縦棒グラフ | 横棒グラフ(多くのカテゴリ)、ロリポップチャート |
| ランキング | 横棒グラフ | ドットプロット、スロープチャート(2つの期間を比較) |
| 部分対全体の構成 | 積み上げ棒グラフ | ツリーマップ(階層的)、ワッフルチャート |
| 時間経過による構成 | 積み上げ面グラフ | 100% 積み上げ棒グラフ(比率に焦点) |
| 分布 | ヒストグラム | ボックスプロット(グループ比較)、バイオリンプロット、ストリッププロット |
| 相関関係(2変数) | 散布図 | バブルチャート(3番目の変数をサイズで追加) |
| 相関関係(多変数) | ヒートマップ(相関行列) | ペアプロット |
| 地理的パターン | コロプレスマップ | バブルマップ、ヘックスマップ |
| フロー/プロセス | サンキーダイアグラム | ファネルチャート(順序付けされた段階) |
| 関係ネットワーク | ネットワークグラフ | コードダイアグラム |
| パフォーマンス対目標 | ブレットチャート | ゲージ(単一 KPI のみ) |
| 複数の KPI を同時に | スモールマルチプル | 個別チャートを含むダッシュボード |
特定のチャートを使用しない場合
- 円グラフ: カテゴリが 6 未満で、正確な比率が相対的な比較より重要でない場合以外は避ける。人間は角度の比較が苦手です。代わりに棒グラフを使用してください。
- 3D チャート: 決して使用しないでください。認識を歪めて情報を追加しません。
- 二重軸チャート: 慎重に使用してください。相関を示唆して誤解を招く可能性があります。使用する場合は両方の軸をはっきりラベル付けしてください。
- 積み上げ棒グラフ(多くのカテゴリ): 中央のセグメントを比較するのが難しい。代わりにスモールマルチプルまたはグループ化棒グラフを使用してください。
- ドーナツチャート: 円グラフより少し良いですが、基本的な問題は同じです。最大でも単一 KPI ディスプレイに使用してください。
Python ビジュアライゼーション コードパターン
セットアップとスタイル
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import seaborn as sns
import pandas as pd
import numpy as np
# Professional style setup
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams.update({
'figure.figsize': (10, 6),
'figure.dpi': 150,
'font.size': 11,
'axes.titlesize': 14,
'axes.titleweight': 'bold',
'axes.labelsize': 11,
'xtick.labelsize': 10,
'ytick.labelsize': 10,
'legend.fontsize': 10,
'figure.titlesize': 16,
})
# Colorblind-friendly palettes
PALETTE_CATEGORICAL = ['#4C72B0', '#DD8452', '#55A868', '#C44E52', '#8172B3', '#937860']
PALETTE_SEQUENTIAL = 'YlOrRd'
PALETTE_DIVERGING = 'RdBu_r'
折れ線グラフ(時系列)
fig, ax = plt.subplots(figsize=(10, 6))
for label, group in df.groupby('category'):
ax.plot(group['date'], group['value'], label=label, linewidth=2)
ax.set_title('Metric Trend by Category', fontweight='bold')
ax.set_xlabel('Date')
ax.set_ylabel('Value')
ax.legend(loc='upper left', frameon=True)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Format dates on x-axis
fig.autofmt_xdate()
plt.tight_layout()
plt.savefig('trend_chart.png', dpi=150, bbox_inches='tight')
棒グラフ(比較)
fig, ax = plt.subplots(figsize=(10, 6))
# Sort by value for easy reading
df_sorted = df.sort_values('metric', ascending=True)
bars = ax.barh(df_sorted['category'], df_sorted['metric'], color=PALETTE_CATEGORICAL[0])
# Add value labels
for bar in bars:
width = bar.get_width()
ax.text(width + 0.5, bar.get_y() + bar.get_height()/2,
f'{width:,.0f}', ha='left', va='center', fontsize=10)
ax.set_title('Metric by Category (Ranked)', fontweight='bold')
ax.set_xlabel('Metric Value')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')
ヒストグラム(分布)
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(df['value'], bins=30, color=PALETTE_CATEGORICAL[0], edgecolor='white', alpha=0.8)
# Add mean and median lines
mean_val = df['value'].mean()
median_val = df['value'].median()
ax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:,.1f}')
ax.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:,.1f}')
ax.set_title('Distribution of Values', fontweight='bold')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('histogram.png', dpi=150, bbox_inches='tight')
ヒートマップ
fig, ax = plt.subplots(figsize=(10, 8))
# Pivot data for heatmap format
pivot = df.pivot_table(index='row_dim', columns='col_dim', values='metric', aggfunc='sum')
sns.heatmap(pivot, annot=True, fmt=',.0f', cmap='YlOrRd',
linewidths=0.5, ax=ax, cbar_kws={'label': 'Metric Value'})
ax.set_title('Metric by Row Dimension and Column Dimension', fontweight='bold')
ax.set_xlabel('Column Dimension')
ax.set_ylabel('Row Dimension')
plt.tight_layout()
plt.savefig('heatmap.png', dpi=150, bbox_inches='tight')
スモールマルチプル
categories = df['category'].unique()
n_cats = len(categories)
n_cols = min(3, n_cats)
n_rows = (n_cats + n_cols - 1) // n_cols
fig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows), sharex=True, sharey=True)
axes = axes.flatten() if n_cats > 1 else [axes]
for i, cat in enumerate(categories):
ax = axes[i]
subset = df[df['category'] == cat]
ax.plot(subset['date'], subset['value'], color=PALETTE_CATEGORICAL[i % len(PALETTE_CATEGORICAL)])
ax.set_title(cat, fontsize=12)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Hide empty subplots
for j in range(i+1, len(axes)):
axes[j].set_visible(False)
fig.suptitle('Trends by Category', fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.savefig('small_multiples.png', dpi=150, bbox_inches='tight')
数値フォーマット ヘルパー
def format_number(val, format_type='number'):
"""Format numbers for chart labels."""
if format_type == 'currency':
if abs(val) >= 1e9:
return f'${val/1e9:.1f}B'
elif abs(val) >= 1e6:
return f'${val/1e6:.1f}M'
elif abs(val) >= 1e3:
return f'${val/1e3:.1f}K'
else:
return f'${val:,.0f}'
elif format_type == 'percent':
return f'{val:.1f}%'
elif format_type == 'number':
if abs(val) >= 1e9:
return f'{val/1e9:.1f}B'
elif abs(val) >= 1e6:
return f'{val/1e6:.1f}M'
elif abs(val) >= 1e3:
return f'{val/1e3:.1f}K'
else:
return f'{val:,.0f}'
return str(val)
# Usage with axis formatter
ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, p: format_number(x, 'currency')))
Plotly によるインタラクティブチャート
import plotly.express as px
import plotly.graph_objects as go
# Simple interactive line chart
fig = px.line(df, x='date', y='value', color='category',
title='Interactive Metric Trend',
labels={'value': 'Metric Value', 'date': 'Date'})
fig.update_layout(hovermode='x unified')
fig.write_html('interactive_chart.html')
fig.show()
# Interactive scatter with hover data
fig = px.scatter(df, x='metric_a', y='metric_b', color='category',
size='size_metric', hover_data=['name', 'detail_field'],
title='Correlation Analysis')
fig.show()
設計原則
色
- 目的を持って色を使用する: 色はデータをエンコードするべきで、装飾的であるべきではありません
- ストーリーをハイライトする: 主な洞察には明るいアクセント色を使用し、他はすべてグレー化します
- 順序付きデータ: 単一色のグラデーション(薄い色から濃い色)を使用します
- 発散データ: 有意なセンターポイントを持つデータに対して、中立的な中点を持つ 2 色のグラデーションを使用します
- カテゴリカルデータ: 異なる色相を使用し、混乱するようになる前に最大 6~8 色です
- 赤/緑のみを避ける: 男性の 8% が赤緑色盲です。主要なペアとして青/オレンジを使用してください
タイポグラフィ
- タイトルは洞察を述べます: 「Revenue by Month」より「Revenue grew 23% YoY」のほうが良い
- サブタイトルは文脈を追加します: 日付範囲、適用されたフィルター、データソース
- 軸ラベルは読みやすい: 避けられない場合を除き、90 度回転させないでください。代わりに短縮またはラップしてください
- データラベルは正確さを追加します: すべての棒ではなく、主要なポイントに使用します
- 注釈がハイライトします: テキスト注釈で特定のポイントを呼び出します
レイアウト
- チャートジャンクを削減する: 情報を伝えない格子線、境界線、背景を削除します
- 意味的にソート: カテゴリを値でソート(アルファベット順ではなく)、自然な順序がない場合(月、段階)
- 適切なアスペクト比: 時系列は高さより横長(3:1 から 2:1)です。比較はより正方形になります
- ホワイトスペースは良い: チャートを一緒に詰め込まない。各ビジュアライゼーションに息をする余地を与えてください
正確さ
- 棒グラフはゼロから始まる: 常に。95 から 100 の棒は 5% の差を誇張します
- 折れ線グラフはゼロ以外のベースラインを持つことができます: 変動の範囲が意味を持つ場合
- パネル全体で一貫した尺度: 複数のチャートを比較する場合、同じ軸の範囲を使用します
- 不確実性を表示する: データが不確実な場合は、エラーバー、信頼区間、または範囲を表示します
- 軸にラベル付けする: 読者が数値の意味を推測させないでください
アクセシビリティに関する考慮事項
色盲
- 色だけに頼ってデータシリーズを区別しない
- パターン塗りつぶし、異なる線スタイル(実線、破線、点線)、または直接ラベルを追加します
- 色覚異常シミュレーターでテストしてください(例:Coblis、Sim Daltonism)
- 色盲に優しいパレットを使用してください:
sns.color_palette("colorblind")
スクリーンリーダー
- チャートの主な調査結果を説明する代替テキストを含める
- ビジュアライゼーションと並行してデータテーブルの代替を提供します
- セマンティックタイトルとラベルを使用してください
一般的なアクセシビリティ
- データ要素と背景の間に十分なコントラスト
- ラベルの最小テキストサイズ 10pt、タイトル 12pt
- 空間的位置のみを通じた情報の伝達を避ける(ラベルを追加)
- 印刷を検討する: チャートは白黒で機能していますか?
アクセシビリティ チェックリスト
ビジュアライゼーションを共有する前に:
- チャートは色なしで機能する(パターン、ラベル、または線スタイルはシリーズを区別します)
- テキストは標準ズームレベルで読みやすい
- タイトルはデータを説明するだけでなく、洞察を説明する
- 軸にはユニットでラベルが付けられている
- 凡例は明確で、データを隠さない位置に配置されている
- データソースと日付範囲が記載されている
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- anthropics
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/anthropics/knowledge-work-plugins / ライセンス: Apache-2.0
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。