2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで〇×ゲームのAIを一から作成する その65 matplotlib による画像の描画の基本

Last updated at Posted at 2024-03-21

目次と前回の記事

これまでに作成したモジュール

以下のリンクから、これまでに作成したモジュールを見ることができます。

ルールベースの AI の一覧

ルールベースの AI の一覧については、下記の記事を参照して下さい。

〇×ゲームの GUI

これまでは、作成した 〇×ゲームplay メソッドで 遊ぶ際 に、ゲーム盤の表示 と、着手 を行う 座標の入力文字 で行ってきました。以前の記事で説明したように、そのような、文字だけ入出力 を行う ユーザインターフェース のことを CUI と呼びます。

CUIプログラム作成比較的簡単 に行うことができるという 利点 がありますが、表示入力わかりづらい という 欠点 があります。そこで、今回の記事からしばらくは、ゲーム盤の表示画像 で行い、座標の入力 を、表示された 画像 に対してクリックなどの 操作 で行うという、GUI〇×ゲーム遊べるよう にします。

GUI のアプリケーションを 作成 するためには、画像を表示 するプログラムを 記述必要ありますPython では、画像を表示 するための 様々なモジュール がありますが、本記事では、その中でグラフを描画する際に良く使われる matplotlib を利用することにします。

画像GUI を扱う モジュール に興味がある方は、Python画像GUIモジュール などを キーワード検索 してみると良いでしょう。

matplotlib

matplotlib は、静止画動画_ などを 作成 したりすることができる Python の モジュール で、特に、折れ線グラフ、棒グラフ、散布図など、様々なグラフ簡単に作成 することが できる ので、Python のモジュールの中で、人気のあるモジュール です。

本記事では、以下のような理由から、matplotlib を利用することにしました。

  • Pythonモジュール の中でも、最も良く使われる ものの 一つ である
  • 今後の記事グラフ描画 する 機会 がある
  • グラフだけでなく、任意の図形文字列描画できる
  • アニメーション(動画)を 作る機能 がある
  • JupyterLab 上で簡単に 利用できる

下記は matplotlib のサイトのリンクです。

matplotlib のインストール

これまでの記事で利用してきた collections などモジュール は、Pythonインストールした際自動的インストール される、組み込みモジュール と呼ばれるものです。

一方、matplotlib など、個人団体 などが 作成 した モジュール利用 するためには、そのモジュールを インストール する 必要あります

モジュールインストール する 方法 には、様々な方法がありますが、本記事では、Anaconda Navigator利用 する、下記の方法紹介 します1ので、matplotlib をインストールしていない方は、下記の手順 に従って インストール して下さい。

  1. Anaconda Navigator を立ち上げる
  2. 左の Environmentsクリック して表示される 仮想環境の一覧 から marubatsuクリック すると、右に marubatsu仮想環境インストール されている モジュールの一覧表示 される
  3. 上のメニュー から「Not installed」を 選択 し、その右の「Search packages」と表示された テキストボックス に「matplotlib」を 入力 する
  4. 下に matplotlib2 が表示 されるので、その 左のチェックボックスチェック し、下の「Applyボタンクリック する。
  5. Install packages」という パネルが表示 され、しばらく待つと「Applyボタン がクリックできるようになるので クリック する。

しばらく待つとインストールが完了します。

やり方を知っている方は、Anaconda Powershell Prompt などから conda や pip などのコマンドを利用して matplotlib をインストールして構いません。

matplotlib のインポート

以前の記事で説明したように、Python では、モジュールパッケージ という 用語 が、同じ意味使われる ことがありますが、厳密 には下記のように 意味が異なりますmatplotlibパッケージ なので、複数のモジュール から 構成 されます。

  • モジュール は、Pythonプログラムが記述 された ファイル
  • パッケージ は、複数Python のプログラム である モジュールまとめたもの

パッケージ の中の 特定のモジュールインポート する場合は、下記のプログラムのように、パッケージ名半角. (ピリオド)で 区切ってモジュール名記述 します。

import パッケージ名.モジュール名

matplotlib利用 する際には、pyplot という モジュールインポート する 必要あります。ただし、pyplot モジュール利用 する際に、毎回 pyplot記述 するのは 面倒 なので、一般的 には下記のプログラムのように、plt という 名前インポート します。

import matplotlib.pyplot as plt

matplotlib他のモジュール に関しては、必要に応じてインポート します。

pyplot モジュールの詳細については、下記のリンク先を参照して下さい。

グラフの描画方法

matplotlib は、グラフを描画 するために 良く使われる ので、最初に、折れ線グラフと散布図の グラフを描画 する 方法紹介 します。

折れ線グラフ は、pyplotplot という メソッド を使って 描画 します。下記は、(1, 6)(2, 2)(3, 7)(4, 5)(5, 9)5 つの点 を結ぶ 折れ線グラフ描画 するプログラムです。

plot メソッドに記述する 2 つ実引数の意味 は、以下の通りです。

  • 折れ線グラフの 頂点x 座標要素 として持つ list などの シーケンス型
  • 折れ線グラフの 頂点y 座標要素 として持つ list などの シーケンス型
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])

実行結果

matplotlib では、それぞれの座標(1, 6) のように 記述 するの ではなく、それぞれの座標を x 座標y 座標分けて記述 する点に 注意 して下さい。

プロット(plot)とは、データ図などで表す ことを意味する 英語 です。plot という 単語 には、折れ線グラフ という 意味はない 点に注意して下さい。これは 筆者勝手な想像 なのですが、おそらく、代表的なグラフが、折れ線グラフなので、折れ線グラフを描画するメソッドの名前を plot にしたのではないかと思います。

pyplot モジュールには、plot 以外 にも、様々なグラフ描画 するための メソッド用意 されており、グラフデータを用意 して、それらの メソッド呼び出すだけ で、簡単グラフを描画 することが できるよう になっています。例えば、散布図 というグラフは、下記のプログラムのように、scatter という メソッド を呼び出すことで 簡単に描画 することが できます。なお、実引数 に記述した データ は、先程の plot の例と 同じ です。

plt.scatter([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])

実行結果

pyplot モジュールの、グラフを描画 する メソッド一覧詳細 ついては、下記のリンク先を参照して下さい。

警告メッセージが出る場合の対象方法

上記 のプログラムを 実行 した際に、下記のような 警告メッセージ表示 される 場合あります。これは、matplotlib利用 する フォントインストールされていない ことを表します。この 警告メッセージ表示されない場合 は、以下の内容無視 して下さい。

findfont: Font family 'IPAexGothic' not found.

上記 のような 警告メッセージ表示 される場合は、グラフに 日本語表示 しようとした場合に、下記のプログラムのように 文字化け発生 してしまします。なお、2 行目plt.title は、グラフタイトルを表示 する メソッド で、実行結果上部表示 される □□□ は、「テスト」という 文字列文字化け したものです。

plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.title("テスト")

実行結果

修正箇所
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
+plt.title("テスト")

文字化け起きない ようにする 方法 として、フォントインストール し、matplotlib設定を編集 するという 方法 がありますが、少々面倒 なので、別の方法紹介 します。

フォントインストール する 方法 を行いたい人は、上記の 警告メッセージキーワード にして 検索 するとその方法の手順が見つかると思います。

本記事で紹介する方法は、japanize-matplotlib という、matplotlib日本語化 する モジュールインストール するという方法です。なお、このモジュール は、Anaconda Navigator や、conda という コマンド では インストール することが できない ようなので、下記の手順pip という コマンド を使って インストール する 必要あります

  1. スタートメニューから、「Anaconda Powershell Prompt (anaconda3)」を探して 実行 する
  2. conda activate marubatsu入力 して、marubatsu仮想環境に入る
  3. pip install japanize-matplotlib入力 して エンターキーを押す

インストール後 に、下記 のプログラムのように、japanize_matplotlib3インポートする と、警告メッセージ表示されなく なり、日本語の文字表示される ようになります。

import japanize_matplotlib

plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.title("テスト")
修正箇所
+import japanize_matplotlib

plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.title("テスト")

実行結果

本記事 では、以後japanize_matplotlibインポート しますが、japanize_matplotlibインストールしない 場合は import japanize_matplotlib記述しない ようにして下さい。

下記は、japanize‐matplotlib のサイトのリンクです。

matplotlib の仕組み

matplotlibグラフを描画 する場合は、先程のプログラムのように、描画 する グラフの種類対応 する pyplotメソッドの使い方学べば良い のですが、〇×ゲームゲーム盤 は、グラフを描画 する メソッドだけ では 描画できません

本記事 では、matplotlib簡単な仕組み について 説明 し、matplotlib使って図形文字列組み合わせる ことで、〇×ゲームゲーム盤の画像描画する方法 について 説明 します。従って、matplotlib入門ページ などで 紹介 される、グラフを描画 するための 様々な機能 については、今回の記事 では 説明しません

なお、今後の記事matplotlibグラフを描画 する 機会あります ので、matplotlibグラフを描画 する 方法 に関しては、その際に紹介 します。

なお、matplotlib は非常に 豊富な機能持つ ので、本記事だけすべて仕組み使い方説明 することは 不可能 です。興味がある方 は、matplotlib説明 する インターネットの記事書籍 などが豊富にあるので、それらを 参考にすると良い でしょう。

matplotlib の用語と簡単な仕組み

下記は、matplotlib仕組み理解 するために 特に重要 となる 用語 です。それぞれの意味についてはこの後で説明します。

用語 意味
Figure matplotlib描画する画像 に関する データ管理 する オブジェクト
plotsubplot Figure表す する 画像の中 で、Figure登録したデータ実際に描画 する 範囲 を表す 用語Axes によって 管理される複数plot が存在 する場合は、一つ一つplotsubplot呼ぶ
Axes plot(または subplot)を 管理 する オブジェクトplot の中座標x 軸y 軸4などを使って 管理 する 機能 などを持つ
Artist 画像表示 する 図形文字列 などを表す オブジェクトAxes含め画像描画 される データすべて Artist一種 である

紛らわしい ですが、上記の表の plot という 用語 と、折れ線グラフを描画する、pyplot モジュール の plot メソッド異なるもの である点に 注意 して下さい。

本記事では、plot メソッド の場合は、文字網掛けにする ことで 区別 します。

画像の描画の手順

matplotlib では、以下 のような 手順画像の描画 を行います。

  1. Figure という、描画する画像 に関する データ管理 する オブジェクト作成 する
  2. plot管理 する Axes という オブジェクト作成 し、Figure に登録 する
  3. 図形文字列 などを表す Artist作成 し、Axes登録する
  4. Figure登録 された Artist描画 する メソッド呼び出し て、画像を描画 する

勘違いされやすい のですが、画像の描画 は、図形や文字列を表す Artist作成 し、Axes登録した時点 では 行われず、上記の 手順 4まとめて行われます。その理由は、Artist作成して登録するたび描画を更新 するという 処理効率が悪く、Figure に登録された Artist を まとめて描画 したほうが 効率が良い からです。

ただし、そのこと理解していなくても、ほとんどの場合は、グラフや図形などの描画を行う プログラムの記述 には 影響はない ので、このことの 意味が分からなくても当面気にしなくても構いません

先程紹介 した、pyplotplotscatter 等の グラフを描画 する メソッド は、上記手順 1 ~ 3まとめて行う機能を持つ ので、よくある 定型的なグラフ であれば、上記の手順意識する必要ありません。しかし、凝ったグラフ描画したい場合 や、〇×ゲームゲーム盤 のような、グラフを描画 する メソッドだけ描画できない ような 画像 を描画したい場合は、上記の手順 について 理解 する 必要あります

なお、JupyterLabプログラムを実行 する場合は、上記の 4 番目の手順 は、JupyterLabセルを実行後 に、自動的に実行 されるので プログラムの記述省略できます。先程のプログラムで、plot メソッドを 実行しただけグラフ描画された のは そのため です。

おそらく上記の説明では、意味が分からない人が多いと思いますので、それぞれの手順を具体例を挙げながら説明します。

Figure の作成

Figurematplotlib描画する画像 に関する データ管理 する オブジェクト のことで、matplotlib では、描画する画像ごとFigure を作成 する 必要あります

plotscatter などの、グラフを描画 する メソッド には、自動的Figure作成する機能備わっている ので、それらのメソッド利用する場合 は、自分Figure作成する必要ありません。ただし、自動的に作成 された Figure は、あらかじめ決められ設定作成される ので、自分好み設定Figure作成したい 場合は、自分Figure作成する必要あります

自分Figure作成 する場合は、pyplot モジュールの figure メソッドを 利用 します。figure メソッドは 返り値 として、作成 した Figureオブジェクト返します

下記は、figure メソッドの 主な仮引数 とその 意味 です。下記仮引数 は、デフォルト引数 になっているので、下記の表では デフォルト値表記 しました。また、matplotlib では、様々な方法設定 できますが、その中 に、下記の表のデフォルト値のように、色を 英単語で設定 するという 方法 があります。他の設定方法についてこの後で紹介します。

仮引数 意味 デフォルト値
figsize 作成 する 画像高さ要素 として持つ list
数字単位インチ
[6.4, 4.8]
facecolor
または fc
作成 する 画像背景色 "white"

下記は、figsizefacecolor設定 して、先程と同じ折れ線グラフを描画するプログラムです。figsize幅と高さ同じ値設定 したため、画像正方形 になります。なお、作成 した Figure代入 する 変数の名前 には、fig という 名前良く使われます

  • 1 行目画像のサイズ3 × 3背景色水色(lightblue)に 設定 した Figureオブジェクト作成 し、fig という 名前変数代入 する
fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
修正箇所
+fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])

実行結果

本記事では、fig に代入した Figure のデータを利用しませんが、Figureメソッドを利用 することで、Figure作成後 に、設定変更 することが できます

なお、figure メソッドによって 作成 された Figure は、pyplot モジュール自動的管理する ので、上記のプログラムのように 変数代入しておかなくてもpyplotメソッド利用 することで 後から取得 することも できます

また、今回の記事では行いませんが、Figure複数作成 することで、複数の画像同時に作成 することも できます

figure メソッドの詳細については、下記のリンク先を参照して下さい。

Axes

作成したばかりFigure には何の データ登録されていない ので、下記 のプログラムのように、Figure作成するだけ では 何も描画行われません画像を描画 するためには、少なくとも 1 つの Axes を作成 して、Figure に登録 する 必要あります

fig = plt.figure(figsize=[3, 3], facecolor="lightblue")

実行結果

<Figure size 300x300 with 0 Axes>

実行結果 に表示されるメッセージは、作成した Figure が、大きさ300 x 300画像Axes1 つも登録されていない ことを 表します

Axes とは何か

画像を描画 する際には、Figure作成する画像どの範囲 に、Figure登録したデータ描画するか決める必要 があります。

このように説明すると、画像全体描画すればよい思う人多いのではないか と思いますが、画像全体描画してはいけない 場合が あります

具体的には、先程のプログラムで描画した下記のグラフを見て下さい。この画像 の中で、グラフのデータ描画 される 範囲 は、画像全体 ではなく、背景白い正方形の範囲限定されます。下記の 白い正方形範囲 のように、グラフのデータなどを 実際に描画 する 範囲 の事を plot と呼び、plot を管理 するのが Axes という オブジェクト です。

matplotlib では、基本的には Axes を作成 し、Figure に登録 することではじめて、画像描画される という 仕組み になっています。

Axes の作成と登録

Axes は、下記 のプログラムのように、pyplotsubplot という メソッドを実行 することで 作成 することが できます。また、作成 した Axes は、pyplot管理 する Figure自動的に登録 されます。なお、作成 した Axes代入 する 変数の名前 には、ax という 名前良く使われます

fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
ax = plt.subplot()
修正箇所
fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
+ax = plt.subplot()

実行結果

実行結果 からわかるように、Axes作成 し、Figure登録 することで、画像が描画 されるようになります。なお、Figure には、作成した Axes 以外の データ登録されていない ので、plot白い正方形部分 には 何も表示されません。なお、上図のように、AxesFigure描画される ものの一つなので、AxesArtist一種分類 されます。

plotscatter などの グラフを描画 する メソッド には、自動的Axes を作成 し、Figure に登録 する 機能備わっている ので、それらのメソッドを利用する際には、自分Axes作成する必要ありません

作成した Axes対応 する plot が、画像どこに配置されるか については、自動的設定されます が、自分好みの位置大きさ設定 することもできます。

subplot メソッドの詳細については、下記のリンク先を参照して下さい。

Axes の他の役割

Axes には、plot を管理 する 以外 にも 以下 のような 重要な役割 があります。

  • plot の 内部の座標x 座標y 座標 などで 管理 する
  • Artist を、Axes管理 する 座標 を使って 登録 する
  • plot に 表示 する 座標の範囲管理 する
  • plot の 外側表示 する 目盛り など5Artist を管理する

それぞれについて、詳しく 説明 します。

plot の内部の座標の管理

Figure登録 した 図形文字列 などを 描画 するためには、図形文字列位置大きさ指定する必要あります が、そのためには、位置大きさ基準 となる 座標必要 になります。2 次元画像 の場合は、一般的x 軸y 軸 を使って 座標大きさ表現 しますが、matplotlib では それらAxes という オブジェクト管理 します。

具体的には、Axesplot内部の座標x 軸y 軸 による 座標管理 します。このように、Axes複数の軸管理 することから、 を表す 単語 である axis複数形axes名前の由来 になっています。

今回の記事では使用しませんが、Axis という、一つの軸 を表す Artist があります。名前 が Axes と似て 紛らわしい ので、混同しないよう注意 して下さい

Artist の登録

Figure そのものは、画像内部座標を管理 する 機能持たない ので、Figure図形文字列 などの Artist を登録 する際には、座標を管理 する 機能を持つAxes に 対して Artist登録 します。また、Axes に対して 登録 された Artist は、その Axesplot の中描画 されます。従って、Figure登録 する Artist は、下記の 階層構造 になります。

  • FigureAxes を登録 する
  • AxesArtist を登録 する

具体的プログラムの例 については、Artist作成と登録説明 の所で行います。

plot に描画する表示範囲の管理

plot有限の大きさ を持つ 長方形 なので、plot描画 する 座標の範囲有限 になります。そのため、Axes は、plot描画 する 座標の範囲管理 する 機能 を持ちます。

plot描画 する 座標の範囲変える と、描画 される Artist大きさ変わったりArtist一部 または すべてplot表示されない場合生じます

分かりづらいと思った人は、ウィンドウ と、ウィンドウ内の 表示拡大縮小機能 を思い浮かべてみて下さい。例えば、一般的ウェブブラウザ は、Ctrl キー押しながらマウスホイール回転 すると、表示大きさ拡大・縮小 することが できます表示拡大 すると、ウィンドウに 表示 される 範囲せまく なり、ウェブページの 一部の内容画面表示されなく なります。

下図は、先程の Axes作成 したプログラムの 実行結果 です。図からわかるように、Axes は、初期設定 では、plot表示範囲 は、x 座標y 座標0 ~ 1範囲設定 されます。なお、数学グラフ の軸と 同様 に、横方向x 軸 で、縦方向y 軸 です。

Axes管理 する plot表示範囲 は、set_xlimset_ylim メソッドを使って 変更 することが できます実引数 には、それぞれの 範囲最小値最大値 を記述し、下記 のプログラムのように記述することで、x 座標y 座標表示範囲-1 ~ 1 になります。

fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
ax = plt.subplot()
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
修正箇所
fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
ax = plt.subplot()
+ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
+ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する

実行結果

plotscatter などの グラフを描画 する メソッド には、下記の plot メソッドによって 作成されたグラフ からわかるように、Axes表示範囲 を、グラフデータ から 自動的に設定 する 機能備わっています。そのため、それらのメソッドを利用する際には、自分Axes表示範囲設定する必要ありません

set_xlimset_ylim メソッドの詳細については、下記のリンク先を参照して下さい。

枠と目盛りの管理

Axes は、plot や、枠の外側目盛り なども 管理 するので、Figure を描画 すると、自動的に plot目盛り表示 されます。

グラフを描画 する際には 必須 となる、目盛り は、〇×ゲームゲーム盤描画 する際には 邪魔 になります。目盛り は、下記のプログラムのように、Axesaxis メソッドの 実引数"off"記述 して 実行 することで 表示しない ように できます

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
ax.axis("off")
修正箇所
fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
+ax.axis("off")

実行結果

実行結果 からわかるように、目盛り だけでなく、plot白い部分表示されなくなります が、plot の範囲見えなくなっただけ で、plot そのもの元の位置存在 しています。従って、目盛り表示しないよう にしても、下記のプログラムのように、Axes登録 した Artist は問題なく 表示されます

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
ax.axis("off")
修正箇所
fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
+plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
ax.axis("off")

実行結果

Figure と Axes の一括作成

上記のプログラムでは、Figure作成 してから Axes作成 して 登録 しましたが、Figure を使って 画像を描画 するためには、Axes作成 して Figure登録 する 必要 があるので、その 2 つの処理まとめて 行う subplots という メソッド用意 されています。

subplots メソッドは、下記処理 を行います。

  • Figure作成 して pyplot モジュールに 登録 する
  • Axes作成 して、上記で作成した Figure登録 する
  • 返り値 として、上記で 作成 した FigureAxes要素 として持つ tuple返す

また、subplots メソッドは、下記 のプログラムのように、figure メソッドと 同じキーワード引数 を使って、Figure画像のサイズなど設定 することが できます

下記のプログラムは、先程 のプログラムと 同じ処理 を行うプログラムです。

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
修正箇所
-fig = plt.figure(figsize=[3, 3], facecolor="lightblue")
-ax = plt.subplot()
+fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する

実行結果

subplotsubplots名前似ています が、全く異なる処理 を行うメソッドである点に 注意 して下さい。

subplots メソッドの詳細については、下記のリンク先を参照して下さい。

複数の Axes の設定

本記事 では、しばらくの間 は、Figure複数Axes の登録行わない ので、興味がない方 はこの部分は 読み飛ばして構いません

subplots メソッドを利用することで、Figure に、複数Axes登録 することが できます。その場合は、Figure作成 する 画像の中 に、複数plot作成 され、それぞれplotsubplot と呼びます。

それぞれsubplot下記 のような 性質持ちます

  • 異なる Axes によって 管理される
  • それぞれの Axes に対して、Artist登録 できる
  • Axes登録 された Artist は、その Axes対応 する subplot に対して 描画 される

上記の性質から、subplot利用 することで、下記 のプログラムのように、1 つの画像 の中に、異なる 2 つグラフ並べて描画 することが できる ようになります。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[6, 3], facecolor="lightblue")
ax1.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
ax2.scatter([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])

実行結果

上記のプログラムの詳細な説明を行うと長くなるので、今回の記事 では 簡単な説明とどめます。興味がある方は、subplots で検索して調べてみて下さい。なお、今後の記事で上記のような画像を実際に作成する必要が生じた際に詳しく説明します。

上記 のプログラムでは、1 行目subplots を使って、画像の中subplot横に 2 つ並べた2 つAxes作成 しています。また、作成 した 2 つAxes は、ax1ax2 という 2 つの変数代入 しています。なお、2 つのグラフ並べて表示 できるように、画像横幅縦幅の倍設定 しました。

2、3 行目 では、それぞれAxes に対して、別々plotscatter メソッドを使って 折れ線グラフ散布図描画 しています。その結果、実行結果 のように、2 つのグラフ並べた画像作成 することが できます

pyplot のメソッドと Axes のメソッド

今回の記事の最初では、折れ線グラフ描画 する際に、pyplotplot メソッドを 利用 しましたが、上記のプログラムのように、Axes にも plot メソッドが あります

plot 以外 にも、多くのメソッドpyplotAxes共通 し、Figure1 つ しか Axes登録 しない 場合 は、基本的どちら を使っても かまいません

ただし、一部の メソッドは、名前が異なったり片方 にしか 存在しない 場合があるので、そのような メソッド利用する場合使い分ける必要 があります。例えば先程紹介した set_xlim という Axes のメソッドは、pyplot では 対応 する メソッドxlim という 名前 で、微妙行う処理異なります。また、この後で説明する、Artist を登録 する メソッド は、pyplot には ありません

本記事 では 基本的 には、Axesメソッドを利用 することにします。

matplotlib を使ったことがある人の中でも、この 2 つplot メソッドの 違い分かりづらい思っている 人が いるのではないか と思いますので、簡単に説明 します。

先程も説明しましたが、本記事 では、しばらくの間 は、Figure複数Axes の登録行わない ので、興味がない方 はこの部分は 読み飛ばして構いません

結論 からいうと、pyplotplot メソッドは、Axesplot メソッド呼び出す という 処理 を行っています。また、FigureAxes1 つ しか 登録 しない場合は、どちらの plot メソッドを呼び出しても 全く同じ処理行われます

2 つplot メソッドの 違い は、FigureAxes複数登録 されている場合に 生じます

例えば、先程の例 のように、Figureax1ax2 という 2 つAxes登録されている場合 の事を考えてみて下さい。この場合は、ax1ax2 に対して plot メソッドを 呼び出す ことで、2 つAxes の中から 1 つを選択 して 折れ線グラフ描画できます

一方、pyplotplot利用 した場合は、下記のプログラムのように、Figure登録 されているうちの 1 つの Axessubplot対して のみ グラフを描画 します。実行結果 からわかるように、subplot に、折れ線グラフ散布図両方 が、重ねて描画 されます。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[6, 3], facecolor="lightblue")
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.scatter([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
修正箇所
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[6, 3], facecolor="lightblue")
-ax1.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
+plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
-ax2.scatter([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
+plt.scatter([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])

実行結果

pyplot は、Figure複数の Axes登録 されている 場合 は、そのうち1 つ対象 として 処理を行う という 仕組み になっており、その Axes を、current Axes と呼びます6

current Axes は、subplot メソッドなどを 利用 することで 切り替える ことが できます が、個人的には 複数Axes を利用 する場合は、pyplot ではなく、Axesメソッド利用したほうが良い思います

Axes1 つ の場合は、pyplotメソッド利用 したほうが 簡単プログラム記述 できますが、先程説明したように、一部のメソッド は、名前が異なったりAxes にしか存在しない 場合があるので、本記事 では、基本的 には Axes のメソッド利用 します。

Artist

matplotlib では、画像表示 する 図形文字列 などを表す オブジェクト のことを Artist と呼びます。先ほど紹介した、Axes も、画像に描画 されるため Artist の一種 です。

ArtistAxes管理 する plot描画される ので、Axes に登録 する 必要あります7

matplotlib には、Artist種類ごと に、様々なモジュール用意 されています。下記主なモジュール一覧 です。なお、本記事 では、主に patches利用 します。

モジュール名 Artist の種類
pathces 長方形や円などの図形
lines 線に関する図形
text 文字列
legend 凡例
table

Artistpathes に関する詳細は、下記のリンク先を参照して下さい。

plotscatter などの、グラフを描画 するための メソッド は、グラフ構成 する 図形Artist作成 し、Axes登録する という 処理行っています

円の作成と登録

本記事 では、〇×ゲームゲーム盤描画 するために 必要Artist説明 を行います。他の図形興味がある方 は、matplotlibpatchsキーワード検索 して下さい。

〇×ゲームゲーム盤 では、〇 のマーク を表す 図形描画 する 必要がある ので、Artist作成 し、Axes登録する方法説明 します。

は、patches モジュールの Circle メソッドを使って 作成 します。下記は Circle メソッドの 仮引数 です。xy はデフォルト引数ではないので、必ず記述 する 必要があります

仮引数 意味 デフォルト値
xy 円の 中心の座標 (x, y) を表す シーケンス型 なし
radius 円の 半径 5

作成した Artist は、Axesadd_artist メソッドを使って Axes登録 します。

下記は、中心の座標(0, 0) で、半径1作成 して 登録 するプログラムです。

  • 1 行目matplotlibpatches モジュールを patches という 名前インポート する
  • 4 行目中心の座標(0, 0)半径1Artist作成 し、circle代入 する
  • 5 行目ax代入 された Axescircle登録 する
import matplotlib.patches as patches

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
circle = patches.Circle((0, 0), 1)
ax.add_artist(circle)
修正箇所
+import matplotlib.patches as patches

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
+circle = patches.Circle((0, 0), 1)
+ax.add_artist(circle)

実行結果

先程説明 したように、Axesplot初期設定表示範囲 は、x 座標y 座標0 ~ 1範囲 になっているので、実行結果 のように 円の一部 しか 表示 されません。下記 のプログラムは、円の全体表示 するように 円の半径表示範囲設定 したプログラムです。

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
circle = patches.Circle((0, 0), 0.8)
ax.add_artist(circle)
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
修正箇所
fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
-circle = patches.Circle((0, 0), 1)
+circle = patches.Circle((0, 0), 0.8)
ax.add_artist(circle)
+ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
+ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する

実行結果

Circle メソッドに関する詳細は、下記のリンク先を参照して下さい。

枠と塗りつぶしの設定方法

Circle メソッドによって 作成 される は、上記のように、塗りつぶされた枠がない図形 として作成されます。塗りつぶし は、Circle メソッドの 下記仮引数 によって 設定 できます。なお、下記仮引数matplotlib他の図形 でも 共通 します。

仮引数 意味 設定できる値 デフォルト値
edgecolor8
または ec
枠の色 色 または None matplotlib の
設定で変更可能
facecolor8
または fc
塗りつぶしの色 色 または None 設定で変更可能
color 枠の色と塗りつぶしの色
linewidth
または lw
枠の幅 float または None 設定で変更可能
fill 塗りつぶすかどうか boolean True

下記は、上記の 補足説明 です。色に関してはこの後で説明します。

  • 仮引数複数 ある場合は、どちら使っても良い
  • matplotlib設定 は、rcsetup という モジュール変更 することが できる
  • edgecolorfacecolor と、color同時に設定 された場合は、edgecolorfacecolor優先 される
  • edgecolor などに None設定 すると、対応 するものは 描画されない
  • facecolor設定 されていても、fillFalse の場合は 塗りつぶされない
  • edgecolor設定 されていても、linewidth0None の場合は 描画されない

色の設定方法

matplotlib では、 を、主に 下記 のような 方法 で指定できます。この中で 良く使われる のは、アルファベット 1 文字 で色を 指定する方法 です。

なお、コンピュータ では、 を、(red)、(green)、(blue)の 明るさ表現 し、その 表現方法3 つの色頭文字 をとって 一般的RGB表記 します。

  • RGBtuple指定 する
    (1.0, 0.5, 0.2) のように、RGB明るさ0 ~ 1範囲tuple指定 できる

  • RGB16 進数指定 する
    "#RRGGBB" という 形式文字列RGB指定 する。それぞれの色明るさ は、2 桁16 進数00 ~ FF範囲9指定 する。例えば "#FF0000" のように 記述 する

  • 英単語指定 する
    "red""green" などの 英単語指定 する。指定できる単語 については、下記 のリンク先を 参照 すること

  • アルファベット 1 文字指定 する
    下記良く使われる色 は、特別アルファベット 1 文字指定できる"black""blue"同じ頭文字 なので、"b""k"指定 する点に 注意 する事
文字 対応する英単語の色
"b" blue
"g" green
"r" red
"c" cyan
"m" magenta
"y" yellow
"k" black
"w" white

matplotlib での 色の指定方法 の詳細については、下記のリンク先を参照して下さい。

塗りつぶしの色などを設定した円の描画例

下記は、塗りつぶしの色 に、枠の色 に、枠の太さ5設定 して、先程と同じ大きさの 円を描画 するプログラムです。

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
circle = patches.Circle((0, 0), 0.8, fc="green", ec="red", lw=5)
ax.add_artist(circle)
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
修正箇所
fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
-circle = patches.Circle((0, 0), 0.8)
+circle = patches.Circle((0, 0), 0.8, fc="green", ec="red", lw=5)
ax.add_artist(circle)
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する

実行結果

線と折れ線の作成と登録

折れ線 は、path という モジュールメソッド を使って 作成 することが できます が、先程紹介した pyplotAxesplot メソッドを利用することで、作成と登録まとめて行う ことが できる ので、本記事 では plot メソッドを 利用 することにします。

なお、path モジュールを 利用 することで、plot メソッドでは 作成できない曲線 などの 図形作成 することが できる ので、興味がある方は下記のリンク先を参照して下さい。

文字列の作成と登録

文字列 は、text という モジュールメソッド を使って 作成 することが できます が、pyplotAxestext メソッドを 利用 することで、作成と登録まとめて行う ことが できる ので、本記事 では text メソッドを 利用 することにします。

下記は、text メソッドの 主な仮引数 です。

仮引数 意味 デフォルト値
x 描画する文字列の 左下x 座標 なし
y 描画する文字列の 左下y 座標 なし
s 描画する 文字列 なし
color
または c
描画する文字列の 設定で変更可能
fontsize 描画する文字列の フォントサイズ 設定で変更可能

下記 は、先程の 円を描画 するプログラムに、(0, 0)座標 に、"text" という 文字列 を、フォントサイズ20大きさ表示 する 処理追加 したプログラムです。

fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
circle = patches.Circle((0, 0), 0.8, fc="green", ec="red", linewidth=5)
ax.add_artist(circle)
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
ax.text(0, 0, "text", c="w", fontsize=20)
修正箇所
fig, ax = plt.subplots(figsize=[3, 3], facecolor="lightblue")
circle = patches.Circle((0, 0), 0.8, fc="green", ec="red", linewidth=5)
ax.add_artist(circle)
ax.set_xlim(-1, 1) # x 座標の範囲を -1 ~ 1 に設定する
ax.set_ylim(-1, 1) # y 座標の範囲を -1 ~ 1 に設定する
+ax.text(0, 0, "text", c="w", fontsize=20)

実行結果

実行結果からわかるように、文字列左下座標 が、(0, 0) になる点に 注意 して下さい。

Axestext メソッドの詳細については、下記のリンク先を参照して下さい。

text モジュールに興味がある方は、下記のリンク先を参照して下さい。

Figure の描画

先程、JupyterLabプログラムを実行 する場合は、Figure描画 する 処理 は、JupyterLabセルの実行後 に、自動的に実行 されるので プログラムの記述省略できる と説明しましたが、セルの実行終了する前Figure を描画 したい場合などでは、自分その処理記述 する 必要あります

Figure の描画 は、下記 のプログラムのように、pyplot モジュールの show メソッドの 実行 によって 行います実行結果 は、show メソッドを 記述しない場合変わりません。これは、JupterLabセルの実行後自動的実行される処理 が、plt.show() だからです。

plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.show()
修正箇所
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
+plt.show()

実行結果

show メソッドが行う処理に関する注意点

JupyterLabセルを実行後plt.show()自動的に実行 されるということは、上記 のプログラムを実行すると、2 回 グラフが 描画されるはず ではないかと 思った人いないでしょうか上記グラフ2 回描画されない理由 は、show メソッドを 実行 すると、pyplot登録 された Figure自動的削除される からです。

Figure自動的削除される理由一つ は、グラフなどの 画像描画した後 で、すぐ新しい画像描画する場合多い からです。その際に、前に描画 していた 画像のデータ残っている と、新しい画像描画 する際に、前の画像 の上に 上書きする ことになってしまいます。また、一度描画 した 画像 を、二度と描画しない 場合は、その 画像のデータ取っておく と、コンピュータの メモリ無駄消費される という 問題 もあります。

分かりづらいと思いますので、具体例を挙げます。

下記 のプログラムは、show メソッドを 実行せず に、2 つplot メソッドを 続けて実行 するプログラムです。実行結果 からわかるように、1 つ画像複数折れ線グラフ描画 されます。このように、show メソッドを 実行するまでの間 は、同じ Figure に対して 処理続けて行われます

なお、折れ線グラフ色が異なる のは、plot メソッドが、連続して実行 すると、折れ線グラフの 色を変えて描画 するという 機能を持つ からです。

plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.plot([1, 2, 3, 4, 5], [3, 9, 1, 6, 8])

実行結果

一方、下記 は、JupyterLab1 つのセル で、2 つグラフを描画 するプログラムです。2 つのグラフ描画 される 理由以下 の通りです。

  • 2 行目show メソッド実行 することで、1 つ目グラフが描画 され、描画後 に、Figurepyplot登録 から 削除 される
  • 3 行目plot実行 した際に、pyplot登録 された Figure存在しなく なっているので、新しい Figure作成 されて、pyplot登録 され、その Figure折れ線グラフ構成 する 図形Artist登録 される
  • JupyterLabセルプログラムすべて実行 されたので、自動的plt.show()実行 されて 2 つ目グラフが描画 される
plt.plot([1, 2, 3, 4, 5], [6, 2, 7, 5, 9])
plt.show()
plt.plot([1, 2, 3, 4, 5], [3, 9, 1, 6, 8])

実行結果



matplotlib では、pyplotshow メソッドを 実行 して 画像を描画 した で、pyplot モジュールに 登録 した FigureArtistすべて削除 します。

JupyterLabセルmatplotlib画像を描画 した で、次のセル別の画像描画 すると、新しい画像描画される のは、セルの実行後show メソッドが 実行 された結果、そのセル作成 した Figure が削除される からです。

この説明は、意味が分からない人が多いと思います。当面この知識必要はない ので、現時点 ではわからない場合は 無理に理解する必要ありません

show メソッドが行うのは、pyplot が管理する Figure一覧空にする という 処理 なので、Figure そのもの削除する ことでは ありませんplt.figureplt.subplots作成 した Figurefig などの 変数代入 にして 取っておく ことで、その Figurepyplot再び登録する ことは 可能 です。

show メソッドの詳細については、下記のリンク先を参照して下さい。

今回の記事のまとめ

今回の記事では、〇×ゲームゲーム盤画像で表示 するために、matplotlib簡単な仕組み使い方 について 説明 しました。

〇×ゲームゲーム盤描画必要主な知識説明 できたので、次回の記事 では 実際〇×ゲームゲーム盤描画する ことにします。

本記事で入力したプログラム

以下のリンクから、本記事で入力して実行した JupyterLab のファイルを見ることができます。

今回の記事では marubatsu.py は変更していません。

次回の記事

  1. 以前の記事ipykernelインストール した 方法と同じ 方法です

  2. matplotlib-base というモジュールも 表示 されます。matplotlib との 違い は、matplotlib のほうは pyqt という モジュールインストールされる 点です。pyqtインストールしたくない理由なければmatplotlibインストールすればよい でしょう

  3. モジュールの名前japanize-matplotlib ですが、インポートする際japanize_matplotlib のように、半角 の _(アンダーバー)で つなげる必要あります

  4. matplotlib では、x 軸y 軸以外座標を表現 することも できます。例えば、3 次元座標 は、xyz3 つの軸 を使って 表現 します

  5. 今回の記事では利用しませんが、x 軸ラベル や、plotタイトルなどAxes が管理 します

  6. 同様 に、複数Figure作成 された場合も、pyplotそのうち1 つFigure対象処理を行いその Figure のことを、current Figure と呼びます

  7. Axes など、一部Artist は、Figure直接登録 されます

  8. edge図形 を、face図形 を表す英単語です 2

  9. 10 進数0 ~ 255相当 します

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?