YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説

Pythonでグラフを描くときは、Matplotlibを使うことが多いですが、

  • Matplotlibで円グラフを作成する方法がよくわからない…。
  • 何を設定すれば、自分の描きたい円グラフになるのかわからない!

という方のために、

  • Matplotlibの円グラフ作成方法
  • Excel風の見た目に設定する方法
  • グラフやラベルの設定方法

についてまとめしました。

「何を設定するとグラフのどこを設定できるか」を覚えれば、自由に円グラフを作成できます!

円グラフをマスターして、伝わるグラフを目指しましょう!

 

Matplotlibで円グラフを作成するときの超基本

Matplotlibで円グラフグラフを作成する際には、

  • pltメソッドの場合:plt.pie()
  • オブジェクト指向の場合:ax.pie()

を使用します。

この記事では基本的にplt.pie()で解説しますが、ax.pie()でも挙動はほぼ同じです。

オブジェクト指向の方はax.pie()で実行してください。

基本的な円グラフの作成

基本的な円グラフグラフを作成するには、

  • plt.pie(x)でプロットを生成
  • plt.show()でグラフを表示

を行います。

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風の円グラフ作成
  • グラフの見た目変更
  • ラベルの見た目変更
  • データラベルの設定方法
  • 【応用編】二重ドーナツグラフの作成方法

円グラフの基本設定|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']

カラーマップを含めた色の詳細については、次の記事でまとめています。

≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

パイの強調

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(完全透明)~(不透明)
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()

ラベル非表示(凡例のみ表示)

labeldistanceNoneを指定すると、ラベルを非表示にできます。

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()と共通なので、詳細は次の記事をチェックしてください!

≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 

例)テキストを青太字にして、斜めに表示

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()

【応用編】二重ドーナツグラフの作成方法

この記事内で紹介した方法を組み合わせれば、簡単に二重ドーナツグラフが作成できます。

  1. データの準備
  2. カラーマップから色系列生成
  3. 外側のドーナツ描画
  4. 内側のドーナツ描画

の順番に実行していきます。

#ドーナツ用データを生成
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マスターを目指す皆さんへの次のおススメコンテンツはこちらです!

≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に%matplotlib inlineと記述します。なぜinlineと入力しているのでしょうか?この記事では、matplotlib inlineの謎について解説していきたいと思います!
www.yutaka-note.com/entry/matplotlib_inline
 
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
Matplotlibで散布図を作成する方法がよくわからない…。散布図って何のためにあるの?全部、plt.plotでグラフ作ればよくない?という方のために、「Matplotlibの散布図の作成方法、散布図を応用したデータの可視化例」についてまとめしました!
www.yutaka-note.com/entry/matplotlib_scatter
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!