短期集中:Pythonでグラフを描く

Python
この記事は約14分で読めます。

Python勉強企画、3日目は、Webプログラミング…をしようかと思ったのですが、気が変わって数学ライブラリとグラフライブラリをいじってみます。

簡単なグラフを表示する

ライブラリのインストール

グラフを表示する(独立したウィンドウでグラフィカルに表示する)ライブラリで有名なものに Matplotlib というものがあります。Matplotlibは標準ではインストールされていないので、Python環境に追加インストールします。

ライブラリの追加インストールは、Windowsのコマンドプロンプトから py コマンドで行います。このコマンドを使用するには、Pythonのインストール時にパスを追加しておく必要があります。

コマンドの書式は、

py -m pip install 追加するライブラリ名

です。
以下は実行例です。

C:\> py -m pip install matplotlib
Collecting matplotlib
  Downloading matplotlib-3.4.3-cp39-cp39-win_amd64.whl (7.1 MB)
     |████████████████████████████████| 7.1 MB 3.3 MB/s
Collecting pyparsing>=2.2.1
  Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
     |████████████████████████████████| 67 kB 3.0 MB/s
Collecting kiwisolver>=1.0.1
  Downloading kiwisolver-1.3.1-cp39-cp39-win_amd64.whl (51 kB)
     |████████████████████████████████| 51 kB 199 kB/s
Collecting pillow>=6.2.0
  Downloading Pillow-8.3.1-1-cp39-cp39-win_amd64.whl (3.2 MB)
     |████████████████████████████████| 3.2 MB ...
Collecting python-dateutil>=2.7
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 6.8 MB/s
Collecting cycler>=0.10
  Downloading cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Requirement already satisfied: numpy>=1.16 in d:\programs\python\lib\site-packages (from matplotlib) (1.21.2)
Collecting six
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, python-dateutil, pyparsing, pillow, kiwisolver, cycler, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.4.3 pillow-8.3.1 pyparsing-2.4.7 python-dateutil-2.8.2 six-1.16.0

C:\>

入力したコマンドは一行目のpyコマンドだけで、2行目以降は刻刻と表示されるインストール進行状況のレポートです。Linuxのyumなどと同様、指定したパッケージ意外にも必要なものを自動的にインストールしてくれるようですね。

円を描いてみよう

ソースコード

import math
from matplotlib import pyplot

plotx = []
ploty = []
for d in range(361):
    rad = d * math.pi / 180
    x=math.cos(rad)
    y=math.sin(rad)
    plotx.append(x)
    ploty.append(y)

pyplot.plot(plotx, ploty)
pyplot.axis("square")
pyplot.show()

線の描画ができるようになるととりあえずやってみたくなる課題が『円を描く』です。内容は高1レベルの比較的簡単な数学ですが、sinやcosなどの数学関数ライブラリの使用法を確認することができ、また点や線分の描画方法も学べるので、入門にはうってつけです。

コードの説明

冒頭部分

import math
from matplotlib import pyplot

sinやcosのような数学の関数を使うためには mathモジュールをimportします。

from import文

2行目の

from matplotlib import pyplot

は、

from モジュール名 import メンバ名

の書式で、モジュール内のメンバ(モジュール内の関数、クラス、定数など)をimportします。
この例ではmatplotlibモジュールの中のpyplotメンバをimportしています。

このようにすると、本来は

matplotlib.pyplot.plot() 

のように記述するべき所を、モジュール名を省略して

pyplot.plot() 

と記述できるようになります。ソースコードの記述がすっきりしますが、異なるモジュールに同名のメンバが存在することもあるので、なんでもかんでも from import するのはあまりよろしくありません。

プロットのためのデータを作る

plotx = []
ploty = []
for d in range(361):
    rad = d * math.pi / 180
    x=math.cos(rad)
    y=math.sin(rad)
    plotx.append(x)
    ploty.append(y)

プロットのためには、グラフ上の点の座標をいくつかもとめる必要があります。

この例では円を描くため、中心角1度おきに円周上の点の座標を求め、x座標とy座標をそれぞれ別々のリストに格納しています。

plotx = []
ploty = []

x座標を格納するリスト変数をplotx、y座標を格納するリスト変数をplotyとし、それぞれ空のリストで初期化しています。

for d in range(361):

中心角を1度ずつ変化させるためのforループです。角度は変数dで表されます。単位は度です。
range(361)とすると、0, 1, 2, … 360 の要素数361個のrangeオブジェクトが生成されます。range(360)とすると、要素は0, 1, 2, … 359 となり、359度から360度までの中心角1度分の線が繋がらず、隙間が空いてしまいます(解像度によってはほとんど判りませんが)。

mathモジュールの定数・関数の使用
    rad = d * math.pi / 180
    x=math.cos(rad)
    y=math.sin(rad)

三角関数は基本的に引数をラジアンで与えるため、まず度からラジアンへ換算しています。
math.pi はmathモジュールに含まれる定数で、円周率を表します。

座標の計算は、

x座標=cos(中心角)
y座標=sin(中心角)

で行います。高校数学の三角比で学習する式そのままです。

sin、cosを表す関数は、それぞれ math.sin() と math.cos() です。引数には角度をラジアンで与えます。

リストへの追加
    plotx.append(x)
    ploty.append(y)

append()メソッドはリストに要素を追加します。

描画

pyplot.plot(plotx, ploty)
pyplot.axis("square")
pyplot.show()

forループで座標のリストを作成した後、グラフを描画します。

pyplot.plot()メソッド

グラフの描画には、matplotlib.pyplot.plot()メソッドを使用します。このプログラムの例では最初にfrom importしているため、matplotlibを省略して pyplot.plot()と記述できます。

pyplot.plot(x座標のリスト、y座標のリスト)

この時点ではまだグラフのウィンドウは表示されません。

pyplot.axis()メソッド

これは座標軸の描画の縦横比を指定しています。

pyplot.axis(“square”)

とすると縦横比が等しくなります。これがないと、x・y軸の値域が同じでも目盛りの幅が1:1にならず、図形がつぶれて描画されることがあります。

pyplot.show()メソッド

グラフを描画したウィンドウを表示するには、matplotlib.pyplot.show()メソッドを使用します。このプログラムの例ではmatplotlibを省略して記述しています。

実行結果

このプログラムを実行すると、ウィンドウが開いて円が表示されます。

動作を確認したら右上の×ボタンをクリックしてウィンドウを閉じて下さい。閉じないとプログラムが終了しません。

いろいろやってみよう

多角形を描く

さて、プログラムの説明で気付いたかと思いますが、『円を描く』といいつつ実はこれは『正三百六十角形』です。まぁこれくらい細かいと標準的な解像度では円とほぼ区別がつかないと思いますが。

※そもそもファイル名がdrawpolygon.pyでした…

せっかくなので、これを応用していろいろな正多角形を描いてみましょう。

ソースコードの

for d in range(361):

の部分を、

for d in range(0,361,60):

に変更してみて下さい。

引数3つの range() の意味は、

range(start, stop, step)

です。最初の値がstartで、stepずつ加算しつつstop未満の数を要素に持つrangeオブジェクトを生成します。

この例の range(0, 361, 60) だと、0, 60, 120, 180, 240, 300, 360 が要素となります。

では実行してみましょう。

どんどん試してみましょう。

range(0, 361, 72)

正五角形です。

range(0,361,120)

正三角形です。

中学校程度の数学の知識があれば、range()の第3引数stepの値が1つの外角の大きさとなるような正多角形が描画されることが判るでしょう。

では、ちょっとしたクイズです。次のような星形はどうやったら描けるでしょうか?

グラフの描画形式をいろいろ変更する

グラフを描く線の色や線種、マーカーなどを設定することもできます。

ソースコードを以下のように修正して下さい。コメントがついている行が修正・追加部分です。

import math
from matplotlib import pyplot

plotx = []
ploty = []

for d in range(0,361,60):                                                   # 効果が判りやすいよに六角形に
    rad = d * math.pi / 180
    x=math.cos(rad)
    y=math.sin(rad)
    plotx.append(x)
    ploty.append(y)

pyplot.plot(plotx, ploty, linestyle="dashed", color="red", marker="o")      # 線の種類や色、マーカーを指定
pyplot.axis("square")
pyplot.title("Polygon")                                                     # グラフタイトル
pyplot.xlabel("X-Axis")                                                     # 座標軸ラベル
pyplot.ylabel("Y-Axis")                                                     # 座標軸ラベル
pyplot.show()

では修正部分について順に見ていきましょう。

グラフの線の種類、色、マーカーの指定

pyplot.plot(plotx, ploty, linestyle="dashed", color="red", marker="o")

pyplot.plot() メソッドは、オプションの引数でグラフ描画の線の種類や色、プロットした点のマーカーを指定することができます。

指定項目=値

という引数を、必要な数だけ追記します。順不同です。

線の種類

グラフの線の種類は、linestyle (または ls )で指定することができます。指定できる値は、

指定値省略表記意味
solid(デフォルト)実線
dashed破線
dotted:点線
dashdot-.一点鎖線
none(半角空白)線の描画なし

です。上の表にあるもの以外にカスタマイズする(たとえば上の表にない二点鎖線を作る)方法もあるのですが、それは別の機会に。

項目名と値の両方に省略表記があるので、たとえば破線でグラフを描画したい場合は、

linestyle=”dashed”
linestyle=”–“
ls=”dashed”
ls=”–“

という4種類の書き方があります。

線の色

グラフの線の色は、color(または c )で指定することができます。指定できる値は、HTMLやCSSと同様の英語色名または#xxxxxx(RGB16進数)です。

たとえば線を赤色にしたい場合は、

color=”red”
color=”#ff0000″
c=”red”
c=”#ff0000″

という書き方があります。

マーカー

プロットした点(この例では多角形の頂点、一般的なグラフならデータが存在する点)に表示するマーカーを指定します。

使用できるマーカーは非常に多く、またカスタマイズすることもできるのですが、詳細は別の機会に。ここではよく使われるものをいくつか紹介します。指定文字はすべて半角英文字・半角記号です。

指定文字意味
o●(円)
s■(正方形)
++(プラス)
v▼(下向き三角形)
^▲(上向き三角形)

グラフのタイトル、座標軸ラベルの指定

pyplot.title("Polygon")                                                     # グラフタイトル
pyplot.xlabel("X-Axis")                                                     # 座標軸ラベル
pyplot.ylabel("Y-Axis")                                                     # 座標軸ラベル

この部分では、グラフのタイトル、座標軸ラベルを指定しています。それぞれ書式は、

pyplot.title(タイトル文字列)
pyplot.xlabel(x軸のラベルの文字列)
pyplot.ylabel(y軸のラベルの文字列)

日本語を使いたい場合は、

pyplot.title("多角形を描いてみた", fontname="MS Gothic")
pyplot.xlabel("X軸", fontname="MS Gothic")
pyplot.ylabel("Y軸", fontname="MS Gothic")

のように、オプションで日本語表示可能なフォントを指定しなければいけないようです(Matplotlibのデフォルトのフォントが日本語非対応なのでしょう)。上の例の”MS Gothic”はWindows系PCなら必ずインストールされていると思いますが、MacOSやLinuxでは別のフォント名にしなければいけないかもしれません(手元に試せる環境がないので…)。

表示例

例の通りだと、このような表示になります。

他にも多数の表示項目や指定可能な値がありますので、いろいろ試してみて下さい。

というわけで。

『グラフを描く』といいつつ、多角形のお絵かきで遊んだだけになってしまいました。次回こそ真面目にグラフを描きます。

コメント

タイトルとURLをコピーしました