Pynote

Python、機械学習、画像処理について

matplotlib - scatter で散布図を作成する方法について

基本的な使い方

import matplotlib.pyplot as plt
import numpy as np

x, y = np.random.rand(2, 100)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(x, y)

plt.show()


点の大きさを設定する。

x, y = np.random.rand(2, 100)
size = np.random.uniform(10, 200, len(x))

fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(10, 5))
ax1.set_title('s=<scalar>')
ax1.scatter(x, y, s=10)

ax2.set_title('s=<array_like>')
ax2.scatter(x, y, s=size)

plt.show()


点の色を設定する。

  • scalar: すべての点を色に設定する。
  • sequence of color: 点ごとに色を設定する。
  • sequence: この値を元にカラーマップを使用して色を決定する。
x, y = np.random.rand(2, 100)

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(10, 10))

x, y = np.random.rand(2, 100)
edgecolors = np.random.rand(len(x), 3)

ax1.set_title('edgecolors=<color>')
ax1.scatter(x, y, c='r')

colors = np.random.choice(['r', 'g', 'b'], len(x))
ax2.set_title('edgecolors=<sequence of color>')
ax2.scatter(x, y, c=colors)

colors = np.random.rand(len(x), 3)
ax3.set_title('edgecolors=<sequence of color>')
ax3.scatter(x, y, c=colors)

colors = np.random.rand(len(x), 4)
ax4.set_title('edgecolors=<sequence of color>')
ax4.scatter(x, y, c=colors)

plt.show()

数値の配列を渡した場合、カラーマップに従い、色が決まる。
以下のようなラベル付きの点を描画する際にラベルの値をそのまま渡してあげればよい。

from sklearn.datasets.samples_generator import make_blobs
data, labels = make_blobs(n_samples=100, centers=3, n_features=2,
                          cluster_std=3, random_state=42)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(data[:, 0], data[:, 1], c=labels)

plt.show()


点の種類を設定する。

x, y = np.random.rand(2, 100)
colors = np.random.rand(len(x), 4)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(x, y, s=50, marker='+')

plt.show()


カラーマップを設定する。

from sklearn.datasets.samples_generator import make_blobs
data, labels = make_blobs(n_samples=100, centers=3, n_features=2,
                          cluster_std=3, random_state=42)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(data[:, 0], data[:, 1], c=labels, cmap='cool')

plt.show()


透過度を設定する。

x, y = np.random.rand(2, 100)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(x, y, alpha=0.5)

plt.show()


点の枠線の太さを設定する。

  • scalar: すべての点の枠線を同じ太さに設定する。
  • array_like: 点ごとに枠線の太さを設定する。
fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(10, 5))

x, y = np.random.rand(2, 100)

ax1.set_title('linewidths=<scalar>')
ax1.scatter(x, y, s=100, linewidths=2, edgecolors='r')

linewidths = np.random.uniform(0.3, 1, len(x))
ax2.set_title('linewidths=<array_like>')
ax2.scatter(x, y, s=100, linewidths=linewidths, edgecolors='r')

plt.show()


点の枠線の色を設定する。

  • color: すべての点の枠線を同じ色に設定する。
  • sequence of color: 点ごとに枠線の色を設定する。
  • 'face': 点の色と枠線の色を同じにする。
  • 'none': 枠線なし
fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(10, 10))

x, y = np.random.rand(2, 100)
edgecolors = np.random.rand(len(x), 3)

ax1.set_title('edgecolors=<color>')
ax1.scatter(x, y, s=100, linewidths=2, edgecolors='r')

ax2.set_title('edgecolors=<sequence of color>')
ax2.scatter(x, y, s=100, linewidths=linewidths, edgecolors=edgecolors)

ax3.set_title("edgecolors='face'")
ax3.scatter(x, y, s=100, linewidths=linewidths, edgecolors='face')

ax4.set_title("edgecolors='none'")
ax4.scatter(x, y, s=100, linewidths=linewidths, edgecolors='none')

plt.show()