YutaKaのPython教室

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

Matplotlib 円グラフ作成方法|基本設定からドーナツグラフまで

Matplotlibを使えば、簡単に円グラフを描くことができます。

とはいっても、実際に使ってみると次のような問題に直面することも…。

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

そこで、今回は円グラフについて、次の内容をわかりやすく解説しました。

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

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

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

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

Matplotlibで円グラフを作成する際には、主に2つの方式があります。

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

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

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

pltメソッドでのグラフ描画について、よくわからないという方は次のMatplotlib入門記事も参考にしてください。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、fig, ax = plt.subplots()で始まるオブジェクト指向のプロットについては、次の記事で解説しています。

≫Matplotlib plt.subplots()の使い方|FigureとAxesを同時生成!
Matplotlibでグラフを描くとき「fig, ax = plt.subplots()って、よく見るけど何してるの?」「plt.subplots()の便利な使い方を知りたい! 」という方のために、plt.subplots()でFigureとAxesを作ると何が便利なのか、plt.subplots()の基本的な使い方、覚えておくと便利なplt.subplots()の引数をを図解付きで解説します!
www.yutaka-note.com/entry/matplotlib_subplots
 

基本的な円グラフの作成

基本的な円グラフ作成の流れは、次の通りです。

  1. plt.pie(x)でプロットを生成
  2. 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)

ラベル名が表示されました。

ラベル名の位置やフォントなどの詳細設定は後述します。

また、ラベル名に日本語を使用したい場合には特別な設定が必要になります。次の記事を参考にしてください。

≫Matplotlib 日本語の表示方法 厳選3選|最適な方法選んで!
Matplotlibでグラフを描くとき、「日本語を表示しようとしたら文字化けした!」「日本語を表示するには、何を設定すればいいの?」という方向けに、「Matplotlibで日本語を表示する方法厳選3選」、「使用できるフォントのチェック方法」を紹介していきます。追加のインストールなしで、フォントの設定を変更するだけの方法を紹介します!
www.yutaka-note.com/entry/matplotlib_japanese
 

グラフの開始角度の設定

グラフの開始角度を設定するには、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をもとに凡例が表示されました。

  • 【参考】凡例の詳しい解説は次の記事を参考にしてください
≫Matplotlib plt.legend() | 凡例の位置とスタイル設定完璧ガイド!
Matplotlibでは、デフォルトでは凡例は表示されません。「凡例(legend)を表示するにはどうしたらいいの?!」「凡例の位置や見た目の設定方法がわからない!」という方向けに、「凡例を表示する関数plt.legend()の使い方」「引数で位置や見た目を簡単に設定する方法」を紹介していきます。自分の作りたい凡例を作れるようになりましょう!
www.yutaka-note.com/entry/matplotlib_legend
 

ここまでの設定だけでも、十分な円グラフが描けますね。

以下では、円グラフのより詳細な設定について解説していきます。

円グラフの見た目変更

円グラフの見た目は、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通りの方法があります。

  1. カラーマップから[色のリスト]を作成して、引数colorに渡す
  2. デフォルトのカラーサイクルを変更する

まずは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()

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

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

  • 【参考】カラーサイクルの変更、カラーマップについては、次の記事で詳しく解説しています。
≫Matplotlib デフォルトの色の変更|実は一行でできます!
Matplotlibでグラフを描くと、デフォルトで青→オレンジ→緑→…と色が変わっていきます。この記事では、`Matplotlib`のデフォルトの色(カラーサイクル)の設定変更について紹介していきます。①データが10系列以上あるときに、また青に戻ってしまう場合の対応方法②自分好みにカラーサイクルを変更する方法また、デフォルトの色を指定して使用する方法についても触れています。
www.yutaka-note.com/entry/matplotlib_color_cycle
 

パイの強調

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(完全透明)~(不透明)
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では、扇形を適切に配置することで、円グラフにしています。

そのため、図形の見た目設定をよく理解すれば、棒グラフの設定をより細かく行うことができます。

図形の設定ついては、次の記事を参考にしてください。

≫Matplotlib 図形を描く方法|円や四角形の描き方をわかりやすく解説
Matplotlibには、円や四角形など様々な図形を描画する機能が備わっていますが、初めのうちは使い方がわかりにくです…。そこで、「Matplotlibでグラフ内に図形を描くにはどうしたらいいの?」という方のために、Matplotlibで円や四角形、矢印などの図形を描く方法、図形の見た目を自分好みにアレンジする方法について紹介します。
www.yutaka-note.com/entry/matplotlib_patches
 

ラベルの見た目変更

ラベルの見た目は、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()

  • 【参考】凡例の詳しい解説は次の記事を参考にしてください
≫Matplotlib plt.legend() | 凡例の位置とスタイル設定完璧ガイド!
Matplotlibでは、デフォルトでは凡例は表示されません。「凡例(legend)を表示するにはどうしたらいいの?!」「凡例の位置や見た目の設定方法がわからない!」という方向けに、「凡例を表示する関数plt.legend()の使い方」「引数で位置や見た目を簡単に設定する方法」を紹介していきます。自分の作りたい凡例を作れるようになりましょう!
www.yutaka-note.com/entry/matplotlib_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()と共通なので、詳細は次の記事をチェックしてください!

≫Matplotlib plt.textよく使うもの徹底解説|テキスト表示をマスター!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、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)

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

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

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

  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の特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis