カテゴリー

plt

【plt&円グラフ】plt.pieでmatplotlibの円グラフを作成

2021年9月17日

こんな人にオススメ

matplotlib.pyplotpltで円グラフなるものを描いてみたいんだけど、その引数ってどんな感じ?

どんな引数を入れるとどんな感じの円グラフになるの?

ということで、今回はpltを使用した円グラフの描き方を引数を色々といじって試してみる。pltの円グラフではサクッと簡単にキレイにできるから便利。

なお、plotlyでの円グラフは以下の記事で解説している。

【plotly&円グラフ】世界のスマホ出荷台数をgo.Pieで円グラフ化

続きを見る

スポンサーリンク
スポンサーリンク

運営者のメガネと申します。TwitterInstagramも運営中。

自己紹介はこちらから、お問い合わせはこちらからお願いいたします。

運営者メガネ

作成したコード全文

下準備

import sys
import matplotlib.pyplot as plt

sys.path.append('../../')
import plt_layout_template as template
plt.ioff()  # code runnerを使用する際にはコメントアウトを外す

まずは下準備としてのimport関連。plt_layout_templatepltでサクッとキレイなグラフを描くためのグラフテンプレート。以下の記事参照。

plt.rcParamsでデフォルトを変更した後のグラフ
【pltテンプレート】matplotlib.pyplotのグラフ作成テンプレート

続きを見る

plotlyの場合はテンプレートをグラフに読み込まなくてはいけなかったが、pltの場合はimportするだけでテンプレートが書き換えられる。

なお、VScodeの「Code Runner」を使用している場合はplt.ioff()を実行する。こうしないとpltのグラフはコード終了と共に消える。

【VScode&拡張機能】python・C・LaTeX...ユーザーのVisual Studio Code拡張機能

続きを見る

円グラフ作成用の関数

# シンプルに円グラフにすると反時計回りに配置される
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を使用することで楽ができる。

【plotly&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, kwargsdict形式で入れる必要がある。

配列から円グラフを作成

まずは簡単にデータから円グラフを作成する。シンプル。

データの合計値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)

また、指定する色の配列数が足りていないと、指定した色が繰り返される。ここではcrimsondeepskyblueが繰り返されている。

# セクターに色を追加(はみ出た色は無視)
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を使用することで行う。wedgepropsdict形式で指定し、これの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】感染者数と死者数の散布図コロナマップを作成

続きを見る

関連コンテンツ

スポンサーリンク

Amazonのお買い物で損したない人へ

1回のチャージ金額通常会員プライム会員
¥90,000〜2.0%2.5%
¥40,000〜1.5%2.0%
¥20,000〜1.0%1.5%
¥5,000〜0.5%1.0%

Amazonギフト券にチャージすることでお得にお買い物できる。通常のAmazon会員なら最大2.0%、プライム会員なら2.5%還元なのでバカにならない。

ゲットしたポイントは通常のAmazonでのお買い物に使えるからお得だ。一度チャージしてしまえば、好きなタイミングでお買いものできる。

なお、有効期限は10年だから安心だ。いつでも気軽にAmazonでお買い物できる。

Amazonチャージはここから出来るで

もっとお得なAmazon Prime会員はこちらから

30日間無料登録

執筆者も便利に使わせてもらってる

スポンサーリンク

  • この記事を書いた人

メガネ

独学でpythonを学び天文学系の大学院を修了。 ガジェット好きでMac×Android使い。色んなスマホやイヤホンを購入したいけどお金がなさすぎて困窮中。 元々、人見知りで根暗だったけど、人生楽しもうと思って良い方向に狂ったために今も人生めちゃくちゃ楽しい。 pythonとガジェットをメインにブログを書いていますので、興味を持たれましたらちょこちょこ訪問してくだされば幸いです🥰。 自己紹介→変わって楽しいの繰り返し

-plt
-, ,