matplotlibでは,plt.scatterで複数のデータをプロットする場合,勝手に色を変えてくれる.けれども,モノクロの図が欲しいときなど,色ではなく,マーカーを変えたいときがある.マーカーはある程度覚えているけれど,たとえばこんな感じでリストを手打ちするのは大変.

markers = ['.', 'o', 'x', ..., 'v']

また,バージョンにより使えなくなるマーカー (ないと思うが) や,新たに使えるようになるマーカーが出てきたときに手動で書き換える必要が出てきてしまう.

そこで,それらの一覧を取得する方法を調べたのでその方法をメモする.

環境

ProductName:	macOS
ProductVersion:	12.0.1
BuildVersion:	21A559
python=='3.8.8'
matplotlib=='3.3.4'


やり方

めちゃくちゃ簡単.それを収録している変数がライブラリ内に存在する.

from matplotlib.lines import Line2D
markers = Line2D.markers

これは辞書で取得できる.この変数を標準出力に出力すると以下の結果が得られる.

print(marker)
{
    '.': 'point',
    ',': 'pixel',
    'o': 'circle',
    'v': 'triangle_down',
    '^': 'triangle_up',
    '<': 'triangle_left',
    '>': 'triangle_right',
    '1': 'tri_down',
    '2': 'tri_up',
    '3': 'tri_left',
    '4': 'tri_right',
    '8': 'octagon',
    's': 'square',
    'p': 'pentagon',
    '*': 'star',
    'h': 'hexagon1',
    'H': 'hexagon2',
    '+': 'plus',
    'x': 'x',
    'D': 'diamond',
    'd': 'thin_diamond',
    '|': 'vline',
    '_': 'hline',
    'P': 'plus_filled',
    'X': 'x_filled',
    0: 'tickleft',
    1: 'tickright',
    2: 'tickup',
    3: 'tickdown',
    4: 'caretleft',
    5: 'caretright',
    6: 'caretup',
    7: 'caretdown',
    8: 'caretleftbase',
    9: 'caretrightbase',
    10: 'caretupbase',
    11: 'caretdownbase',
    'None': 'nothing',
    None: 'nothing',
    ' ': 'nothing',
    '': 'nothing'
}

もしかしたら一覧が自分の実行した時とは異なる可能性があるため,自分の環境で実行することをおすすめする.

ちなみに,公式サイトにまとめられているマーカー一覧はこちら(公式ドキュメント).

具体的な使い方

最初に書いた,複数データをplt.scatterするときに,色ではなく,マーカーを変えるやり方.

markerや色を指定しない場合

たとえば次に示すコードを実行する.

# import modules
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(facecolor='w') # 背景色を白に
# seed
np.random.seed(334) # 再現性を確保するために固定値を使う
# plot
for i, (x, y) in enumerate(np.random.rand(10, 2, 5)):   # 0~1の範囲の10種類各5座標のデータを作成
    ax.scatter(x, y, label=i)   # 散布図を描画
# legend
ax.legend(bbox_to_anchor=(1.05, 1)) # 凡例を表示
# layout
lim_ = (-0.05, 1.05)
ax.set_xlim(*lim_) # x軸の範囲を設定
ax.set_ylim(*lim_) # y軸の範囲を設定
ax.set_aspect('equal') # 範囲が同じなので,正方形にする
fig.tight_layout()  # 自動調整

そして得られた画像がこれ.
colorful-scatter-example

markerだけを変える場合

#plotの部分だけを変更した以下のコードを実行する.辞書をfor文で,回すとkeyが取得できるのでこんな書き方ができる.

# import modules
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D

fig, ax = plt.subplots(facecolor='w') # 背景色を白に
# seed
np.random.seed(334) # 再現性を確保するために固定値を使う
# plot
for i, ((x, y), marker) in enumerate(zip(np.random.rand(10, 2, 5), Line2D.markers)):   # 0~1の範囲の10種類各5座標のデータを作成
    ax.scatter(x, y, c='black', marker=marker, label=i)   # 散布図を描画
# legend
ax.legend(bbox_to_anchor=(1.05, 1)) # 凡例を表示
# layout
lim_ = (-0.05, 1.05)
ax.set_xlim(*lim_) # x軸の範囲を設定
ax.set_ylim(*lim_) # y軸の範囲を設定
ax.set_aspect('equal') # 範囲が同じなので,正方形にする
fig.tight_layout()  # 自動調整

そして得られた画像がこれ.
monochrome-scatter-example

コメント

白黒画像は論文などでも使うことがあるので,やり方を覚えておくといいと思い,かつ日本語で検索して見つからなかったので執筆した.
例が画像をきれいにしようと思い,レイアウトに関する不要なコードもかなり書いたのでわかりづらいかもしれないが,ご容赦いただきたい.

あとは,facecolor='None' (白抜き) やfacecolor='white', facecolor='black'などを入れたり入れなかったり,みたいなコードを実装すればよりバリエーションが加えられそうと思った.

参考