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

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

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

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

NumPy

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

Python

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

Q&A

解決済

1回答

2103閲覧

X軸を反転したときに散布点ラベルがずれてしまう

8960

総合スコア108

Matplotlib

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

NumPy

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

Python

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

0グッド

0クリップ

投稿2021/11/30 10:30

編集2021/11/30 10:30

前提・実現したいこと

以下のような散布図にて
axes.invert_xaxis()関数でX軸を反転した際に、散布点につけたラベル(Player名)の場所は反転されず?arrowstyle='->'で作成した矢印とラベルが離れてしまう&adjustしたはずのラベルが重なってしまう状態になってしまいます。

改善方法をご教授いただけると幸いです。

①反転前
イメージ説明
②反転後(randomで数値が①と変わってしまいましたが????)
イメージ説明

発生している問題・エラーメッセージ

該当のソースコード

python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4from adjustText import adjust_text 5import seaborn as sns 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 = 200 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 "Speed": np.random.sample(N) * 100.0, 19 "Angle": np.random.sample(N) * 40.0 - 20.0, 20 "Time": np.random.sample(N) * 0.03 + 0.15, 21}) 22#grouping 23dfx = df.groupby("Player").agg({ 24 "Player":"count", 25 "Speed":[np.mean,np.std], 26 "Angle":[np.mean,np.std], 27 "Time":[np.mean], 28}) 29#add average 30dfx.loc['Average', :] = dfx.mean() 31#Join columns 32dfx.columns = [" ".join(pair) for pair in dfx.columns] 33# Create figure 34fig,ax = plt.subplots(figsize=(15,10)) 35dfx[:-1].plot.scatter(x=("Time mean"),y=("Angle mean"),ax=ax) 36#Tag playerlabel and adjust 37x = ("Time mean") 38y = ("Angle mean") 39dfx[:-1].plot.scatter(x=x, y=y, ax=ax,s=100) 40texts=[] 41for i, label in enumerate(dfx[:-1].index): 42 texts.append(ax.annotate( 43 label, ha="center", fontsize=12, 44 xy=(dfx[:-1][x][i], dfx[:-1][y][i]), 45 xytext=(dfx[:-1][x][i], dfx[:-1][y][i]))) 46adjust_text(texts, arrowprops=dict(arrowstyle='->', color='red')) 47#Linear Regression 48dfy = dfx[:-1].copy() 49sns.regplot(x="Time mean", y="Angle mean", data=dfy, ax=ax) 50#setting 51ax.set_xlabel("Time") 52ax.set_ylabel("Angle") 53ax.set_xlim(0.150,0.180) 54ax.set_ylim(-20,20) 55ax.grid() 56ax.invert_xaxis()

試したこと

コード内での軸反転のタイミングの問題かなと思いましたので、
ax.invert_xaxis()をadjusttextの前後、ラベル作成の前、figure作成の前など試してみましたが、変わらずでした。

補足情報(FW/ツールのバージョンなど)

windows11,python3.9.4,vscode

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1ax.grid() 2ax.invert_xaxis() 3adjust_text(texts, arrowprops=dict(arrowstyle='->', color='red'), ax=ax)

ax.invert_xaxis() の直後に adjust_text() を入れる場合(右)と入れない場合(左)になります。見た感じ、ラベルの表示位置の調整は効いている様です。

adjust_text

投稿2021/11/30 20:20

melian

総合スコア19872

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

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

8960

2021/12/01 01:29

ありがとうございます。 凄く細かいところなのですが、赤い矢印のヘッド?(くの字部)でない方の先端がPlayerラベルとは違う方向についていたり、回答いただいた右の図では矢印が2つついていたりしています。 これはしょうがないところなのでしょうか?
melian

2021/12/01 03:37

adjust_text(texts, ax=ax) とすると以前の矢印が残ったままになるので、どうやら arrowprops を新規に追加してしまう様です。
8960

2021/12/01 03:59

なるほどですね。 adjust_text全体を一番最後に1回のみ持ってくることで何とかきれいな形になりました。 ありがとうございました。
melian

2021/12/01 04:02

対処方法が判りましたので、後程回答を更新します。
melian

2021/12/01 04:53

と思ったのですが、何だか矢印が間延びした結果になってしまいましたので、もう少し考えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問