Pythonでグラフを描くときは、Matplotlib
を使うことが多いですが、
Matplotlib
で円グラフを作成する方法がよくわからない…。- 何を設定すれば、自分の描きたい円グラフになるのかわからない!
という方のために、
Matplotlib
の円グラフ作成方法- Excel風の見た目に設定する方法
- グラフやラベルの設定方法
についてまとめしました。
「何を設定するとグラフのどこを設定できるか」を覚えれば、自由に円グラフを作成できます!
円グラフをマスターして、伝わるグラフを目指しましょう!
- Matplotlibで円グラフを作成するときの超基本
- 円グラフの基本設定|Excel風の円グラフ作成
- 円グラフの見た目変更
- ラベルの見た目変更
- データラベルの設定
- 【応用編】二重ドーナツグラフの作成方法
- おわりに:Matplotlib関連記事の紹介
Matplotlibで円グラフを作成するときの超基本
Matplotlib
で円グラフグラフを作成する際には、
- pltメソッドの場合:
plt.pie()
- オブジェクト指向の場合:
ax.pie()
を使用します。
この記事では基本的にplt.pie()
で解説しますが、ax.pie()
でも挙動はほぼ同じです。
オブジェクト指向の方はax.pie()
で実行してください。
基本的な円グラフの作成
基本的な円グラフグラフを作成するには、
plt.pie(x)
でプロットを生成plt.show()
でグラフを表示
を行います。
plt.pie()
の必須引数は次の通りです。
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風の円グラフ作成
- グラフの見た目変更
- ラベルの見た目変更
- データラベルの設定方法
- 【応用編】二重ドーナツグラフの作成方法
円グラフの基本設定|Excel風の円グラフ作成
Matplotlib
の円グラフを見て違和感を覚える方も多いと思います。というのも…。
Matplotlib
:角度0°から始まって時計回りにパイが並ぶ- Excelなど:角度90°から始まって反時計回りにパイが並ぶことが多い
という違いがあるからです。
まずはパイの並べ方や凡例を設定して、違和感のない自然な円グラフを作成する方法を紹介します。
キーワード(または関数) | 設定内容 | 設定値の例 |
---|---|---|
labels |
データラベルの設定 | [ラベル名のリスト] |
startangle |
パイの開始位置の設定 | 数値° デフォルト = 0 |
counterclock |
パイを反時計周りに並べるか | True or False |
plt.legend() 実行 |
凡例の表示 |
ラベルの表示
ラベル名を設定するには、labels
に[ラベル名のリスト]
を渡します。
データを準備する際にラベル名も一緒に準備すると良いです。
#円グラフ用データを準備
x = [30, 20, 15, 5]
labels = ["Apple", "Banana", "Carrot", "Daikon"]
ラベル名を設定してみます。
plt.pie(x, labels=labels)
plt.show()
ラベル名が表示されました。
ラベル名の位置やフォントなどの詳細設定は後述します。
グラフの開始角度の設定
グラフの開始角度を設定するには、startangle
に数値°
を設定します。
デフォルトは0°ですが、90°から始まるグラフの方が見慣れていると思います。
plt.pie(x, labels=labels, startangle=90)
plt.show()
パイを反時計回りに並べる
パイを反時計回りに並べるには、counterclock=True
を設定します。
plt.pie(x, labels=labels, startangle=90, counterclock=False)
plt.show()
ここまで設定すると、だいぶ見慣れた円グラフになったと思います。
凡例の表示
凡例を表示するには、plt.legend()
を実行します。
plt.pie(x, labels=labels, startangle=90, counterclock=False)
plt.legend()
plt.show()
ここまでの設定だけでも、十分な円グラフが描けますね。
以下では、円グラフのより詳細な設定について解説していきます。
円グラフの見た目変更
円グラフの見た目は、plt.pie()
のキーワード引数で変更することができます。
キーワード | 設定内容 | 設定値の例 |
---|---|---|
radius |
円グラフのサイズ | 数値 デフォルト = 1 |
shadow |
円グラフの影の有無 | True or False デフォルト = False |
colors |
パイの色 | [色名のリスト] |
explode |
特定のパイの強調 | [数値のリスト] 0 より大きい値で強調 |
wedgeprops |
パイの詳細設定 | {辞書型} で詳細を設定可能 |
円のサイズ変更
円グラフのサイズを変更するには、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()
plt.show()
設定した色は、凡例にも自動で適用されます。
また、カラーマップを使用すると、統一感のある色を手軽に設定できます。
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()
plt.show()
カラーマップは、Matplotlib
に内蔵された色のセットです。
上の例では、"Paired"
というカラーマップを使用しています。
円グラフで使用する際には、カラーマップの中でも"Qualitative"
というグループのものを使うと良いです。
# Qualitativeの種類
['Pastel1', 'Pastel2', 'Paired', 'Accent',
'Dark2', 'Set1', 'Set2', 'Set3',
'tab10', 'tab20', 'tab20b', 'tab20c']
カラーマップを含めた色の詳細については、次の記事でまとめています。
パイの強調
explode
を指定すると、パイを円から切り離して強調表示することができます。
explode
には、円中心から各パイをどの程度離すかをリスト等で指定します。
explode = [0, 0.1, 0, 0]
plt.pie(x, labels=labels, startangle=90, counterclock=False, explode=explode)
plt.show()
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)
plt.show()
白い枠線を付けると、各パイが離れているように見えます。
例2)パイの幅変更|ドーナツグラフ
wedgeprops={"edgecolor":"white", "width":0.3}
plt.pie(x, labels=labels, startangle=90, counterclock=False, wedgeprops=wedgeprops)
plt.show()
ラベルの見た目変更
ラベルの見た目は、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()
plt.show()
ラベルの回転表示
rotatelabels=True
を指定すると、ラベルが円の外側を向くように回転させることができます。
plt.pie(x, labels=labels, startangle=90, counterclock=False, rotatelabels=True)
plt.show()
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)
plt.show()
ラベルの詳細設定
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)
plt.show()
【応用編】二重ドーナツグラフの作成方法
この記事内で紹介した方法を組み合わせれば、簡単に二重ドーナツグラフが作成できます。
- データの準備
- カラーマップから色系列生成
- 外側のドーナツ描画
- 内側のドーナツ描画
の順番に実行していきます。
#ドーナツ用データを生成
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
マスターを目指す皆さんへの次のおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!