実はMatplotlib
には、円や四角形など様々な図形を描画する機能が備わっています。
そこで、今回は…
Matplotlib
でグラフ内に図形を描くにはどうしたらいいの?- 図形の色や枠線の設定のしかたがわからない!
という方のために、
Matplotlib
で円や四角形、矢印などの図形を描く方法- 図形の見た目を自分好みにアレンジする方法
について紹介します。
実はMatplotlib
のグラフは、基本的な図形の組み合わせで描かれています。
そのため、図形のスタイル設定を覚えるとグラフのスタイル設定もうまくできるようになってきます!
- Matplotlibで図形を描くための基本パターンの紹介
- 図形のスタイル設定方法
- 図形に凡例を設定
- Matplotlibで描ける図形
- 円、楕円、扇形、円弧の描き方
- 四角形、装飾ありの四角形
- 正多角形、複雑な多角形
- おわりに:Matplotlib関連記事の紹介
Matplotlibで図形を描くための基本パターンの紹介
Matplotlib
ではpatches
というモジュールに、様々な図形のクラスが用意されています。
patches
内の図形クラスを使うことで、グラフ内に手軽に図形を描くことができます。
まずは、円や四角形など基本的な図形を例にして、図形描画の基本パターンを紹介します。
図形描画には、Axes
オブジェクトのメソッドを使用します。
【参考】オブジェクト指向のグラフ描画については次の記事をチェックしてください。
図形描画の基本パターン
おおまかに次の手順を踏んでいきます。
matplotlib.patches
モジュールの読み込みAxes
オブジェクト生成- 図形オブジェクト生成
Axes
に図形オブジェクト追加・表示
この手順に沿って、円と四角形を描画してみます。
# 1. matplotlib.patchesモジュールの読み込み
import matplotlib.pyplot as plt
from matplotlib import patches
# 2. Axesオブジェクト生成
fig, ax = plt.subplots(figsize=(4,4))
ax.set_xticks([-2, -1, 0, 1, 2])
ax.set_yticks([-2, -1, 0, 1, 2])
ax.grid()
# 3. 図形オブジェクト生成
c = patches.Circle( xy=(0,0), radius=1) # 円のオブジェクト
r = patches.Rectangle( xy=(1,1) , width=1, height=1) # 四角形のオブジェクト
# 4. Axesに図形オブジェクト追加・表示
ax.add_patch(c)
ax.add_patch(r)
plt.show()
では、各手順について詳しく解説していきます。
1. matplotlib.patches
モジュールの読み込み
Matplotlib
を使用するときは、pyplot
を読み込むことが多いですね。
図形を描くときは、図形クラスが用意されているpatches
も読み込みましょう。
import matplotlib.pyplot as plt
from matplotlib import patches
2. Axes
オブジェクト生成
次に図形を描画するAxes
オブジェクト(座標軸)を生成します。
ここでは、描いた図形が見やすいように、グラフのサイズや目盛りも設定しています。
# figとaxの生成(グラフサイズを引数で設定)
fig, ax = plt.subplots(figsize=(4,4))
# 軸目盛の設定と目盛り線の表示
ax.set_xticks([-2, -1, 0, 1, 2])
ax.set_yticks([-2, -1, 0, 1, 2])
ax.grid()
- 【参考】軸周りの設定については次の記事で紹介しています。
3. 図形オブジェクト生成
基本的な例として、円と四角形のオブジェクトを作成してみます。
- 円は
Circle
クラス - 四角形や
Rectangle
クラス
のように描きたい図形に対応するクラスを使用します。
# Circleクラスで円のオブジェクトを作成
c = patches.Circle( xy=(0,0), radius=1)
# Rectangleクラスで四角形のオブジェクトを作成
r = patches.Rectangle( xy=(1,1) , width=1, height=1)
各図形のクラスの種類や引数の詳細については後述します。
4. Axesに図形オブジェクト追加・表示
最後に作成した図形オブジェクトをax
に追加して、グラフを表示します。
ax.add_patch(c)
ax.add_patch(r)
plt.show()
これが基本的な図形の描画パターンです。
以下では、より詳しい内容として
- 図形のスタイル設定方法
- 図形に凡例を設定する方法
Matplotlib
で描ける図形
について解説していきます。
図形のスタイル設定方法
図形を描く際にキーワード引数を指定すると、図形のスタイルを変更することができます。
図形の色や枠線のスタイル設定など使用頻度が高いものを紹介します。
設定内容 | キーワード引数名 | 略称 | 設定値の例 |
---|---|---|---|
塗りつぶしの色 | facecolor |
fc |
色の名前など ex) gray , red , blue |
塗りつぶしの透明度 | alpha |
0 (完全透明)~1 (不透明) |
|
図形の塗りつぶしの有無 | fill |
True (デフォルト) or False |
|
図形の柄 | hatch |
/' , '\', '|' , '-' , '+' , 'x' , 'o' , 'O' , '.' , '*' で指定 |
|
枠線の色 | edgecolor |
ec |
色の名前など ex) gray , red , blue |
枠線の太さ | linewidth |
lw |
数値 ptで指定 |
枠線のスタイル | linestyle |
ls |
- , -- , -. , : , で指定 |
図形の色 (fc と ecを上書き) |
color |
色の名前など ex) gray , red , blue |
円を例に枠線、塗りつぶし、柄を設定する例を紹介します。
c = patches.Circle( (0,0), 1, facecolor="pink", edgecolor="red", hatch ="X")
ax.add_patch(c)
plt.show()
以下のサンプルコードでも様々なスタイルの設定例を紹介していますので、参考にしてみてください。
図形に凡例を設定
グラフを描くときと同様に凡例を設定することができます。
凡例を設定するには、次の手順を踏みます。
- 図形のラベル名の指定|
label = "label_name"
- 凡例の表示|
plt.legend()
fig, ax = plt.subplots(figsize=(4,4))
x = np.linspace(-2, 2)
y = 0.5*x**2
ax.plot(x, y)
ax.set_xticks([-2, -1, 0, 1, 2])
ax.set_yticks([-2, -1, 0, 1, 2])
ax.grid()
c = patches.Circle( (0,0), 0.2, facecolor="pink", edgecolor="red", label="vertex")
ax.add_patch(c)
plt.legend()
plt.show()
図形の意味を説明するときに便利ですね。
【参考】凡例の詳しい設定方法については、次の記事で紹介しています。
Matplotlibで描ける図形
Matplolib
で描ける図形とクラスの対応表は次の通りです。
分類 | 図形名 | クラス |
---|---|---|
円 | 円 | .Circle() |
楕円 | .Ellipse() |
|
扇形 | .Wedge() |
|
円弧 | .Arc() |
|
四角形 | 四角形 | .Rectangle() |
装飾あり四角形 | .FancyBox() |
|
多角形 | 正多角形 | .RegularPolygon() |
複雑な多角形 | .Polygon() |
|
矢印 | 矢印 | .Arrow() |
装飾あり矢印 | .FancyArrow() |
以下で各図形について解説していきます。
円、楕円、扇形、円弧の描き方
円関係の図形とクラスの関係は次の通りです。
各図形の描き方について見ていきましょう。
円
円はCircle
クラスで描きます。
.Circle(xy, radius)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
円の中心座標 | タプルやリストなど:(x, y) 形式 |
radius |
円の半径 | 数値 |
円のスタイル設定例として、赤い円を描いてみます。
c = patches.Circle( (0,0), 1, facecolor="pink", edgecolor="red", label="circle")
ax.add_patch(c)
plt.legend()
plt.show()
楕円
楕円はEllipse
クラスで描きます。
.Ellipse(xy, width, height, angle=0)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
円の中心座標 | タプルやリストなど:(x, y) 形式 |
width |
長軸の長さ | 数値 |
height |
短軸の長さ | 数値 |
angle(省略可) |
楕円の回転角度(°) | 数値(デフォルト=0 ) |
楕円のスタイル設定例として、赤で柄を付けてみましょう。
e = patches.Ellipse( (0,0) , 2, 1, facecolor="pink", edgecolor="red", hatch= "X", label="ellipse")
ax.add_patch(e)
plt.legend()
plt.show()
扇形
扇形はWedge
クラスで描きます。
.Wedge(center, r, theta1, theta2, width=None)
変数名 | 設定内容 | 型など |
---|---|---|
center |
扇形の中心座標 | タプルやリストなど:(x, y) 形式 |
r |
半径の半径 | 数値 |
theta1 |
扇の開始角度(°) | 数値 |
theta2 |
扇の終了角度(°) | 数値 |
width (省略可) |
扇の幅(r-width 分削られる)省力すると普通に扇が描かれる |
数値 (デフォルト: None ) |
扇形の例として、通常の扇形とwidth
を設定した扇を並べてみましょう。
w = patches.Wedge( (0,0) , 1, theta1=0, theta2 = 135, color="pink", label="Wedge")
w2 = patches.Wedge( (0,0) , 1, theta1=135, theta2 = 315, width=0.3, color="skyblue", label="Wedge2")
ax.add_patch(w)
ax.add_patch(w2)
plt.legend()
plt.show()
実はMatplotlib
では円グラフは扇形を複数並べることで作られています。
扇形の引数の内容がわかると、円グラフの色付けやドーナツグラフの作成方法がよくわかってきます。
円弧
円弧はArc
クラスで描きます。
.Arc(xy, width, height, angle=0.0, theta1=0.0, theta2=360.0)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
円弧の中心座標 | タプルやリストなど:(x, y) 形式 |
width |
長軸の長さ | 数値 |
height |
短軸の長さ | 数値 |
angle (省略可) |
円弧の回転角度(°) | 数値(デフォルト=0 ) |
theta1 (省略可) |
円弧の開始角度(°) | 数値(デフォルト=0 ) |
theta2 (省略可) |
円弧の終了角度(°) | 数値(デフォルト=360 ) |
円弧のスタイル設定例として、0°
~270°
の円弧を赤点線で描いてみます。
a = patches.Arc( (0,0), 1, 1, theta1=0, theta2=270, edgecolor="red", linestyle="--", linewidth="2", label="arc")
ax.add_patch(a)
plt.legend()
plt.show()
四角形、装飾ありの四角形
四角形の図形とクラスの関係は次の通りです。
FancyBox
はboxstyle
を変更すると様々なスタイルを設定できます。
各図形の描き方について見ていきましょう。
四角形
四角形はRectangle
クラスで描きます。
.Rectangle(xy, width, height, angle=0.0)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
四角形左下の頂点座標 | タプルやリストなど:(x, y) 形式 |
width |
四角形の横幅 | 数値 |
height |
四角形の高さ | 数値 |
angle (省略可) |
四角形の回転角度(°) | 数値(デフォルト=0 ) |
四角形の座標は中心各ではなく、左下の角度を指定する点に注意しましょう。
例として、四角形を描いてみます。
ここではスタイルの指定例として、塗りつぶしをオフにしてみます。
r = patches.Rectangle( (0,0) , 1.5, 1, fill=False, edgecolor="blue", linewidth=3, label="rectangle")
ax.add_patch(r)
plt.legend()
plt.show()
装飾ありの四角形
装飾ありの四角形はFancyBox
クラスで描きます。基本的な引数は次の通りです。
.FancyBox(xy, width, height, boxstyle='round')
変数名 | 設定内容 | 型など |
---|---|---|
xy |
四角形左下の頂点座標 | タプルやリストなど:(x, y) 形式 |
width |
四角形の横幅 | 数値 |
height |
四角形の高さ | 数値 |
boxstyle (省略可) |
四角形のスタイル(装飾) | 文字列等でスタイル指定 (デフォルト= 'round' ) |
FancyBox
のデフォルトのスタイルは各丸四角形という角が丸っこい四角形です。
a = patches.FancyBboxPatch( (0,0) , 1.5, 1, boxstyle="round", label="round (default)" , color="skyblue")
ax.add_patch(a)
plt.legend()
plt.show()
その他の設定できるスタイルを表示してみましょう。
fig, ax = plt.subplots(figsize=(4,4))
ax.axis([0,18,0,18])
boxstyles=["circle", "darrow", "larrow", "rarrow", "round", "round4","roundtooth", "sawtooth", "square"]
# colormapの設定
cmap = plt.get_cmap("tab10")
for i, boxstyle in enumerate(boxstyles):
b = patches.FancyBboxPatch( (2,i*2+1) , 1.5, 0.5, facecolor=cmap(i), boxstyle=boxstyle)
ax.add_patch(b)
plt.text(4.5,i*2+1,boxstyle)
plt.show()
正多角形、複雑な多角形
様々な多角形を描くためのクラスとして、
.RegularPolygon()
|正多角形.Polygon()
|複雑な多角形
を紹介していきます。
各図形の描き方について見ていきましょう。
正多角形
正多角形はRegularPolygon
クラスで描きます。
.RegularPolygon(xy, numVertices, radius=5, orientation=0)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
正多角形の中心座標 | タプルやリストなど:(x, y) 形式 |
numVertices |
頂点の数 | 数値 |
radius (省略可) |
中心から頂点までの長さ | 数値 (デフォルト値= 5 ) |
Orientation (省略可) |
回転角度(radian) | 数値(デフォルト=0 ) |
for文
を利用して、正三角形から正六角形までを描いてみましょう。
fig, ax = plt.subplots(figsize=(4,4))
ax.axis([2, 7, 0, 5]) # 軸の設定
ax.grid()
for i in range(3, 7):
rp = patches.RegularPolygon( (i, 2) , i, 0.5, color="green", alpha=i*0.1)
ax.add_patch(rp)
plt.text(i, 2.7, i, size="xx-large", ha="center")
plt.show()
複雑な多角形
Polygon
クラスでは、頂点の座標をリスト形式で与えて、複雑な多角形を描くことができます。
- .Polygon(xy, closed=True)
変数名 | 設定内容 | 型など |
---|---|---|
xy |
多角形の頂点の座標リスト | 頂点座標をリストなどで指定:[(x1, y1), (x2, y2),…] 形式 |
closed |
最初の頂点と最終頂点を線で繋ぐか | True or False |
適当な座標を与えて複雑な多角形を描いてみます。
xy = [(-2,-1), (-1, 1), (0, 0), (1, 2), (2, 0)]
a = patches.Polygon( xy, facecolor="skyblue", edgecolor="black")
ax.add_patch(a)
plt.show()
closed = False
を指定すると最初の頂点と最後の頂点が結ばれず、開いた図形になります。
xy = [(-2,-1), (-1, 1), (0, 0), (1, 2), (2, 0)]
a = patches.Polygon( xy, closed =False, facecolor="skyblue", edgecolor="black")
ax.add_patch(a)
plt.show()
おわりに:Matplotlib関連記事の紹介
今回は、Matplotlib
で様々な図形を描く方法を紹介しました。
実はMatplotlib
のグラフは、今回紹介した図形の組み合わせで描かれています。
そのため、基本的な図形のスタイル設定を覚えるとグラフのスタイル設定もうまくできるようになってきます!
Matplotlib
マスターを目指す皆さんへの次のおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!