前提・実現したいこと
以下のようなコードで作成されたRadarChartのfigureの左上にテキストを追加したいです。
追加するテキストは、選択されたPlayerの "Player":"count" の値です。
"カウント数" + "Player":"count"値 を以下のように記載したいのですがどのように書けばよいでしょうか?
イメージは下図になります(Powerpointで追加)。
該当のソースコード
python
1#Practice RadarChart No.3 with matplotlib normalization ver. #teratail 2import pandas as pd 3import matplotlib.pyplot as plt 4import numpy as np 5import japanize_matplotlib 6pd.options.display.float_format="{:.1f}".format 7#Create a random data frame 8start,end = "2021/4/1","2021/4/30" 9dates = pd.date_range(start=start,end=end,freq="D") 10players = [f"Player{i}"for i in range(1,31)] 11N = 1000 12dates = np.random.choice(dates,size=N) 13dates.sort() 14players=np.random.choice(players,size=N) 15df = pd.DataFrame({ 16 "Date": dates, 17 "Player": players, 18 "Score0": np.random.sample(N) * 30.0 + 60.0, 19 "Score1":np.random.sample(N) * 18.0 + 3.0, 20 "Score2":np.random.sample(N) * 50.0 + 40.0, 21 "Score3":np.random.sample(N) * 40.0 + 80.0, 22 "Score4":np.random.sample(N) * 40.0 + 80.0, 23 "Score5":np.random.sample(N) * 40.0 - 40.0, 24 "Score6":np.random.sample(N) * 7.0 + 15.0, 25}) 26 27#grouping 28dfx = df.groupby("Player").agg({ 29 "Player":"count", 30 "Score0":[np.mean], 31 "Score1":[np.mean], 32 "Score2":[np.mean], 33 "Score3":[np.mean], 34 "Score4":[np.mean], 35 "Score5":[np.mean], 36 "Score6":[np.mean], 37}) 38#add average 39# dfx.loc['Average', :] = dfx.mean() 40#Join columns 41dfx.columns = [" ".join(pair) for pair in dfx.columns] 42# Select player # Define indicators 43from sklearn import preprocessing 44 45# SCORE0 46SCORE0 = dfx["Score0 mean"].values[:,None] # transpose 47mm = preprocessing.MinMaxScaler(feature_range=(0, 10)) # Maxを10に変更 48SCORE0_nor = mm.fit_transform(SCORE0) # 正規化 49# 元の pandas.Series 型インスタンスに戻す 50SCORE0_s = pd.Series(SCORE0_nor[:,0], index=dfx["Score0 mean"].index) 51# Select player 52SCORE0_s1 = SCORE0_s["Player1"] 53 54# SCORE1 55SCORE1 = dfx["Score1 mean"].values[:,None] # transpose 56SCORE1_nor = mm.fit_transform(SCORE1) # 正規化 57# 元の pandas.Series 型インスタンスに戻す 58SCORE1_s = pd.Series(SCORE1_nor[:,0],index=dfx["Score1 mean"].index) 59# Select player 60SCORE1_s1 = SCORE1_s["Player1"] 61 62# SCORE2 63SCORE2 = dfx["Score2 mean"].values[:,None] # transpose 64SCORE2_nor = mm.fit_transform(SCORE2) # 正規化 65# 元の pandas.Series 型インスタンスに戻す 66SCORE2_s = pd.Series(SCORE2_nor[:,0],index=dfx["Score2 mean"].index) 67# Select player 68SCORE2_s1 = SCORE2_s["Player1"] 69 70# SCORE3 71SCORE3 = dfx["Score3 mean"].values[:,None] # transpose 72SCORE3_nor = mm.fit_transform(SCORE3) # 正規化 73# 元の pandas.Series 型インスタンスに戻す 74SCORE3_s = pd.Series(SCORE3_nor[:,0],index=dfx["Score3 mean"].index) 75# Select player 76SCORE3_s1 = SCORE3_s["Player1"] 77 78# SCORE4 79SCORE4 = dfx["Score4 mean"].values[:,None] # transpose 80SCORE4_nor = mm.fit_transform(SCORE4) # 正規化 81# 元の pandas.Series 型インスタンスに戻す 82SCORE4_s = pd.Series(SCORE4_nor[:,0],index=dfx["Score4 mean"].index) 83# Select player 84SCORE4_s1 = SCORE4_s["Player1"] 85 86labels = ["SCORE0","SCORE1","SCORE2", "SCORE3","SCORE4"] 87values = [SCORE0_s1, SCORE1_s1, SCORE2_s1, SCORE3_s1,SCORE4_s1] 88 89def plot_polar(labels, values, imgname): 90 angles = np.linspace(0, 2 * np.pi, len(labels) + 1, endpoint=True) 91 values = np.concatenate((values, [values[0]])) # 閉じた多角形にする 92 fig = plt.figure(figsize=(5,10)) 93 ax = fig.add_subplot(1,1,1,polar=True) 94 ax.plot(angles, values, 'o-') # 外枠 95 ax.fill(angles, values, alpha=0.25) # 塗りつぶし 96 ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels) # 軸ラベル 97 ax.set_title("Player1") # グラフタイトル 98 ax.set_rgrids([]) # 円形の目盛線を消す 99 ax.spines['polar'].set_visible(False) # 一番外側の円を消す 100 ax.set_theta_zero_location("N") # 始点を上(北)に変更 101 ax.set_theta_direction(-1) # 時計回りに変更(デフォルトの逆回り) 102 rgrids = [0, 2, 4, 6, 8, 10] # メモリ軸の生成 103 for grid_value in rgrids: # 多角形の目盛線を引く 104 grid_values = [grid_value] * (len(labels)+1) 105 ax.plot(angles, grid_values, color="gray", linewidth=0.5) 106 for t in rgrids: # メモリの値を表示する 107 ax.text(x=0, y=t, s=t) # xが偏角、yが絶対値でテキストの表示場所が指定される 108 ax.set_rlim(0, 10) # rの範囲を指定 109 110plot_polar(labels, values, "radar.png")
試したこと
ax.text()で表示させようと試みていますが、RadarChartの場合だと座標軸がずれる?ためうまく配置できません。
補足情報(FW/ツールのバージョンなど)
windows11,python3.9.4,vscode
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/23 06:04