(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のタイトルを使って中央に書いています。