matplotlib teilt die x-Achse, zeigt jedoch keine x-Achsen-Tick-Beschriftungen für beide, nur für eine

80

Ich verwende Python + Matplotlib und habe zwei Diagramme, die sich eine Achse teilen. Wenn Sie versuchen, graph1.set_xticklabels([])während der Freigabe einer Achse festzulegen, hat dies keine Auswirkung, da sie gemeinsam genutzt wird. Gibt es eine Möglichkeit, die Achse zu teilen UND die x-Achse eines Diagramms auszublenden?

Der Nickname
quelle

Antworten:

113

Dies ist ein häufiges Problem bei der Verwendung von gemeinsam genutzten Achsen.

Glücklicherweise gibt es eine einfache Lösung: Verwenden Sie diese Option plt.setp(ax.get_xticklabels(), visible=False), um die Beschriftungen auf nur einer Achse unsichtbar zu machen.

Dies ist gleichbedeutend mit [label.set_visible(False) for label in ax.get_xticklabels()], was auch immer es wert ist. setparbeitet automatisch mit einer iterierbaren Anzahl von Matplotlib-Objekten sowie einzelnen Objekten.

Als Beispiel:

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()

Alt-Text

Joe Kington
quelle
7
Ich hatte das umgekehrte Problem: Die Beschriftungen in der zweiten Nebenhandlung wurden nicht angezeigt. Also habe ich deinen Befehl so benutzt : plt.setp(ax2.get_yticklabels(), visible=True). Hat einwandfrei funktioniert.
n1000
48

Pro Thread auf matplotlib-Benutzern könnten Sie verwenden

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass
esmit
quelle
1
Ich wünschte, ich könnte dies mehr positiv bewerten, weil es viel hilfreicher ist als die akzeptierte Antwort. Die einzige Situation, in der Sie die Sichtbarkeit ändern möchten, anstatt sie nur zu entfernen, sind Unterzeichnungen. und Ihre Antwort ist in diesem Fall viel schlauer. Vielen Dank!
Channing Moore
Warum wird trybenötigt? Es scheint gut ohne es.
EL_DON
1
trywird benötigt, da nicht plt.gcf().axesgarantiert wird, dass nicht alle Elemente der Liste subplotInstanzen sind (mit einer label_outerMethode).
Esmit
16

Sie könnten Axes.tick_params () verwenden :

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)
truhanen
quelle
Das Setzen von labelbottom = True hat es für mich im umgekehrten Fall gelöst. Vielen Dank.
mclzc
Funktionierte auch für mich im umgekehrten Fall, während plt.setp (ax [1] .get_yticklabels (), sichtbar = True) dies nicht tat.
Deckard
3

Sie können die Achsen während der Erstellung des Unterplots mit plt.subplotsas teilen

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

Dadurch werden die Ticklabels für die Innenachsen automatisch ausgeschaltet.

Vollständiges Beispiel:

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()

Geben Sie hier die Bildbeschreibung ein

Wichtigkeit von BeErnest
quelle
aber wenn Sie versuchen, die Zecken auf die andere Seite des Diagramms zu verschieben, kommen die Beschriftungen zurück: /
Endolith
Ja, in diesem speziellen Fall müssen Sie sie wieder unsichtbar machen.
ImportanceOfBeingErnest
label_outer()scheint zu funktionieren stackoverflow.com/a/12751192/125507
Endolith
Ja, alle Antworten hier beantworten die Frage!?
ImportanceOfBeingErnest
0

Leider darf ich die Antwort von esmit nicht kommentieren (was meiner Meinung nach die beste Lösung ist, danke esmit), daher muss ich meinen Kommentar als neue Antwort schreiben: Ich habe seine Lösung in eine einfache Funktion gestellt

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

die Sie vorher anrufen können plt.show(). Joe Kingtons Antwort hat aus irgendeinem Grund bei mir nicht funktioniert.

Mitch
quelle