Altairで宣言的可視化：コードをシンプルに 〜Google Colabハンズオン〜

本記事では、Pythonの可視化ライブラリ「Altair」を用いて、宣言的にインタラクティブなグラフを作る方法を紹介します。特に、手元の環境に依存せず、**Google Colab上で簡単に試せるハンズオン形式**で進めていきます。

---

## Altairとは
- **Vega/Vega-Lite**をバックエンドとしており、Python上で**宣言的**にグラフを作成できるライブラリ。
- **インタラクティブな機能**（範囲選択、マウスオーバーなど）をシンプルな記述で追加可能。
- 「どの軸に何を割り当てるか」を書くと、細かい描画はAltairが自動でやってくれるため、コードがスッキリしやすい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/96da2040-316b-1980-92ff-ebf4773f9934.png)

---

## 事前準備（Google Colab上での開発環境）

### 1. Google Colabを開く
1. [Google Colab](https://colab.research.google.com/)にアクセスします。
2. 新規ノートブックを作成します。

### 2. ライブラリのインストール
- Altairは通常、Colabにプリインストールされていますが、念のため下記コマンドでバージョン確認・インストールを行うと安心です。

```bash
!pip install altair==4.2.2  # 例として特定バージョンを指定
```

- 他に必要であれば、`pandas`などもインストール・アップグレードしておきます。

```bash
!pip install pandas --upgrade
```

### 3. Altair表示設定
- ColabでAltairを表示する場合、`colab`向けのレンダラーを有効化する方法がおすすめです。

```python
import altair as alt

alt.renderers.enable('colab')
```

- これで、インタラクティブグラフがColab上に直接表示されるようになります。

---

## ハンズオン１：シンプルな折れ線グラフ

### データ準備
まずはサンプル用に小さなデータセットを作成します。

```python
import pandas as pd

data = pd.DataFrame({
    'x': range(10),
    'y': [val**2 for val in range(10)],
    'category': ['A']*5 + ['B']*5
})
data
```

- `x`は0〜9
- `y`は`x`の二乗
- `category`は前半がA、後半がB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/31e99114-0711-3ebd-5479-0437daf9e466.png)


### Altairで可視化
上記データを使い、Altairで**「宣言的」**に折れ線グラフを作ってみましょう。

```python
import altair as alt

chart = alt.Chart(data).mark_line().encode(
    x='x',
    y='y',
    color='category'
)

chart
```

- `alt.Chart(data)`でデータを受け取り、`.mark_line()`で線グラフを指定。
- `.encode(...)`で軸と色分けを宣言的に設定します。
- 実行すると、AとBの2種類の線が描かれた折れ線グラフが、Google Colab上で直接表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0e15b5cc-3e9c-bd77-c08e-c01ae393da17.png)

---

## ハンズオン２：インタラクティブな範囲選択

Altairの強みは、**インタラクション機能**を簡単に追加できることです。ここでは、「ドラッグで範囲を選択 -> 選択範囲のみ別グラフに反映」という例を体験します。

### データ準備
少しデータポイントを増やしたものを用意します。

```python
import pandas as pd

data2 = pd.DataFrame({
    'x': range(50),
    'y': [val**1.5 for val in range(50)]
})
```

### 範囲選択用のオブジェクト作成
```python
brush = alt.selection(type='interval')
```
- `type='interval'`とすることで、ドラッグ操作による範囲指定を可能にします。

### グラフの作成
```python
# 上段グラフ（範囲選択ができる）
upper_chart = alt.Chart(data2).mark_line().encode(
    x='x',
    y='y'
).add_selection(
    brush  # このグラフでドラッグによる範囲選択を可能に
)

# 下段グラフ（選択範囲のみ表示）
lower_chart = alt.Chart(data2).mark_line().encode(
    x='x',
    y='y'
).transform_filter(
    brush  # 上段グラフの選択範囲のみ可視化
)

# 上下グラフを縦に並べる
interactive_charts = upper_chart & lower_chart
interactive_charts
```

- `brush`を上段グラフに追加(`.add_selection(brush)`)することで、範囲のドラッグ操作を有効化。
- 下段グラフで`.transform_filter(brush)`とすることで、「上段グラフのドラッグ操作で指定された範囲」だけが表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/935e538f-19e9-7b64-044f-c17ef49d1ba2.png)


### 実際に動かしてみる
1. 上段グラフ上でマウスをドラッグしてみてください。選択範囲がハイライトされます。  
2. すると、下段グラフにその範囲のデータだけがズーム表示されます。  
3. インタラクションを何度でもやり直せます。  

これが、Altairのインタラクティブな可視化の典型的な例です。

---

## 「宣言的」可視化のメリット

- **コードがシンプル**  
  X軸、Y軸、色分け、インタラクションなどを単純に「宣言」するだけで可視化が可能です。

- **可読性が高い**  
  視覚化したいデータと、その軸やスタイルが一目で分かるため、チーム開発や他者との共有もしやすいです。

- **拡張しやすい**  
  インタラクションの種類（範囲選択・クリック選択など）を増やしても、コードの変更が少なくて済みます。

- **バックエンド(Vega/Vega-Lite)の恩恵**  
  Web標準のVega/Vega-Liteを利用しているため、描画パフォーマンスや表現力が高く、HTMLベースでの共有が容易です。

---

## まとめ

- **Altair**を使うことで、**宣言的**に可視化を行い、**インタラクティブなグラフ**をシンプルなコードで実装できます。
- **Google Colab**なら、環境構築の手間が少なく、誰でもすぐに試すことが可能です。
- ぜひ実際に上記サンプルコードをコピー＆ペーストして動かしてみて、Altairの楽しさ・使いやすさを体感してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/d20a7abd-29e7-c315-cff4-d725e2384348.png)

---

## 参考リンク
- [Altair公式ドキュメント](https://altair-viz.github.io/)  
- [Vega-Lite公式ドキュメント](https://vega.github.io/vega-lite/)  
- [Altair - Qiita検索結果](https://qiita.com/tags/altair)

以上、Google Colabを利用したハンズオン形式でのAltair可視化チュートリアルでした。今後は応用例として、クリック選択でデータをハイライトしたり、複数のチャートを組み合わせるなど、さまざまな可視化に挑戦してみてください。