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

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

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

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

Python

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

Q&A

解決済

3回答

6510閲覧

matplotlibで軸の範囲外に挿入されたテキストを非表示にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2021/06/15 15:02

編集2021/06/16 09:25

前提・実現したいこと

Pythonでグラフを作成する際に、特定の座標に文字列を挿入しようとしています。
しかし、軸の範囲を指定した場合、以下のように文字列が枠外に来たときに文字列が表示されてしまうので自動で非表示にできないかと考えています。

Python

1import matplotlib.pyplot as plt 2 3fig = plt.figure() 4ax = fig.add_subplot(111) 5ax.text(4, 4, "Python") 6ax.set_xlim(0, 4) 7ax.set_ylim(0, 4) 8fig.savefig('img.jpg')

出力された画像

単純な削除ではなく、表示/非表示の自動化をしたい理由は、文字列のプロットを他のグラフでも使いまわしたいためです。具体的にはtextplot.pyにおいて、

Python

1import matplotlib.pyplot as plt 2 3def textplot(ax): 4 list_text = [ 5 [4, 4, "Python1"], 6 [3, 7, "Python2"], 7 ... 8 ] 9 10 for x in list_text: 11 ax.text(*x)

のような関数を作成しておき、これをgraphplot.pyにおいてインポートして使用するような運用を想定しているためです。

Python

1import matplotlib.pyplot as plt 2import textplot # textplot.pyをインポート 3 4fig = plt.figure() 5ax = fig.add_subplot(111) 6textplot.textplot(ax) # テキストをプロット 7ax.plot(*data) # データをプロット 8fig.savefig('img.jpg') 9

試したこと

一応あらかじめxlimとylimに渡す値で条件分岐させればできるのですが,インポートして使用する場合に必ずx, y軸の範囲を引数として指定しなければならないのがやや面倒に感じます。この点につきまして、よりスマートなやり方がありましたらご教示いただければ幸いです。「matplotlib text 枠外 非表示」等と検索してもヒットしませんでした。

Python

1import matplotlib.pyplot as plt 2 3fig = plt.figure() 4ax = fig.add_subplot(111) 5 6# 軸の最大・最小値 7xmin, xmax = 0, 4 8ymin, ymax = 0, 4 9 10ax.set_xlim(xmin, xmax) 11ax.set_ylim(ymin, ymax) 12 13# 挿入する文字の座標 14x, y = 3, 3 15 16if ( xmin < x < xmax ) & (ymin < y < ymax): 17 ax.text(x, y, "Python") 18 19fig.savefig('img.jpg')

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

Python 3.9.5
Matplotlib 3.4.1

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

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

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

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

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

guest

回答3

0

今更ですが、私も同じことを調べていたので回答します。

ax.text(x, y, clip_on=True)

とすることで解決しました。

ただし、これは文字の枠外の部分だけを非表示にする方法ですので、プロット自体を消したいのであれば記述されたコードがよろしいかと思います。

投稿2022/03/03 04:58

nn_

総合スコア22

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

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

退会済みユーザー

退会済みユーザー

2022/03/03 05:50

ありがとうございます!このような機能を探しておりました。matplotlibのドキュメントにも存在を確認いたしましたが、「clippingを使うかどうか選択する」としか書かれておらず、独力では何の機能なのか分からなかったと思います。
guest

0

ベストアンサー

適切な方法が見つからなかったことと数が多くなかったことから、手作業で対処することにしました。

投稿2022/02/15 05:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

x軸に文字を入れるなら、
ax.set_xlabel('python')

y軸なら
ax.set_ylabel('python')

でいけます。

投稿2021/06/15 21:56

okahijiki

総合スコア404

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

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

退会済みユーザー

退会済みユーザー

2021/06/16 01:58

誤解を招く質問文になってしまい、申し訳ありません。解決したい問題は、軸を描画する方法ではなく、axes.text()で描画した文字が枠外に出た場合に表示しないようにする方法になります。あるいは、軸については今回の問題とは直接関連しないと判断し、例示するコードには含めなかったのですが、textの挙動と関係しますでしょうか。
okahijiki

2021/06/16 02:21

単純に枠外のtextを消すだけなら、以下の一行を削除すればオッケーですー。 ax.text(4, 4, "Python")
退会済みユーザー

退会済みユーザー

2021/06/16 02:42 編集

「前提・実現したいこと」に書きましたとおり、非表示の自動化をしたいと考えております。 今の所、「試したこと」に例示しましたとおり、 ```Python # 軸の最大・最小値 xmin, xmax = 0, 4 ymin, ymax = 0, 4 ax.set_xlim(xmin, xmax) ax.set_ylim(ymin, ymax) # 挿入する文字の座標 x, y = 3, 3 if ( xmin < x < xmax ) & (ymin < y < ymax): ax.text(x, y, "Python") ``` のように軸の最大・最小値から範囲内にあるかどうかを判定して表示・非表示を切り替えるように実装してみたのですが、やや冗長に感じることからより簡潔な書き方があるか知りたく、質問を投稿させていただきました。 (追記) なぜこのような冗長な書き方をしなければならないかについて説明が不足しておりましたので、背景に関する説明を質問文に追記いたしました。目を通していただければ幸いです(初心者で実装方針そのものが見当違いかもしれませんので、そちらに関するご批判・アドバイスでも大変有り難いです)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問