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

plotlyの散布図

plotlyで散布図を作成するPythonスクリプトを紹介します。散布図に関係する設定項目を一覧できるように全て詰め込みました。不要な設定は変更または削除してご利用ください。

なお、下記のスクリプトはplotly.expressを使わないやり方です。

目次

スクリプト全文

import plotly.graph_objects as go
import plotly.io as pio


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

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

  # 氏名
  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組": "rgba(255, 144, 0, 255)",
    "1年2組": "rgba(0, 221, 51, 255)",
  }

  # マーカーの設定  https://plotly.com/python/marker-style/
  marker_line = {
    "color": "black",  # 色
    "width": 2,  # 太さ
  }
  markers = {
    "1年1組": {
      "color": "rgba(255, 144, 0, 255)",  # 色
      "size": 18,  # サイズ
      "opacity": 1.0,  # 透明度
      "symbol": "circle",  # 形
      "line": marker_line,  # 線の設定
    },
    "1年2組": {
      "color": "rgba(0, 221, 51, 255)",  # 色
      "size": 18,  # サイズ
      "opacity": 0.8,  # 透明度
      "symbol": "star",  # 形
      "line": marker_line,  # 線の設定
    },
  }

  # plotly.graph_objects.Figureの生成
  fig = go.Figure()

  # クラスごとに描画
  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]
    marker = markers[cls]

    # 折れ線を追加
    fig.add_trace(
      go.Scatter(
        name=cls,  # データの名称(凡例に表示)
        x=japanese_score_list,  # 横軸の値のリスト
        y=math_score_list,  # 縦軸の値のリスト
        text=name_list,  # マーカーに記載するテキスト
        mode="markers+text",  # 線・マーカー・テキストの有無
        marker=marker,  # マーカーの設定
        textposition="top center",  # テキストの位置
    ))

  # 横軸の設定
  xaxis = {
    "title": "国語",  # 軸ラベル
    "titlefont": {  # 軸ラベルのフォント
      "size": 14,  # サイズ
      "color": "rgba(80, 80, 80, 255)",  # 色
    },
    "tickangle": 45,  # 目盛ラベルの回転
    "tickfont": {  # 目盛ラベルのフォント
      "size": 14,  # サイズ
      "color": "rgba(80, 80, 80, 255)",  # 色
    },
    "dtick": 5,  # 表示間隔
    "tickformat": "",  # 表示フォーマット
    "range": (40, 100),  # 表示範囲
  }

  # 縦軸の設定
  yaxis = {
    "title": "数学",  # 軸ラベル
    "titlefont": {  # 軸ラベルのフォント
      "size": 14,  # サイズ
      "color": "rgba(80, 80, 80, 255)",  # 色
    },
    "type": "linear",  # ログスケールに変更するなら"log"
    "range": (40, 100),  # 表示範囲
  }

  # グラフのレイアウトを変更
  fig.update_layout(
    title="1年生の期末テストの点数",  # タイトル
    xaxis=xaxis,  # 横軸
    yaxis=yaxis,  # 縦軸
    plot_bgcolor="rgba(240, 240, 240, 255)",  # 背景色
  )

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

  # Scatterを利用してグラフに多角形を追加
  line = {
    "width": 0,
  }
  fig.add_trace(
    go.Scatter(
      name="補習範囲",  # 名称
      x=(0, 0, 60, 60, 100, 100),  # 範囲の点列
      y=(0, 100, 100, 60, 60, 0),  # 範囲の点列
      opacity=0.1,  # 透明度
      fill="toself",  # 塗りつぶしの方法
      fillcolor="rgba(255, 0, 0, 255)",  # 内部の色
      mode="lines",  # 線・マーカー・テキストの有無 
      line=line,  # 枠線の設定
      showlegend=False,  # 凡例に追加しない
    ))

  # 表示
  config = {
    "editable": True,  # 軸名等を編集可能に
    "displayModeBar": True,  # メニューバーを常に表示
    "scrollZoom": True,  # スクロール操作でズーム
  }
  fig.show(
    config=config,  # 表示設定
  )

  # HTMLとして出力
  # pio.write_html(fig, "fruits.html")  # %pip install kaleido

  # 画像として出力
  pio.write_image(fig, "test.png")

  return fig

fig = generate_scatter_plot_sample()

出力結果

上記のスクリプトを実行すると以下の折れ線グラフが出力されます。

plotlyの散布図

上記はwrite_imageで出力した単なる画像ですが、スクリプトやJupyter Notebookなどからfig.show()を実行するとインタラクティブにグラフを操作することができます。

終わりに

このスクリプトには散布図に関係しそうな設定項目をなるべく多く詰め込んでみました。細かな設定方法を逐一検索する手間を削減するためです。設定項目の抜け漏れがあれば更新していきたいと思います。

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

  • plotly==5.5.0
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

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

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

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

目次
閉じる