カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

plt

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

2021年9月17日

こんな人にオススメ

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

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

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

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

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

続きを見る

運営者のメガネです。YouTubeTwitterInstagramも運営中。自己紹介お問い合わせページあります。

運営者メガネ

作成したコード全文

下準備

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のグラフはコード終了と共に消える。

円グラフ作成用の関数

# シンプルに円グラフにすると反時計回りに配置される
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, 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】感染者数と死者数の散布図コロナマップを作成

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

完全ワイヤレスイヤホン(TWS)

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-plt
-, , ,