マーカーを使った Matplotlib のビジュアライゼーションのカスタマイズ

MatplotlibMatplotlibBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Matplotlibは、チャート、グラフ、プロットなどのビジュアライゼーションを作成するために使用される人気のあるPythonライブラリです。Matplotlibの重要なコンポーネントの1つはマーカーで、これはプロット上のデータポイントを表すために使用されます。マーカーはさまざまな形状、サイズ、スタイルがあり、特定のデータセットに合うようにカスタマイズすることができます。この実験では、Matplotlibマーカーを使用してデータを効果的に伝えるカスタムビジュアライゼーションを作成する方法を学びます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

時々、Jupyter Notebookが読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

塗りつぶされていないマーカー

塗りつぶされていないマーカーは単色です。次のコードは、塗りつぶされていないマーカーを作成する方法を示しています。

unfilled_markers = [m for m, func in Line2D.markers.items()
                    if func!= 'nothing' and m not in Line2D.filled_markers]

for ax, markers in zip(axs, split_list(unfilled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

塗りつぶされたマーカー

塗りつぶされたマーカーは、塗りつぶされていないマーカーとは逆です。次のコードは、塗りつぶされたマーカーを作成する方法を示しています。

fig, axs = plt.subplots(ncols=2)
fig.suptitle('Filled markers', fontsize=14)
for ax, markers in zip(axs, split_list(Line2D.filled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

マーカーの塗りつぶしスタイル

塗りつぶされたマーカーの枠線色と塗りつぶし色は、それぞれ別々に指定できます。また、fillstyleを設定することで、塗りつぶされていない、完全に塗りつぶされた、または様々な方向に半分だけ塗りつぶされたスタイルに設定できます。半分だけ塗りつぶされたスタイルでは、2番目の塗りつぶし色としてmarkerfacecoloraltが使用されます。次のコードは、マーカーの塗りつぶしスタイルを作成する方法を示しています。

fig, ax = plt.subplots()
fig.suptitle('Marker fillstyle', fontsize=14)
fig.subplots_adjust(left=0.4)

filled_marker_style = dict(marker='o', linestyle=':', markersize=15,
                           color='darkgrey',
                           markerfacecolor='tab:blue',
                           markerfacecoloralt='lightsteelblue',
                           markeredgecolor='brown')

for y, fill_style in enumerate(Line2D.fillStyles):
    ax.text(-0.5, y, repr(fill_style), **text_style)
    ax.plot([y] * 3, fillstyle=fill_style, **filled_marker_style)
format_axes(ax)

TeX シンボルから作成されたマーカー

カスタムマーカーシンボル(例えば、"\u266B")を使用するには、:ref:MathText <mathtext> を使います。STIX フォントシンボルの概要については、STIX フォントテーブル <http://www.stixfonts.org/allGlyphs.html>_ を参照してください。また、:doc:/gallery/text_labels_and_annotations/stix_fonts_demo も参照してください。

fig, ax = plt.subplots()
fig.suptitle('Mathtext markers', fontsize=14)
fig.subplots_adjust(left=0.4)

marker_style.update(markeredgecolor="none", markersize=15)
markers = ["$1$", r"$\frac{1}{2}$", "$f$", "$\u266B$", r"$\mathcal{A}$"]

for y, marker in enumerate(markers):
    ## Escape dollars so that the text is written "as is", not as mathtext.
    ax.text(-0.5, y, repr(marker).replace("$", r"\$"), **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

パスから作成されたマーカー

任意の ~.path.Path をマーカーとして使用できます。次の例では、2つの単純なパス starcircle と、切り抜きされた星がある円のより精巧なパスを示しています。

import numpy as np

import matplotlib.path as mpath

star = mpath.Path.unit_regular_star(6)
circle = mpath.Path.unit_circle()
## concatenate the circle with an internal cutout of the star
cut_star = mpath.Path(
    vertices=np.concatenate([circle.vertices, star.vertices[::-1,...]]),
    codes=np.concatenate([circle.codes, star.codes]))

fig, ax = plt.subplots()
fig.suptitle('Path markers', fontsize=14)
fig.subplots_adjust(left=0.4)

markers = {'star': star, 'circle': circle, 'cut_star': cut_star}

for y, (name, marker) in enumerate(markers.items()):
    ax.text(-0.5, y, name, **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

変換を用いた高度なマーカーの変更

マーカーは、MarkerStyle コンストラクタに変換を渡すことで変更できます。次の例は、与えられた回転をいくつかのマーカー形状に適用する方法を示しています。

common_style = {k: v for k, v in filled_marker_style.items() if k!= 'marker'}
angles = [0, 10, 20, 30, 45, 60, 90]

fig, ax = plt.subplots()
fig.suptitle('Rotated markers', fontsize=14)

ax.text(-0.5, 0, 'Filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 0, marker=MarkerStyle('o', 'left', t), **common_style)

ax.text(-0.5, 1, 'Un-filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 1, marker=MarkerStyle('1', 'left', t), **common_style)

ax.text(-0.5, 2, 'Equation marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    eq = r'$\frac{1}{x}$'
    ax.plot(x, 2, marker=MarkerStyle(eq, 'left', t), **common_style)

for x, theta in enumerate(angles):
    ax.text(x, 2.5, f"{theta}°", horizontalalignment="center")
format_axes(ax)

fig.tight_layout()

マーカーのキャップスタイルとジョインスタイルの設定

マーカーにはデフォルトのキャップとジョインスタイルがありますが、MarkerStyle を作成する際にこれらをカスタマイズすることができます。

from matplotlib.markers import CapStyle, JoinStyle

marker_inner = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='brown',
                    markeredgewidth=8,
                    )

marker_outer = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='white',
                    markeredgewidth=1,
                    )

fig, ax = plt.subplots()
fig.suptitle('Marker CapStyle', fontsize=14)
fig.subplots_adjust(left=0.1)

for y, cap_style in enumerate(CapStyle):
    ax.text(-0.5, y, cap_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('1', transform=t, capstyle=cap_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.plot(x, y, marker=m, **marker_outer)
        ax.text(x, len(CapStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

ジョインスタイルの変更

マーカーのジョインスタイルも同様の方法で変更することができます。

fig, ax = plt.subplots()
fig.suptitle('Marker JoinStyle', fontsize=14)
fig.subplots_adjust(left=0.05)

for y, join_style in enumerate(JoinStyle):
    ax.text(-0.5, y, join_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('*', transform=t, joinstyle=join_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.text(x, len(JoinStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

plt.show()

まとめ

この実験では、Matplotlib のマーカーを使ってカスタムのビジュアライゼーションを作成する方法を学びました。具体的には、未塗りと塗りつぶしたマーカーの作成方法、マーカーの塗りつぶしスタイル、TeX シンボルから作成されたマーカー、パスから作成されたマーカー、変換を用いた高度なマーカーの変更方法、およびマーカーのキャップスタイルとジョインスタイルの設定方法を学びました。これらの技術を使うことで、データを明確かつ正確に伝える効果的なビジュアライゼーションを作成することができます。