Matplotlib
を使えば、簡単に円グラフを描くことができます。
とはいっても、実際に使ってみると次のような問題に直面することも…。
Matplotlib
で円グラフを作成する方法がよくわからない…。- 何を設定すれば、自分の描きたい円グラフになるのかわからない!
そこで、今回は円グラフについて、次の内容をわかりやすく解説しました。
Matplotlib
の円グラフ作成方法- Excel風の見た目に設定する方法
- グラフやラベルの設定方法
「何を設定するとグラフのどこを設定できるか」を覚えれば、自由に円グラフを作成できます!
円グラフをマスターして、伝わるグラフを目指しましょう!
- Matplotlibで円グラフを作成するときの超基本
- 円グラフの基本設定
- 円グラフの見た目変更
- ラベルの見た目変更
- データラベルの設定
- 【応用編】二重ドーナツグラフの作成方法
- オススメ|matplotlibとデータ分析の勉強方法
Matplotlibで円グラフを作成するときの超基本
Matplotlib
で円グラフを作成する際には、主に2つの方式があります。
- pltメソッドの場合:
plt.pie()
- オブジェクト指向の場合:
ax.pie()
この記事では基本的にplt.pie()
で解説しますが、ax.pie()
でも挙動はほぼ同じです。
オブジェクト指向の方はax.pie()
で実行してください。
pltメソッドでのグラフ描画について、よくわからないという方は次のMatplotlib入門記事も参考にしてください。
また、fig, ax = plt.subplots()
で始まるオブジェクト指向のプロットについては、次の記事で解説しています。
基本的な円グラフの作成
基本的な円グラフ作成の流れは、次の通りです。
plt.pie(x)
でプロットを生成plt.show()
でグラフを表示(Notebookの場合は省略可能)
plt.pie()
の必須引数は次の通りです。
引数 | 型 | 内容 |
---|---|---|
x |
リスト やndarray など |
プロットするデータ |
pltメソッドとオブジェクト指向でそれぞれ、基本的な円グラフを描いてみます。
まずMatplotlib
をインポートして、サンプルグラフ用のデータを用意します。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
#円グラフ用データを準備
x = [30, 20, 15, 5]
pltメソッドとオブジェクト指向でそれぞれ円グラフを描きます。
plt.pie(x)
plt.show()
fig, ax = plt.subplots()
ax.pie(x)
plt.show()
pltメソッドでもオブジェクト指向でも同じグラフが出力されます。
このままでは味気ないので、次の順番で円グラフの設定方法を紹介していきます。
- 円グラフの基本設定|Excel風の円グラフ作成
- グラフの見た目変更
- ラベルの見た目変更
- データラベルの設定方法
- 【応用編】二重ドーナツグラフの作成方法
円グラフの基本設定
Matplotlib
の円グラフを見て違和感を覚える方も多いと思います。
というのも、Matplotlib
とExcelで次のような違いがあるためです。
Matplotlib
:角度0°から始まって時計回りにパイが並ぶ- Excelなど:角度90°から始まって反時計回りにパイが並ぶことが多い
そこで、パイの並べ方や凡例を設定して、違和感のない自然な円グラフを作成する方法を紹介します。
設定内容 | キーワード(または関数) | 設定値の例 |
---|---|---|
データラベルの設定 | labels |
[ラベル名のリスト] |
パイの開始位置の設定 | startangle |
数値° デフォルト = 0 |
パイを反時計周りに並べるか | counterclock |
True or False |
凡例の表示 | plt.legend() |
ラベルの表示
ラベル名を設定するには、labels
に[ラベル名のリスト]
を渡します。
labels = [ラベル名のリスト]
データを準備する際にラベル名も一緒に準備すると良いです。
#円グラフ用データを準備
x = [30, 20, 15, 5]
labels = ["Apple", "Banana", "Carrot", "Daikon"]
ラベル名を設定してみます。
plt.pie(x, labels=labels)
ラベル名が表示されました。
ラベル名の位置やフォントなどの詳細設定は後述します。
また、ラベル名に日本語を使用したい場合には特別な設定が必要になります。次の記事を参考にしてください。
グラフの開始角度の設定
グラフの開始角度を設定するには、startangle
に数値°
を設定します。
startangle
=数値
デフォルトは0°で、時計で言うと3時の位置からです。
90°(時計で言うと12時)から始まるグラフの方が見慣れていると思います。
plt.pie(x, labels=labels, startangle=90)
パイを時計回りに並べる
デフォルトでは、パイは反時計回り(左回り)で配置されます。
パイを時計回り(右回り)に並べるには、counterclock=False
を設定します。
counterclock=True
:時計回り(デフォルト)counterclock=False
:反時計回り
plt.pie(x, labels=labels, startangle=90, counterclock=False)
ここまで設定すると、だいぶ見慣れた円グラフになったと思います。
凡例の表示
凡例を表示するには、plt.legend()
を実行します。
plt.pie(x, labels=labels, startangle=90, counterclock=False)
plt.legend()
各データに設定したlabel
をもとに凡例が表示されました。
- 【参考】凡例の詳しい解説は次の記事を参考にしてください
ここまでの設定だけでも、十分な円グラフが描けますね。
以下では、円グラフのより詳細な設定について解説していきます。
円グラフの見た目変更
円グラフの見た目は、plt.pie()
のキーワード引数で変更することができます。
設定内容 | キーワード | 設定値の例 |
---|---|---|
円グラフのサイズ | radius |
数値 デフォルト = 1 |
円グラフの影の有無 | shadow |
True or False デフォルト = False |
パイの色 | colors |
[色名のリスト] |
特定のパイの強調 | explode |
[数値のリスト] 0 より大きい値で強調 |
パイの詳細設定 | wedgeprops |
{辞書型} で詳細を設定可能 |
円のサイズ変更
円グラフのサイズを変更するには、radius
に数値を設定します。
radius=円のサイズ
デフォルトは1
なので、次のように大小が変化します。
radius>1
:円が大きくradius<1
:円が小さく
サンプルデータで挙動を確認してみましょう。
plt.pie(x, labels=labels, startangle=90, counterclock=False, radius=2)
plt.show()
影を描く
円グラフに影を描くには、shadow=True
を指定します。
plt.pie(x, labels=labels, startangle=90, counterclock=False, shadow=True)
plt.show()
パイの色の設定
パイの色を設定するには、colors
に[色名などのリスト]
を渡します。
colors = ["violet", "lightgreen", "orange", "gray"]
plt.pie(x, labels=labels, startangle=90, counterclock=False, colors=colors)
plt.legend()
設定した色は、凡例にも自動で適用されます。
また、カラーマップを使用すると、統一感のある色を手軽に設定できます。
- カラーマップ:Matplotlibに内蔵された色のセットのこと
カラーマップを使用する際は、次の2通りの方法があります。
- カラーマップから
[色のリスト]
を作成して、引数color
に渡す - デフォルトのカラーサイクルを変更する
まずは1のカラーマップから色のリストを作成する例を見てみます。
cmap=plt.get_cmap("Paired") #カラーマップを指定
colors = [cmap(i) for i in range(len(x))] # カラーマップから色のリストを生成
plt.pie(x, labels=labels, startangle=90, counterclock=False, colors=colors)
plt.legend()
- 【参考】個別の色の変更については、次の記事も参考にしてください。
次に2のデフォルトのカラーサイクルを変更する例を見てみます。
plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("Set1").colors)
plt.pie(x, labels=labels, startangle=90, counterclock=False)
plt.legend()
- 【参考】カラーサイクルの変更、カラーマップについては、次の記事で詳しく解説しています。
パイの強調
explode
を指定すると、パイを円から切り離して強調表示することができます。
explode=[パイを離す程度を表す数値のリスト]
サンプルデータで、2つ目のパイだけ切り離して表示してみましょう。
explode = [0, 0.1, 0, 0]
plt.pie(x, labels=labels, startangle=90, counterclock=False, explode=explode)
2つ目のパイが円中心から少し離れて、強調表示されていますね。
パイの詳細設定
wedgeporps
に辞書型でまとめた引数を与えて、パイの詳細設定を行うことができます。
- 例)
wedgeprops={"edgecolor":"white", "width":0.3}
使用頻度が多そうな引数を下の表にまとめました。
キーワード | 設定内容 | 設定値の例 |
---|---|---|
alpha |
パイの透明度 | 0 (完全透明)~1 (不透明) |
edgecolor |
パイの枠線の色 | 色の名前など |
linewidth |
パイの枠線の太さ | 数値 ptで指定 |
width |
表示するパイの幅 | 数値 で指定 |
例1)パイの透明度、パイの枠線を設定
wedgeprops={"alpha":0.7, "edgecolor":"white", "linewidth":2}
plt.pie(x, labels=labels, startangle=90, counterclock=False, wedgeprops=wedgeprops)
白い枠線を付けると、各パイが離れているように見えます。
例2)パイの幅変更|ドーナツグラフ
wedgeprops={"edgecolor":"white", "width":0.3}
plt.pie(x, labels=labels, startangle=90, counterclock=False, wedgeprops=wedgeprops)
Matplotlib
では、扇形を適切に配置することで、円グラフにしています。
そのため、図形の見た目設定をよく理解すれば、棒グラフの設定をより細かく行うことができます。
図形の設定ついては、次の記事を参考にしてください。
ラベルの見た目変更
ラベルの見た目は、plt.pie()
のキーワード引数で変更することができます。
キーワード | 設定内容 | 設定値の例 |
---|---|---|
labeldistance |
ラベルの位置 | 数値 ( None でラベル非表示) |
rotatelabels |
ラベルの回転表示 | True or False |
textprops |
ラベルの詳細設定 | {辞書型} で詳細を設定可能 |
ラベルの位置
ラベルの位置を調整するには、labeldistance
に数値を指定します。
円の中心が0
、円周部分が1
に対応するため、次のようになります。
labeldistance<1
:円上に表示labeldistance>1
:円の外側に表示
サンプルデータで挙動を確認してみましょう。
plt.pie(x, labels=labels, startangle=90, counterclock=False, labeldistance=0.9)
plt.show()
ラベル非表示(凡例のみ表示)
labeldistance
にNone
を指定すると、ラベルを非表示にできます。
plt.legend()
と組み合わせると、凡例のみのグラフが作成できます。
plt.pie(x, labels=labels, startangle=90, counterclock=False, labeldistance=None)
plt.legend()
- 【参考】凡例の詳しい解説は次の記事を参考にしてください
ラベルの回転表示
rotatelabels=True
を指定すると、ラベルが円の外側を向くように回転させることができます。
plt.pie(x, labels=labels, startangle=90, counterclock=False, rotatelabels=True)
labeldistance
, textprops
と組み合わせると、パイ上にラベルを表示することもできます。
textprops={"weight":"bold", "color":"white", "size":"large"}
plt.pie(x, labels=labels, startangle=90, counterclock=False, rotatelabels=True, labeldistance=0.3, textprops=textprops)
ラベルの詳細設定
textprops
に辞書型でまとめた引数を与えて、ラベルの詳細設定を行うことができます。
- 例)
textprops = {"weight":"bold", "color":"blue"}
使用頻度が多そうな引数を下の表にまとめました。
キーワード | 設定内容 | 設定値の例 |
---|---|---|
size , or fontsize |
テキストのサイズ | 数値pt またはsmall , large など規定文字列 |
color |
テキストの色 | 色の名前など |
weight |
太字指定 | bold :太字 |
rotation |
文字の回転角度 | 数値° |
ha or horizontalalignment |
水平方向の位地調整 | center , right , left で指定 |
指定できるキーワードは、plt.text()
と共通なので、詳細は次の記事をチェックしてください!
例)テキストを青太字にして、斜めに表示
textprops = {"weight":"bold", "color":"blue", "size":"xx-large", "rotation":20, "ha":"center"}
plt.pie(x, labels=labels, startangle=90, counterclock=False, textprops=textprops, labeldistance=0.95)
plt.show()
データラベルの設定
plt.pie()
のキーワード引数でデータラベルを表示することができます。
データラベルはデータx
に応じたパーセントが表示されます。
キーワード | 設定内容 | 設定値の例 |
---|---|---|
autopct |
表示形式の指定 | 書式指定子 or書式を指定する関数 |
pctdistance |
データラベルの位置 | 数値 デフォルト = 0.6 |
書式指定子による指定
autopct
に書式指定子を渡して、データラベルを表示できます。
書式指定子とは、数値の表示形式を指定するフォーマットで、次のように指定します。
書式指定子 | 表示内容 | 表示例 |
---|---|---|
"%.2f" |
小数点二桁 | 1.23 |
"%.2f%%" |
小数点二桁 + % | 1.23% |
"%.d" |
整数部分のみ | 1 |
"%.d%%" |
整数部分 + % | 1% |
plt.pie(x, labels=labels, startangle=90, counterclock=False, autopct="%.2f", pctdistance=0.8)
plt.show()
データラベルの位置
データラベルの位置を調整するには、labeldistance
に数値を指定します。
円の中心が0
、円周部分が1
に対応します。
plt.pie(x, labels=labels, startangle=90, counterclock=False, autopct="%.2f", pctdistance=0.5)
【応用編】二重ドーナツグラフの作成方法
この記事内で紹介した方法を組み合わせれば、簡単に二重ドーナツグラフが作成できます。
次の順番に実行していきます。
- データの準備
- カラーマップから色系列生成
- 外側のドーナツ描画
- 内側のドーナツ描画
サンプルコートで挙動を確認してみましょう。
#ドーナツ用データを生成
x = [30, 20, 15]
labels = ["Apple", "Banana", "Carrot"]
x_sub = [15, 10, 5, 10, 10, 10, 5]
labels_sub = ["A1", "A2", "A3", "B1", "B2", "C1", "C2"]
# カラーマップから色系統を準備
a, b, c=[plt.cm.Reds, plt.cm.Greens, plt.cm.Blues]
# 外側のドーナツ作成
wedgeprops={"width":0.3, "edgecolor":'white'}
colors = [a(0.6), b(0.6), c(0.6)]
plt.pie(x, radius=1.3, labels=labels, startangle=90, counterclock=False, colors=colors, wedgeprops= wedgeprops )
# 内側のドーナツ作成
wedgeprops={"width":0.3, "edgecolor":'white'}
colors = [a(0.5), a(0.4), a(0.3), b(0.5), b(0.4), c(0.5), c(0.4)]
plt.pie(x_sub, labels=labels_sub, startangle=90, counterclock=False, labeldistance=0.8, colors=colors, wedgeprops= wedgeprops )
plt.show()
基本的な処理の組み合わせだけで、二重ドーナツになっていますね。
オススメ|matplotlibとデータ分析の勉強方法
今回は、matplotlib
で円グラフを作成する方法について解説しました。
matplotlib
は奥の深いモジュールですが、なかなかわかりにくい部分もあります…。
そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。
また、データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。