複数の条件に基づいたカラーとマーカーの設定方法

# 複数の条件に基づいたカラーとマーカーの設定方法

データのプロットにおいて、条件に応じて異なるカラーやマーカーを適用することで、データのパターンや特性を視覚的に強調することができます。ここでは、PythonのMatplotlibを使用して、複数の条件に基づいてカラーやマーカーを変更するさまざまな方法を紹介します。

---

## 目次

1. `numpy.where`を使用する方法
2. リスト内包表記を使用する方法
3. カスタム関数を使用する方法

---

## 1. `numpy.where`を使用する方法

`numpy.where`や`numpy.select`を使用すると、条件に基づいてカラーやマーカーを効率的に指定できます。以下の例では、条件に応じて異なるカラーとマーカーを設定しています。

```python
import numpy as np
import matplotlib.pyplot as plt

# ランダムなデータ生成
x = np.random.rand(100)
y = np.random.rand(100)

# 条件リスト（条件, 色, マーカー）
conditions = [
    (x < 0.3, 'red', 'o'),
    ((x >= 0.3) & (x < 0.7) & (y < 0.5), 'blue', 's'),
    ((x >= 0.7) | (y >= 0.5), 'green', '^')
]

# 条件に基づいたカラーとマーカーの選択
colors = np.select([c[0] for c in conditions], [c[1] for c in conditions], default='gray')
markers = np.select([c[0] for c in conditions], [c[2] for c in conditions], default='x')

# 各条件に基づいてプロット
for color, marker in zip(np.unique(colors), np.unique(markers)):
    mask = (colors == color) & (markers == marker)
    plt.scatter(x[mask], y[mask], c=color, marker=marker, label=f'{color} {marker}')

plt.legend()
plt.show()
```

**ポイント**:
- `np.select`を使用することで、複数の条件に基づいた色とマーカーを効率的に選択できます。
- データポイントが多い場合に有効です【1】【3】。

---

## 2. リスト内包表記を使用する方法

リスト内包表記を使うと、条件に応じた色とマーカーを直接リストに格納でき、少ないデータセットやシンプルな条件で便利です。

```python
# 条件に基づいたカラーとマーカーをリスト内包表記で設定
colors = ['red' if xi < 0.3 else 'blue' if xi < 0.7 and yi < 0.5 else 'green' for xi, yi in zip(x, y)]
markers = ['o' if xi < 0.3 else 's' if xi < 0.7 and yi < 0.5 else '^' for xi, yi in zip(x, y)]

# 各条件に基づいてプロット
for color, marker in set(zip(colors, markers)):
    mask = np.array([(c == color) and (m == marker) for c, m in zip(colors, markers)])
    plt.scatter(x[mask], y[mask], c=color, marker=marker, label=f'{color} {marker}')

plt.legend()
plt.show()
```

**ポイント**:
- シンプルな条件の場合に適しています。
- `set(zip(colors, markers))` を使ってユニークなカラー・マーカーの組み合わせを取得しています【2】。

---

## 3. カスタム関数を使用する方法

カスタム関数を定義することで、より複雑な条件や柔軟な処理を行うことができます。例えば、`x` と `y` の値に基づいてカラーとマーカーを返す関数を作成することが可能です。

```python
# カスタム関数によるカラーとマーカーの設定
def get_color_and_marker(x, y):
    if x < 0.3:
        return 'red', 'o'
    elif x < 0.7 and y < 0.5:
        return 'blue', 's'
    else:
        return 'green', '^'

# 条件に基づいたカラーとマーカーを取得
colors, markers = zip(*[get_color_and_marker(xi, yi) for xi, yi in zip(x, y)])

# 各条件に基づいてプロット
for color, marker in set(zip(colors, markers)):
    mask = np.array([(c == color) and (m == marker) for c, m in zip(colors, markers)])
    plt.scatter(x[mask], y[mask], c=color, marker=marker, label=f'{color} {marker}')

plt.legend()
plt.show()
```

**ポイント**:
- 複雑な条件を適用したい場合や、条件に応じて柔軟にカラーやマーカーを設定したい場合に適しています。
- 条件が増える場合でも関数内で整理でき、管理しやすい方法です【4】。

---

## まとめ

条件に応じてプロットのカラーやマーカーを変更する方法を紹介しました。以下の方法を使用することで、データに応じた柔軟な表示が可能になります。

- **`numpy.where`や`numpy.select`を使用**: 大量のデータや効率的な処理に最適。
- **リスト内包表記**: 小規模なデータセットやシンプルな条件に適している。
- **カスタム関数**: 複雑な条件や追加のロジックが必要な場合に効果的。

各方法にはそれぞれの特長があるため、データの規模や条件の複雑さに応じて適切な方法を選択し、視覚的にわかりやすいプロットを作成しましょう。

---

## 参考文献

1. GeeksforGeeks, *Mark Different Color Points on Matplotlib*. Retrieved from [GeeksforGeeks](https://www.geeksforgeeks.org/mark-different-color-points-on-matplotlib/)
2. E2E Machine Learning, *Marking Points with Different Colors and Markers in Matplotlib*. Retrieved from [E2E Machine Learning](https://e2eml.school/matplotlib_points.html)
3. How2Matplotlib, *Color Points Based on Conditions in Matplotlib*. Retrieved from [How2Matplotlib](https://how2matplotlib.com/mark-different-color-points-on-matplotlib.html)
4. Stack Overflow, *Specify Color Points Depending on Conditions*. Retrieved from [Stack Overflow](https://stackoverflow.com/questions/40803570/specify-color-points-depending-on-conditions)
5. AI-inter1, *Pythonで散布図をプロットする方法*. Retrieved from [AI-inter1](https://ai-inter1.com/python-scatterplot/)

これらの方法を活用して、データの条件に応じた効果的な可視化に挑戦してみてください。