matplotlibで散布図を作成するための全設定

matplotlibの散布図

matplotlibで散布図を作成するPythonスクリプトを紹介します。このスクリプトには散布図に関係する設定項目を全て詰め込みました。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import japanize_matplotlib


def generate_scatter_plot_sample():
  """
  matplotlibで散布図を生成するサンプル。
  備忘録として、主要な設定項目を全て活用する。
  pyplotではなくAxesを使用する。
  """

  # 可視化するデータのサンプル

  # 氏名
  name_dict = {
    "1年1組": ["池田", "佐藤", "高橋", "松本"],
    "1年2組": ["加藤", "鈴木", "中村"],
  }

  # 成績
  japanese_score_dict = {
    "1年1組": [82, 44, 78, 63],
    "1年2組": [67, 94, 54],
  }
  math_score_dict = {
    "1年1組": [78, 95, 62, 43],
    "1年2組": [81, 72, 69],
  }

  # 点の色
  color_dict = {
    "1年1組": "#FF9000FF",
    "1年2組": "#00DD33FF"
  }

  # FigureおよびAxesの生成
  fig, ax = plt.subplots(
    facecolor="#FFFFFFFF",  # 背景色
    figsize=(8, 8),  # 画像のサイズ
  )

  # クラスごとに描画
  for cls in ["1年1組", "1年2組"]:
    # clsのデータを一時保存
    name_list = name_dict[cls]
    japanese_score_list = japanese_score_dict[cls]
    math_score_list = math_score_dict[cls]
    color = color_dict[cls]

    # 描画
    ax.scatter(
      x=japanese_score_list,  # 横軸の値
      y=math_score_list,  # 縦軸の値
      s=100,  # 点のサイズ
      color=color,  # 点の色
      linewidth=1,  # 点の枠線の太さ
      edgecolors="#000000FF",  # 点の枠線の色
      label=cls,  # 凡例のラベル
    )

    # 点の上に氏名を書き込み
    for i, name in enumerate(name_list):
      x = japanese_score_list[i]
      y = math_score_list[i]
      ax.annotate(
        text=name,  # 書き込む値
        xy=(x, y),  # 位置
        xytext=(0, 8),  # テキスト位置の補正
        textcoords="offset points",
        ha='center',
        va='bottom',
        fontsize=14,  # フォントサイズ
        color="#505050FF",  # 文字色
      )

  # 60点以下は補習として、補習無し範囲を明示

  # グラフに四角形を追加
  ax.add_patch(
     patches.Rectangle(
        (60, 60),  # 四角の左下座標(データと同じ単位)
        100,  # 幅(横軸のデータと同じ単位)
        100,  # 高さ(縦軸のデータと同じ単位)
        linewidth=2,  # 線の太さ
        edgecolor="green",  # 線の色
        facecolor="#00FF0020",  # 塗り潰しの色
        fill=True,  # 塗り潰しするか
     ))

  # 四角形(補習無し領域)の説明を記入
  ax.text(
    s="補習無し",  # 書き込むテキスト
    x=80,  # 横軸の座標
    y=95,  # 縦軸の座標
    size=16,  # 文字のサイズ
    color="green",  # 文字の色
  )

  # グラフ領域の背景色を設定
  ax.set_facecolor(
    color="#F0F0F0FF",  # 背景色
  )

  # グラフのタイトルを設定
  ax.set_title(
    label="1年生の期末テストの点数",  # 文字列
    fontsize=20,  # フォントサイズ
    color="#505050FF",  # 文字色
  )

  # 横軸のラベルを設定
  ax.set_xlabel(
    xlabel="国語",  # 横軸の文字列
    fontsize=14,  # フォントサイズ
    color="#505050FF",  # 文字色
    rotation=0,  # ラベルの回転角度
  )

  # 縦軸のラベルを設定
  ax.set_ylabel(
    ylabel="数学",  # 縦軸の文字列
    fontsize=14,  # フォントサイズ
    color="#505050FF",  # 文字色
    rotation=90,  # ラベルの回転角度
  )

  # 横軸の目盛ラベルのパラメータを設定
  ax.tick_params(
    axis="x",  # パラメータを変更する軸
    rotation=45,  # ラベルの回転角度
    labelcolor="#505050FF",  # 文字色
  )

  # 縦軸の目盛ラベルのパラメータを設定
  ax.tick_params(
    axis="y",  # パラメータを変更する軸
    labelcolor="#505050FF",  # 文字色
  )

  # 横軸の範囲を指定
  ax.set_xlim(
    left=30,  # 下限
    right=100,  # 上限
  )

  # 横軸のスケールを指定
  ax.set_xscale(
    value="linear",  # 対数グラフなら"log"を指定
  )

  # 横軸の目盛間隔を設定
  ax.set_xticks(
    ticks=[x for x in range(30, 100 + 1, 10)],  # 間隔
    labels=[f"{x}点" for x in range(30, 100 + 1, 10)],  # ラベル
    minor=False,  # 補助目盛か?
  )
  ax.set_xticks(
    ticks=[x for x in range(30, 100 + 1, 5)],  # 間隔
    minor=True,  # 補助目盛か?
  )

  # 縦軸の範囲を指定
  ax.set_ylim(
    bottom=30,  # 下限
    top=100,  # 上限
  )

  # 縦軸のスケールを指定
  ax.set_yscale(
    value="linear",  # 対数グラフなら"log"を指定
  )

  # 縦軸の目盛間隔を設定
  ax.set_yticks(
    ticks=[y for y in range(30, 100 + 1, 10)],  # 間隔
    labels=[f"{y}点" for y in range(30, 100 + 1, 10)],  # ラベル
    minor=False,  # 補助目盛か?
  )
  ax.set_yticks(
    ticks=[y for y in range(30, 100 + 1, 5)],  # 間隔
    minor=True,  # 補助目盛か?
  )

  # 横軸の目盛を設定
  ax.grid(
    axis="x",  # 目盛を指定する軸
    which="major",  # 主目盛か補助目盛か
    visible=True,  # 表示状態
    color="#B0B0B0FF",  # 目盛線の色
    alpha=0.8,  # 不透明度
    linestyle="solid",  # 線の種類
    linewidth=1,  # 線の太さ
  )

  # 横軸の補助目盛を設定
  ax.grid(
    axis="x",  # 目盛を指定する軸
    which="minor",  # 主目盛か補助目盛か
    visible=True,  # 表示状態
    color="#B0B0B0FF",  # 目盛線の色
    alpha=0.8,  # 不透明度
    linestyle="dashed",  # 線の種類
    linewidth=0.5,  # 線の太さ
  )

  # 縦軸の目盛を設定
  ax.grid(
    axis="y",  # 目盛を指定する軸
    which="major",  # 主目盛か補助目盛か
    visible=True,  # 表示状態
    color="#B0B0B0FF",  # 目盛線の色
    alpha=0.8,  # 不透明度
    linestyle="solid",  # 線の種類
    linewidth=1,  # 線の太さ
  )

  # 縦軸の補助目盛を設定
  ax.grid(
    axis="y",  # 目盛を指定する軸
    which="minor",  # 主目盛か補助目盛か
    visible=True,  # 表示状態
    color="#B0B0B0FF",  # 目盛線の色
    alpha=0.8,  # 不透明度
    linestyle="dashed",  # 線の種類
    linewidth=0.5,  # 線の太さ
  )

  # 凡例の設定
  ax.legend(
      bbox_to_anchor=(1, 1, 0, 0),  # 凡例を配置する範囲のbbox
      loc="upper left",  # bboxのどこに凡例を置くか
      borderaxespad=0.5,  # 凡例とbboxの隙間
      fontsize=12,  # フォントサイズ
      labelcolor="#505050FF",  # 文字色
  )
  # Axesの位置を調整
  # 凡例を外に置いた場合や、横軸の目盛を回転させた場合、
  # 調整しないとはみ出すことがある。
  ax.set_position([0.11, 0.15, 0.7, 0.7])

  # グラフをファイルに保存
  fig.savefig("test.png")

  return fig, ax


fig, ax = generate_scatter_plot_sample()
目次

出力結果

上記のスクリプトを実行すると以下の散布図が出力されます。

matplotlibの散布図

終わりに

スクリプトには散布図に関係しそうな設定項目を全て詰め込みました。matplotlibには同じ結果を得る方法が複数存在し、それらは複数のWebサイトでバラバラに紹介されています。何度も検索する手間を削減するために、この記事では散布図に関連のある設定を一つのコードにまとめました。

なお、著者は以下のバージョンのライブラリで実行を確認しました。

  • matplotlib==3.5.1
  • japanize_matplotlib==1.1.3
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

ITベンチャーでデータ分析、AI開発、システム設計、提案、営業、組織管理、公演、採用などなど多数の役割に従事してきました。

様々な職業や背景の方々と交流するうちに、幅広い分野で問題を解決したり価値を生み出したりするためには、個別の知識だけでなく、汎用的に物事を考える力を伸ばしていく必要があると考えるようになりました。

更に、自分自身の考える力だけでなく、より多くの人々の考える力のトレーニングを応援することで、社会全体を良くしていけるのではないかと考えて、このサイトを作りました。

目次
閉じる