matplotlibはx軸を共有しますが、両方のx軸ティックラベルを表示せず、1つだけを表示します


80

私はpython + matplotlibを使用しており、2つのプロットが軸を共有しています。graph1.set_xticklabels([])軸を共有しながら設定しようとすると、共有されているため効果がありません。軸を共有し、1つのプロットのx軸を非表示にする方法はありますか?

回答:


115

これは、共有軸を使用する場合の一般的な落とし穴です。

幸い、簡単な修正があります。これを使用plt.setp(ax.get_xticklabels(), visible=False)して、ラベルを1つの軸だけで非表示にします。

これは[label.set_visible(False) for label in ax.get_xticklabels()]、価値が何であれ、と同等です。 setp個々のオブジェクトだけでなく、反復可能なmatplotlibオブジェクトを自動的に操作します。

例として:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.plot(range(10), 'r-')

plt.setp(ax1.get_xticklabels(), visible=False)

plt.show()

代替テキスト


8
逆の問題がありました。2番目のサブプロットのラベルが表示されませんでした。だから私はあなたのコマンドを次のように使用しました:plt.setp(ax2.get_yticklabels(), visible=True)。完璧に動作しました。
n1000 2014

49

matplotlib-usersのスレッドごとに、次を使用できます

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass

1
受け入れられた答えよりもはるかに役立つので、これをもっと賛成できればいいのにと思います。可視性を単に削除するのではなく変更したい唯一の状況は、サブプロットです。その場合、あなたの答えははるかに賢くなります。ありがとう!
チャニングムーア

なぜtry必要なのですか?それがなくても大丈夫そうです。
EL_DON 2016年

1
tryplt.gcf().axesリストのすべての要素がsubplotlabel_outerメソッドを使用して)インスタンスであることが保証されているわけではないため、が必要です。
2016年

16

Axes.tick_params()を使用できます:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1)

ax1.tick_params(labelbottom=False)

labelbottom = Trueを設定すると、逆の場合に解決しました。ありがとう。
mclzc

逆の場合も私のために機能しましたが、plt.setp(ax [1] .get_yticklabels()、visible = True)は機能しませんでした。
デッカード

5

サブプロットの作成中に軸をplt.subplotsasと共有できます

fig, axes = plt.subplots(nrows=2, sharex=True)

これにより、内側の軸の目盛りが自動的にオフになります。

完全な例:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, sharex=True)

axes[0].plot([1,2,3])
axes[1].plot([3,2,1])

plt.show()

ここに画像の説明を入力してください


しかし、ティックをプロットの反対側に移動しようとすると、ラベルが戻ってきます:/
endolith 2017

はい、そうです。その特別な場合には、それらを再び非表示に設定する必要があります。
ImportanceOfBeingErnest

label_outer()作業に思えるstackoverflow.com/a/12751192/125507
endolith

はい、ここのすべての答えが質問に答えます!?
ImportanceOfBeingErnest

0

残念ながら、私はesmitの答えにコメントすることは許可されていません(これは私の意見では最良の解決策です、esmitに感謝します)ので、新しい答えとしてコメントを書く必要があります:私は彼の解決策を単純な関数に入れます

def remove_inner_ticklabels(fig):
    for ax in fig.axes:
        try:
            ax.label_outer()
        except:
            pass

前に呼び出すことができますplt.show()。ジョーキントンの答えは、何らかの理由で私にはうまくいきませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.