(Python)Matplotlib ドーナツグラフの中央に文字を書く

久しぶりの投稿です。

Pythonでドーナツ型の中央に文字を書こうとしても良い記事がなかったので、備忘録です。

やりたいこと

最終的なイメージはこんな感じです。

理想のグラフ
この真ん中の「「文字を書くよ!」」を今回は書いていきます。

コード

import matplotlib.pyplot as plt # グラフを使えるようにする
import japanize_matplotlib      # 日本語化


if __name__ == "__main__":
  category = ["A","B","C","D","E"] # カテゴリー
  data = [2,3,5,4,1]               # 値

  # 図の初期化
  fig = plt.figure() 
  # インスタンスの生成
  instance=fig.subplots() 
  # 文字サイズを決める
  plt.rcParams['font.size'] = 15 
  # ドーナツグラフを書く
  instance.pie(
    data,                     # データ
    wedgeprops={'width':0.6}  # どれだけ中心を開けるか(0.0~1.0、大きいほど中心が開く)
  )
  instance.set_title('文字が書けた!!', fontsize=10,y=0.45) # 中央の文字 <-----------ココがポイント
  fig.suptitle('ドーナツの中央に文字を書く', fontsize=15)      # 図形のタイトル
  # 表示
  plt.show()

完成図

さらにプラスα

こんな要望を叶えると以下のようになります。

  • 割合を大きい順に表示したい
  • %表示欲しい
  • 値もわかった方がいいよね(カテゴリではない)
  • 色の意味も欲しい

コード(おまけ)

import matplotlib.pyplot as plt # グラフを使えるようにする
import japanize_matplotlib      # 日本語化


if __name__ == "__main__":
  category = ["A","B","C","D","E"] # カテゴリー
  data = [2,3,5,4,1]               # 値

  # 図の初期化
  fig = plt.figure() 
  # インスタンスの生成
  instance=fig.subplots() 
  # 文字サイズを決める
  plt.rcParams['font.size'] = 15 


  #---------追加----------
  # 割合順に並べる
  zip_list = zip(data,category)
  data_sorted,category_sorted = zip(*sorted(zip_list,reverse=True))
  # ドーナツグラフを書く
  instance.pie(
    # データ
    data_sorted,
    # 値の出力(全体の5%未満は表示しない)
    labels=list(map(lambda x : str(x) if x/sum(data)>=0.1 else "" ,data_sorted)),
    # 反時計回り
    counterclock=False,
    # 図形を90度回転
    startangle=90,
    # %の表示(全体の5%未満は表示しない)
    autopct=lambda p:'{:.1f}%'.format(p) if p>=10 else '',
    # %の位置が中心からどれだけ離れているか(0.0~1.0、大きいほど中心が開く)
    pctdistance=0.7,
     # どれだけ中心を開けるか(0.0~1.0、大きいほど中心が開く)
    wedgeprops={'width':0.6}
  )
  # 凡例を表示
  instance.legend(category_sorted,fancybox=True,loc='center left',bbox_to_anchor=(1.0,0.6),fontsize=10)  
  # ---------追加ここまで----------


  # タイトル
  instance.set_title('やった!!', fontsize=10,y=0.45) # 中央の文字
  fig.suptitle('綺麗になった!!', fontsize=15)      # 図形のタイトル
  # 表示
  plt.show()

綺麗にしてみる

まとめ

subplotのタイトルを使って中央に書いています。

参考