[matplotlib] 2.matplotlibで画像つき円グラフ

matplotlib

pythonのmatplotlibを使って画像つき円グラフを作成する

データはWebブラウザ chromeの恐竜ゲームの死因となっている。
Chromeでchrome://dinoにアクセスすればオフラインでも遊べる。

データの中身としては、Deadが死因で、サボテンに当たって死んだ場合は”sabo”でそのあとの数は生えてるサボテンの数となる。
鳥に当たって死んだ場合は”bird”でそのあとの”h,m,l” は鳥の飛んでいる高さを表す。(h: high, m: middle, l: low)

DateDead
2018-09-09
bird_m
2018-09-10bird_h
2018-09-11sabo_4
2018-10-02sabo_1

コード

解説

データの集計

sabo_num = data['Dead'].str.contains('sabo').sum()

[dead]の列で要素の一部に”sabo”を含むデータの総数を求める。

画像の読み込み

img_c = plt.imread('image/plant_cactus.png')

plt.imreadで画像を読み込む。

円グラフ

plt.axis('equal')

グラフの形を正方形にして円が楕円になるのを防ぐ。matplotlib3.0以降では自動的にアスペクト比が揃うので不要となる。

ax.pie(data, labels=label,autopct="%.1f%%", labeldistance=0.4)

autopctで各データの割合を%で表示する。”%.1f%%”で##.#%のかたちで表示することになる。整数で表示したい場合は”%d%%”とする。
labeldistanceでラベルの位置を設定する。 0が中心で1が外周となる。1.1とかにすれば外側にラベルを置ける。

画像の挿入

imagebox = OffsetImage(img_c, zoom=0.3)

画像をimageboxにいれる。大きさはzoomで調整可能。

im_sabo = AnnotationBbox(imagebox, (-0.7, 0),
xybox=(-1.5, 0),
xycoords='data',
boxcoords="data",
pad=0.3,
arrowprops=dict(arrowstyle="simple, head_width = 0.4, head_length = 0.4",
                  lw=0.1,fc="0", ec="0"))

AnnotationBboxで画像を挿入する。(-0.7,0)が矢印の先端の位置。(-1.5,0)が画像の位置。
xycoords,boxcoordsは基準座標の設定、円グラフで”data”とした場合、中心0の半径1の円となるので、左端が(1,0), 右端が(-1,0), 上端が(0,1), 下端が(0,-1)となる。
padは画像とその枠との間隔となる。
arrowpropsは矢印の設定であり、arrowstyleは
arrowstyle=”simple, head_width = 0.4, head_length = 0.4″
と”simple, head_width = 0.4, head_length = 0.4″まで全部文字列でつながっているので注意が必要となる。矢印の線の太さ(lw)はarrowstyleではなく、fc,ecは矢印のfacecolorとedgecolorであり、”0”で黒となる。

参考

python 3.6.5
pandas 0.23.4
matplotlib 2.2.3

コメント