質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

998閲覧

RadarChartを作成したfigureの左上にテキストを追加したい

8960

総合スコア108

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/12/23 02:54

前提・実現したいこと

以下のようなコードで作成された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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1ax.text(x=1.75*np.pi, y=150, s='カウント数\ncount')

ぐらいで、左上に出るでしょう。

投稿2021/12/23 04:37

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

8960

2021/12/23 06:04

@ppaul さん ありがとうございます。 左上にテキストを表示させることが出来ました。 例えば上記のコードのようにaggで集計したデータフレームにおける Player1の "Player":"count", の値を表示させるには s = "カウント数\n" + ax.text(x=1.71*np.pi, y=15,s=s,fontsize=20) + 以降にどのように書けばよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問