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

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

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

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

Python

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

Q&A

解決済

1回答

656閲覧

総当たり的subplotに見やすいtitleをつけたい

murmur1975

総合スコア34

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2018/10/26 01:55

やりたいこと

総当たり的プロットをする際に、見やすいタイトルをつけたい。
下図の上下左右の青と橙のタイトル(dataX)のようなものをつけたいです。
イメージ説明

やったこと

長くてすみません。

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4label = ['data A','data B','data C','data D'] 5N = len(label) # データ種の数 6L = 20 # データ長 7 8data = [] 9for k in range(N): 10 data.append(np.random.normal(0, 1, (L,2))) 11 12pos = (0.2, 0.45, 0.45, 0.2) # 上下左右の位置 13 14fig = plt.figure() 15for i in range(N): 16 for j in range(N): 17 if i!=j: 18 ax = plt.subplot(N, N, i*N+j+1) 19 d1x = data[i][:,0] 20 d1y = data[i][:,1] 21 ax.scatter(d1x, d1y, s=5) 22 d2x = data[j][:,0] 23 d2y = data[j][:,1] 24 ax.scatter(d2x, d2y, s=5) 25 dx = np.hstack([d1x, d2x]) 26 dy = np.hstack([d1y, d2y]) 27 if i == 0: # 上 28 x = (max(dx)+min(dx))/2 29 y = max(dy)+(max(dy)-min(dy))*pos[0] 30 ax.text(x, y, '{}'.format(label[j]), ha='center', va='bottom', 31 weight='bold', color='w', backgroundcolor='C1') 32 elif i == N-1: # 下 33 x = (max(dx)+min(dy))/2 34 y = min(dy)-(max(dy)-min(dy))*pos[1] 35 ax.text(x, y, '{}'.format(label[j]), ha='center', va='top', 36 weight='bold', color='w', backgroundcolor='C1') 37 if j == 0: # 左 38 x = min(dx)-(max(dx)-min(dx))*pos[2] 39 y = (max(dy)+min(dy))/2 40 ax.text(x, y, '{}'.format(label[i]), ha='right', va='center', 41 weight='bold', color='w', backgroundcolor='C0', rotation='vertical') 42 elif j == N-1: # 右 43 x = max(dx)+(max(dx)-min(dx))*pos[3] 44 y = (max(dy)+min(dy))/2 45 ax.text(x, y, '{}'.format(label[i]), ha='left', va='center', 46 weight='bold', color='w', backgroundcolor='C0', rotation='vertical') 47plt.tight_layout() 48fig.subplots_adjust(top=0.9, bottom=0.1, left=0.1, right=0.9)

困っていること

  1. グラフ表示後にマウスで拡大したり動かしたりすると、titleも連動して動いてしまう。
  2. グラフ要素が増えたりすると、再度細かい調整が必要になってしまう。
  3. そもそもなんかスマートじゃない。たぶん将来的に不具合が出る。

教えてほしいこと

  1. このようなラベル付けができるモジュールがあれば、教えてください。
  2. もっとよい書き方があれば、教えてください。

以上、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純に xlabel および ylabel にて実装するというのはどうでしょうか

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4label = ['data A','data B','data C','data D'] 5N = len(label) # データ種の数 6L = 20 # データ長 7data = [] 8for k in range(N): 9 data.append(np.random.normal(0, 1, (L,2))) 10 11#X軸とY軸を共通化する 12fig,ax = plt.subplots(N, N, sharex=True, sharey=True) 13 14for i in range(N): 15 for j in range(N): 16 # tickを共通化したので全てのグラフを表示する 17 if i != j: 18 d1x = data[i][:,0] 19 d1y = data[i][:,1] 20 ax[i][j].scatter(d1x, d1y, s=5, c='orangered') 21 d2x = data[j][:,0] 22 d2y = data[j][:,1] 23 ax[i][j].scatter(d2x, d2y, s=5, c='royalblue') 24 else: 25 #ax[i][j].set_visible(False) #表示しない 26 d1x = data[i][:,0] 27 d1y = data[i][:,1] 28 ax[i][j].scatter(d1x, d1y, s=5, c='fuchsia') 29 30 # xlabelの設定 31 ax[i][j].set_xlabel(label[j], weight='bold', 32 color='w', backgroundcolor='royalblue') 33 # xlabelの表示場所を設定 34 if i==0: 35 ax[i][j].xaxis.set_label_position('top') 36 ax[i][j].xaxis.labelpad = 15 37 elif i==N-1: 38 ax[i][j].xaxis.set_label_position('bottom') 39 else: 40 ax[i][j].xaxis.set_visible(False) 41 42 # ylabelの設定 43 ax[i][j].set_ylabel(label[i], weight='bold', 44 color='w', backgroundcolor='orangered') 45 # ylabelの表示場所を設定 46 if j==0: 47 ax[i][j].yaxis.set_label_position('left') 48 elif j==N-1: 49 ax[i][j].yaxis.set_label_position('right') 50 ax[i][j].yaxis.labelpad = 15 51 else: 52 ax[i][j].yaxis.set_visible(False) 53 54 # これは完全に好み(上限下限を対象にしたかっただけ) 55 ax[i][j].set_xlim(-3.0, 3.0) 56 ax[i][j].set_ylim(-3.0, 3.0) 57 58# 全てのグラフをくっ付けてみました(これも完全好み) 59fig.subplots_adjust(top=0.9, bottom=0.1, left=0.1, right=0.9, 60 hspace=0, wspace=0) 61plt.savefig('out.png') 62plt.show()

もとのコードより長くなってしまった・・・

イメージ説明

投稿2018/10/26 05:50

magichan

総合スコア15898

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

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

murmur1975

2018/10/26 06:01

すごくいい感じですね。ありがとうございました。 labelに設定する考えはあったのですが、どうにも上と右にlabelを設定する方法がわからず挫折してました。まだまだmatplotlib道は長そうです・・・。 ただ実は、ほんとに使いたいコードでは、labelを別の用途に使ってしまっているので、こちらをベースにまた考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問