matplotlib ma wspólną oś x, ale nie pokazuje etykiet znaczników osi x dla obu, tylko jednej

80

Używam python + matplotlib i mam dwa wykresy, które mają wspólną oś. Jeśli spróbujesz ustawić graph1.set_xticklabels([])podczas współdzielenia osi, nie odniesie to skutku, ponieważ jest współdzielona. Czy istnieje sposób na współdzielenie osi ORAZ możliwość ukrycia osi x jednego wykresu?

pseudonim
źródło

Odpowiedzi:

115

Jest to powszechna usterka podczas korzystania ze wspólnych osi.

Na szczęście istnieje proste rozwiązanie: użyj, plt.setp(ax.get_xticklabels(), visible=False)aby etykiety były niewidoczne tylko na jednej osi.

Jest to równoważne z [label.set_visible(False) for label in ax.get_xticklabels()]czymkolwiek jest to warte. setpbędzie automatycznie działać na iterowalnych obiektach matplotlib, jak również na pojedynczych obiektach.

Jako przykład:

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

tekst alternatywny

Joe Kington
źródło
8
Miałem odwrotny problem: etykiety na drugim wykresie podrzędnym nie były wyświetlane. więc użyłem swoje polecenia tak: plt.setp(ax2.get_yticklabels(), visible=True). Działał bez zarzutu.
n1000
49

W wątku na matplotlib-users , możesz użyć

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass
esmit
źródło
1
Chciałbym móc to bardziej głosować, ponieważ jest to o wiele bardziej pomocne niż zaakceptowana odpowiedź. Jedyna sytuacja, w której chcesz zmodyfikować widoczność zamiast po prostu je wyeliminować, dotyczy poletek; w takim przypadku twoja odpowiedź jest znacznie mądrzejsza. Dzięki!
Channing Moore
Dlaczego jest trypotrzebny? Wydaje się dobrze bez tego.
EL_DON,
1
tryjest potrzebny, ponieważ nie wszystkie elementy plt.gcf().axeslisty są subplotinstancjami (z label_outermetodą).
esmit
16

Możesz użyć 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)
truhanen
źródło
Ustawienie labelbottom = True rozwiązało to dla mnie w przeciwnym przypadku. Dzięki.
mclzc
U mnie też działało w przeciwnym przypadku, podczas gdy plt.setp (ax [1] .get_yticklabels (), visible = True) nie.
deckard
5

Możesz współużytkować osie podczas tworzenia wykresu podrzędnego plt.subplotsjako

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

Spowoduje to automatyczne wyłączenie znaczników dla osi wewnętrznych.

Kompletny przykład:

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

wprowadź opis obrazu tutaj

ImportanceOfBeingErnest
źródło
ale jeśli spróbujesz przenieść kleszcze na drugą stronę działki, etykiety wrócą: /
endolith
Tak, prawda, w tym szczególnym przypadku musisz ponownie ustawić je jako niewidoczne.
ImportanceOfBeingErnest
label_outer()wydaje się działać stackoverflow.com/a/12751192/125507
endolit
Tak, wszystkie odpowiedzi tutaj odpowiadają na pytanie !?
ImportanceOfBeingErnest
0

Niestety nie wolno mi komentować odpowiedzi esmita (co jest moim zdaniem najlepszym rozwiązaniem, dzięki esmit), więc muszę napisać swój komentarz jako nową odpowiedź: jego rozwiązanie umieściłem w prostej funkcji

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

do którego możesz zadzwonić wcześniej plt.show(). Z jakiegoś powodu odpowiedź Joe Kingtona nie zadziałała.

Mitch
źródło