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?

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


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

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)

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.