こんな人にオススメ
matplotlib.pyplot
、plt
で円グラフなるものを描いてみたいんだけど、その引数ってどんな感じ?
どんな引数を入れるとどんな感じの円グラフになるの?
ということで、今回はplt
を使用した円グラフの描き方を引数を色々といじって試してみる。plt
の円グラフではサクッと簡単にキレイにできるから便利。
なお、plotlyでの円グラフは以下の記事で解説している。
-
-
【plotly&円グラフ】世界のスマホ出荷台数をgo.Pieで円グラフ化
続きを見る
作成したコード全文
下準備
import sys import matplotlib.pyplot as plt sys.path.append('../../') import plt_layout_template as template plt.ioff() # code runnerを使用する際にはコメントアウトを外す
まずは下準備としてのimport
関連。plt_layout_template
はplt
でサクッとキレイなグラフを描くためのグラフテンプレート。以下の記事参照。
-
-
【pltテンプレート】matplotlib.pyplotのグラフ作成テンプレート
続きを見る
plotly
の場合はテンプレートをグラフに読み込まなくてはいけなかったが、plt
の場合はimport
するだけでテンプレートが書き換えられる。
なお、VScodeの「Code Runner」を使用している場合はplt.ioff()
を実行する。こうしないとplt
のグラフはコード終了と共に消える。
円グラフ作成用の関数
# シンプルに円グラフにすると反時計回りに配置される def simple_pie(data: dict, save_name, show=True, **kwargs): fig, ax = plt.subplots(1, 1) labels, sizes = list(data), data.values() ax.pie(sizes, labels=labels, **kwargs) # labelsでラベルをつけられる if show: # showがTrueの時だけ表示する plt.show() fig.savefig(f"{save_name}.png")
まずは円グラフを描くための関数を定義しておく。今回は色んな引数を試すので、予め関数化しておいて後から引数だけ入れられるようにすると楽。
関数と引数の関係については以下。plotly
で書いてあるがplt
でも基本は一緒。**kwargs
を使用することで楽ができる。
円グラフにもプロットデータとラベルという考え方がある。今回はこれらを引数data
としてdict
形式で受け取り、変数labels
, sizes
でそれぞれラベルとセクターの大きさとする。
引数のshow
は円グラフを表示するかどうかを決めるというものだが、これは執筆者がCode Runnerを使用する際に必要となるもの。後で解説する。
関数を使用しない時のイメージ
# 関数を使用しない場合は以下のように書ける # dataには円グラフにしたいデータをdict形式で # **kwargsは円グラフの設定をdict形式(a=Trueのような感じ)で # save_nameにはグラフ保存時のファイル名を fig, ax = plt.subplots(1, 1) labels, sizes = list(data), data.values() ax.pie(sizes, labels=labels, **kwargs) # labelsでラベルをつけられる plt.show() fig.savefig(f"{save_name}.png")
もし関数を使用せずに円グラフを描きたいなら上のような感じで作成すればいい。data
, kwargs
はdict
形式で入れる必要がある。
配列から円グラフを作成
まずは簡単にデータから円グラフを作成する。シンプル。
データの合計値100
円グラフを構成する値の合計値が100の場合は、その値にしたがって円グラフが作成される。関数定義時も書いたが、円グラフは反時計回りで作成される。
また、データの始まりは3時の方向、すなわち右方向。上から始まるものではないので注意。上からにする方法は後述。
# データの合計値が100の場合 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='100')
データの合計値が100ではない
データの合計値が100でない場合は勝手にその比率から円グラフが埋まるように作成される。
# データの合計値が100ではない場合は勝手に比率から100パーセントの円グラフに data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 10} simple_pie(data, save_name='not100')
円グラフに凡例を追加
凡例を追加するにはプロットした後に凡例を表示すればいい。関数の中でグラフを表示してしまうと凡例を表示する隙がなくなるので、ここでは回り道。
一旦グラフを作成した後に凡例を表示し、そしてグラフ本体を表示する。savefig
よりも先にshow
してしまうとグラフを保存できないので注意。
# 凡例を追加 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='legend', show=False) plt.legend(data) plt.savefig('legend.png') plt.show() # 先にshowすると凡例が追加できない
円グラフに値を追加
円グラフの構成値を表示するには引数autopct
を使用。.1f
で小数第一位まで表示し、%%
で「%」を表示している。今回のデータでは合計値が100なので単位を%とした。
# 円グラフ内に値を追加 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='values', autopct='%.1f%%')
時計回りに配置
デフォルトではセクターが反時計回りに配置されるが、引数counterclockをFalseにすることで時計回りに変更することが可能。ただし、相変わらず始まりは3時の方向から。
# セクターの配置を時計回りに変更 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='counterclock', counterclock=False)
円グラフと色
基礎的な円グラフは作成した。ここでは円グラフの色関係の編集をする。
セクターの色を変更
各セクターの色を変更したい場合は引数colors
で指定すればいい。また、以下にあるようにblackははみ出た分の色だが、こちらは円グラフには反映されない。
# セクターに色を追加(はみ出た色は無視) colors = ('crimson', 'deepskyblue', 'lime', 'violet', 'black') data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='colors', colors=colors)
また、指定する色の配列数が足りていないと、指定した色が繰り返される。ここではcrimson
とdeepskyblue
が繰り返されている。
# セクターに色を追加(はみ出た色は無視) colors = ('crimson', 'deepskyblue') data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='colors_lack', colors=colors)
小数の文字列で白黒
色を直接指定しなくても、文字列の小数値を指定することでも色付けすることが可能。この場合は0が黒で1が白となる。0を下回る、1を超えるとエラーとなる。
# 文字列の0-1の数値で白黒の円の色付け colors = ('0', '0.2', '0.5', '1.0') data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='bw', colors=colors)
円グラフに影をつける
円グラフには影をつけることが可能。影は引数shade
でつけることができるが、単につけるだけのようだ。まあ使う機会はあまりないだろう。
# 円グラフに影をつける data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='shade', shadow=True)
セクターや円グラフの見た目
円グラフの作成から色の編集を行なった。ここではセクター自体や円グラフの見た目を変更する方法を解説。
円グラフの始まりを12時の方向に
plt
の円グラフは始まりが3時の方向だった。それを12時の方向に変更したいなら引数startangle=90
と指定すればいい。90°反時計回りに回転してくれる。
# 開始位置を90°にすると12時の方向が起点 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='90deg', startangle=90)
また、セクターの並びを反時計回りから時計回りに変更したい場合はさらに**counterclock=False
にする。これは先ほど示した。**
# 時計回りにするといつもの円グラフに simple_pie( data, save_name='90deg_counterclock', startangle=90, counterclock=False, )
円グラフの半径を変更する
円グラフ自体の半径を変更するには引数radius
を指定。上の円グラフでは半径を2とした。
# 円グラフの半径を大きくする data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='radius2', radius=2)
また、0.3とすると以下のようになる。小さい。
# 円グラフの半径を小さくする data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='radius03', radius=0.3)
セクターを円グラフから離す
各セクターを円グラフから離す場合は引数explode
を指定すればいい。explode
は配列で指定し、0だと円グラフの中心からセクターが始まる。
# セクターを円グラフから離す data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} explode = (0, 0.2, 0, 1) simple_pie(data, save_name='explode_arr', explode=explode)
なお、explode
は配列でないとエラーであり、配列の要素数はデータ数と一致している必要がある。以下ではexplode
の数が3なのでデータ数よりも少なくエラー。
# 数が足りなかったり、配列じゃなかったりするとエラー simple_pie(data, save_name='explode', explode=(0, 0.2, 0)) # ValueError: 'explode' must be of length 'x'
各セクターの透明度を変更&枠線追加
各セクターの透明度や枠線の追加は引数wedgeprops
を使用することで行う。wedgeprops
はdict
形式で指定し、これのkey
に色々な設定を盛り込む。
# 各セクターの透明度を変更し、枠線を追加 wedgeprops = {'alpha': 0.5, 'edgecolor': 'black', 'linewidth': 4} data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='wedgeprops', wedgeprops=wedgeprops)
ラベルや構成値の位置と色
最後は円グラフのラベルや構成値の位置や色について。より見やすいように工夫する点だ。
円グラフに沿ってラベルを回転
円グラフのラベルを円グラフに沿って回転するように配置することが可能。引数rotatelabels=Trueとすることで沿わせることが出来る。いつ使うのか。
# 円グラフに沿ってラベルを回転 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='rotatelabels', rotatelabels=True)
円グラフのラベル位置をズラす
円グラフのラベルの位置を変更することも可能。引数labeldistance
で値を入力することで中心からの位置として設定する。
# 円グラフのラベルを置く位置をズラす data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='labeldistance', labeldistance=0.1)
円グラフの構成値を置く位置をズラす
autopct
を使用して構成値を表示するという方法は既に紹介した。ここではこの構成値の位置をpctdistance
の値によって変更する。今回は小数点以下を4桁表示した。
# 円グラフの構成値を置く位置をズラす data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} simple_pie(data, save_name='pctdistance', pctdistance=0.9, autopct='%.4f%%')
ラベルや構成値のスタイルを変更
ラベルや構成値の書式を変更するには引数textprops
を使用する。ここでは太字に車体、赤色を実装した。data4
がほぼ見えない。
# ラベルや構成値のスタイルを変更 data = {'data1': 10, 'data2': 20, 'data3': 30, 'data4': 40} # サイズ20で太字に斜体、色は赤色のラベルに変更 textprops = {'size': 20, 'weight': 'bold', 'style': 'italic', 'color': 'red'} simple_pie(data, save_name='textprops', textprops=textprops, autopct='%.4f%%')
なお、色を配列にするとエラーなので、全てのラベルで同じスタイルになるようだ。
# 色を配列にするとエラー textprops = {'color': ['red', 'blue', 'green', 'orange']} simple_pie(data, save_name='textprops2', textprops=textprops, autopct='%.4f%%') # ValueError: ['red', 'blue', 'green', 'orange'] is not a valid value for color
簡単に円グラフ
今回はplt
を使用して円グラフを描く方法について解説した。plt
の円グラフは比較的カスタムできる要素が少ないように感じた。単一の色やスタイル、変更部分のレパートリーの少なさ。
やっぱりplotly
の方がイジリがいがあるしカスタムも楽しい。その反面、plt
だとサクッと簡単に描けるのがいいだろう。
円グラフはマイナーな部類に入るだろうから、どんなことができるのかをフワッとでも知っておくのがいいだろう。
関連記事
-
-
【plt vs plotly】matplotlibとgoでグラフの比較
続きを見る
-
-
【plt&mpld3】pltで作ったグラフを後から編集できるようにhtmlで保存
続きを見る
-
-
【plt&棒グラフ】pythonのmatplotlibで棒グラフを作成してみる
続きを見る
-
-
【plotly&mapbox】感染者数と死者数の散布図コロナマップを作成
続きを見る