Ukrywanie tekstu osi na wykresach matplotlib

370

Próbuję narysować cyfrę bez znaczników lub liczb na jednej z osi (używam osi w tradycyjnym sensie, a nie nomenklatury matplotlib!). Problem, na jaki natrafiłem, polega na tym, że matplotlib dostosowuje znaczniki x (y) odejmując wartość N, a następnie dodaje N na końcu osi.

Może to być niejasne, ale poniższy uproszczony przykład uwypukla problem, przy czym „6.18” jest wartością obrażającą N:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

Trzy rzeczy, które chciałbym wiedzieć to:

  1. Jak w pierwszej kolejności wyłączyć to zachowanie (chociaż w większości przypadków jest to przydatne, nie zawsze!) Przejrzałem matplotlib.axis.XAxisi nie mogę znaleźć niczego odpowiedniego

  2. Jak mogę sprawić, że N zniknie (tj. X.set_visible(False))

  3. Czy jest i tak lepszy sposób na wykonanie powyższego? Moja ostatnia fabuła byłaby 4x4 na wykresie, jeśli to istotne.

Dave
źródło
Nie mam wątpliwości, czy którakolwiek z odpowiedzi tutaj faktycznie odpowiada na pytanie. Dla mnie wygląda na to, że pytanie pyta, jak pozbyć się przesunięcia . Jednak wszystkie odpowiedzi pokazują różne sposoby na pozbycie się wszystkich naklejek. Jeśli pytanie zostało zastąpione przez odpowiedzi, być może należy je edytować, aby zapytać, jakie odpowiedzi zapewniają rozwiązania?
ImportanceOfBeingErnest

Odpowiedzi:

471

Zamiast ukrywać każdy element, możesz ukryć całą oś:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

Możesz też ustawić tiki na pustą listę:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

W tej drugiej opcji możesz nadal używać plt.xlabel()i plt.ylabel()dodawać etykiety do osi.

Ofri Raviv
źródło
2
Hej Ofri - to świetnie, dziękuję, ale teraz (żeby być niezręcznym) co się stanie, jeśli chcę dodać Xlabel ()? Inne niż ręczne umieszczanie widżetu tekstowego.
Dave
5
Jak możesz rozszerzyć ten przykład na 3d? ax = plt.gca (projection = '3d'), ax.axes.get_zaxis (). set_visible (False) daje'Axes3DSubplot' object has no attribute 'get_zaxis'
użytkownik989762
13
Ta odpowiedź nie pozwala na wyświetlanie linii siatki. Odpowiedź @saullo castro brzmi jednak ...
evan54
Problem polega na tym, że gdy x_axis jest ustawiony na niewidoczny, pojawia się ds ds grid :( Edycja: Właśnie zobaczyłem odpowiedź @Saullo Castro, która rozwiązała problem.
Shailen
1
@ user989762 W twoim przypadku ta metoda nawet nie zadziała get_xaxis().set_visible(False). Myślę, że matplotlib w tym przypadku inicjuje niektóre parametry tak, jakby wykres był 2D. ax.set_zticks([])zrobi, co chcesz
kon psych
222

Jeśli chcesz ukryć tylko tekst osi z zachowaniem linii siatki:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

Wykonanie set_visible(False)lub set_ticks([])ukryje również linie siatki.

Saullo GP Castro
źródło
4
usuwa to etykiety dla wszystkich podplotów, które dzielą tę oś: /
endolith
136

Jeśli jesteś podobny do mnie i nie zawsze odzyskujesz osie ax, przy kreśleniu figury byłoby prostym rozwiązaniem

plt.xticks([])
plt.yticks([])
Ébe Isaac
źródło
56

Trochę starego wątku, ale wydaje się, że jest to szybsza metoda z użyciem najnowszej wersji matplotlib:

ustaw główny formatyzator dla osi x

ax.xaxis.set_major_formatter(plt.NullFormatter())
Nik Twerdochlib
źródło
1
Co jeśli chcesz to zrobić tylko dla jednego tiku?
tommy.carstensen
5
Tak, przydaje się to tylko do ukrywania etykiet, ponieważ .set_xticks ([]) również usuwa same znaczniki.
zbyszek
49

W rzeczywistości nie byłem w stanie renderować obrazu bez danych obramowania lub osi w oparciu o którykolwiek fragment kodu (nawet ten zaakceptowany przy odpowiedzi). Po przejrzeniu dokumentacji API wylądowałem na tym kodzie, aby wyrenderować mój obraz

plt.axis('off')
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

Użyłem tego tick_paramswywołania, aby zasadniczo zamknąć wszelkie dodatkowe informacje, które mogą być renderowane, i mam doskonały wykres w moim pliku wyjściowym.

GingerLoaf
źródło
1
Kiedy osie są wspólne, rozwiązania oparte na set_ticklabels propagują się na wspólnych osiach. Tylko to rozwiązanie oparte na tick_params działało dla mnie dobrze.
Christian O'Reilly,
39

Dla ułatwienia tego procesu kodowałem kolorami tę liczbę.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

wprowadź opis zdjęcia tutaj

Możesz mieć pełną kontrolę nad figurą za pomocą tych poleceń, aby uzupełnić odpowiedź, dodałem również kontrolę nad splajnami:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)
GM
źródło
ax.set_xticklabels([])i ax.set_xticks([])nie działało dla mnie, ale działało ax.axes.get_xaxis().set_visible(False).
Homero Esmeraldo,
2
taka powinna być zaakceptowana odpowiedź
Jason S
6

Podczas korzystania z obiektowego interfejsu API Axesobiekt ma dwie przydatne metody usuwania tekstu osi set_xticklabels()oraz set_xticks().

Załóżmy, że tworzysz fabułę za pomocą

fig, ax = plt.subplots(1)
ax.plot(x, y)

Jeśli chcesz po prostu usunąć etykiety zaznaczenia, możesz użyć

ax.set_xticklabels([])

lub do całkowitego usunięcia kleszczy, możesz użyć

ax.set_xticks([])

Te metody są przydatne do określania dokładnie, gdzie chcesz kleszczy i jak chcesz je oznakować. Przekazanie pustej listy powoduje odpowiednio brak tików lub brak etykiet.

Steven C. Howell
źródło
2

Jedną sztuczką może być ustawienie koloru etykiet kleszczy na biały, aby go ukryć!

plt.xticks(color='w')
plt.yticks(color='w')
Venkatachalam
źródło