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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

4152閲覧

Matplotlibで軸の数字が重なってしまう。

MagMag

総合スコア80

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/02/20 05:29

編集2019/02/20 06:43

2×2のグラフを作って、かつ、縦と横の軸はshareする設定(x1は2つのグラフで共通。x2,y1,y2も同様)にしたいと思っております。ただ、以下のスクリプトだと、axesを2回実行しているので、軸上の文字が重なってしまいます(下に画像添付)。

一方、axes[0, 0]~4行のデータを消すと、文字の重なり問題は解消するのですが、for文の中で軸の共通設定ができない状態です。

この場合、どのように対応したらいいかアドバイスいただけないでしょうか?
また、今は2×2のグラフですが、可能なら4×4のグラフまで拡張したいと思っており、できるだけfor文で実行したいと思っています。

Python

1import... 2 3X = np.random.randn(100) 4y = np.random.randn(100) 5 6fig, axes = plt.subplots(2, 2, figsize=(8, 8)) 7axes[0, 0] = fig.add_subplot(221) 8axes[0, 1] = fig.add_subplot(222, sharey=axes[0, 0] 9axes[1, 0] = fig.add_subplot(223, sharex=axes[0, 0]) 10axes[1, 1] = fig.add_subplot(224, sharex=axes[0, 1], sharey=axes[1, 0]) 11 12for i, name in enumerate(["y1","y2"]): 13 axes[i, 0].set_ylabel(name) 14 for j, X_name in enumerate(["x1","x2"]): 15 axes[1, j].set_xlabel(X_name) 16 axes[i, j].scatter(X, y)

イメージ説明

【追記】
sharexやshareyを全体に適用していまうと、以下のように、各軸(この場合、x1とx2)のスケールが異なる場合にうまく表示されません。下図の場合、x1は[-3:3]、x2は[-30:30]と個別に設定したいです(ただ、上下のグラフではsharexを行いたい)。
イメージ説明

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

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

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

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

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

guest

回答2

0

軸間の調整はsubplots_adjustで行います。

以下が参考になるかと。
http://ailaby.com/subplots_adjust/

投稿2019/02/20 06:51

t_obara

総合スコア5488

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

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

MagMag

2019/02/20 07:18

subplot同士の重なりというより、同軸に複数の設定がされるという問題ですが、情報いただき、ありがとうございます。
guest

0

ベストアンサー

plt.subplots() の引数に sharex=True およびに sharey=True を追加してください
plt.subplots() の引数に sharex='col' およびに sharey='row' を追加してください

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4X = np.random.randn(100) 5y = np.random.randn(100) 6 7# fig, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=True, sharey=True) 8fig, axes = plt.subplots(2, 2, figsize=(8, 8), sharex='col', sharey='row') 9 10for i, name in enumerate(["y1","y2"]): 11 axes[i, 0].set_ylabel(name) 12 for j, X_name in enumerate(["x1","x2"]): 13 axes[1, j].set_xlabel(X_name) 14 axes[i, j].scatter(X, y)

投稿2019/02/20 06:14

編集2019/02/20 06:54
magichan

総合スコア15898

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

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

MagMag

2019/02/20 06:39

早速ありがとうございます。私の説明が下手で恐縮ですが、その設定だと、x1とx2が同じ範囲設定になってしまいます。この例の場合だと問題ないのですが、実際のデータだと、x1の範囲は[-3:3]で、x2の範囲は[10:20]といった感じのため(yも同様)、sharexを全体に適用してしまうと、両方の軸が見れない、ということが発生します。
MagMag

2019/02/20 06:45

具体例を追記しました。x2は値を10倍しています。
magichan

2019/02/20 06:56

なるほど・・。大変失礼しました。 回答に再度記載しましたが、その場合は True の代わりに どちらの方向で share するのかを示す 'row','col'を指定してください
MagMag

2019/02/20 07:17

ありがとうございます!まさにこれです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問