2010-02-01 20 views
212

Próbuję wykreślić cyfrę bez znaków ani znaków na żadnej z osi (używam osi w tradycyjnym sensie, a nie w nomenklaturze Matplotlib!). Problem, z którym się zetknąłem, polega na tym, że matplotlib dopasowuje znaczniki x (y), odejmując wartość N, a następnie dodaje N na końcu osi.Ukrywanie tekstu osi w matplotlib działkach

To może być niejasne, ale następujący uproszczony przykład podkreśla problem, z „6.18” jest wartość wykraczająca 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, chciałbym wiedzieć, to:

  1. Jak wyłączyć to zachowanie w pierwszej kolejności (choć w większości przypadków jest to przydatne, nie zawsze!) ja przejrzałem matplotlib.axis.XAxis i nie mogę znaleźć nic odpowiedniego

  2. Jak mogę sprawić, by N zniknęło (tj. X.set_visible(False))

  3. Czy istnieje lepszy sposób, aby mimo to wykonać powyższe? Mój ostatni wątek będzie wynosił 4x4 na rysunku, jeśli jest to istotne.

Odpowiedz

291

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

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

Lub można ustawić kleszczy do pustej listy:

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

W tej drugiej opcji , nadal można używać plt.xlabel() i plt.ylabel() do dodawania etykiet do osi.

+1

Hej Ofri - to świetnie, dzięki, ale teraz (po prostu być niezręcznie) co się stanie, jeśli chcę dodać xlabel()? Inne niż ręczne umieszczanie widżetu tekstowego. – Dave

+0

edytowane, aby odpowiedzieć na twoje pytanie. –

+1

great - działa jak w reklamie, dzięki! – Dave

141

Jeśli chcesz ukryć tylko tekst oś utrzymaniem linii siatki:

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

Doing set_visible(False) lub set_ticks([]) również ukryć linie siatki.

+4

Trochę za późno - ale lepiej niż zaakceptowana odpowiedź – Floris

+0

powoduje to usunięcie etykiet * wszystkich * wątków, które współdzielą tę oś:/ – endolith

34

Nieco starego wątku, ale to wydaje się być szybsza metoda przy użyciu najnowszej wersji matplotlib:

ustawić główną formatowania dla osi x

ax.xaxis.set_major_formatter(plt.NullFormatter()) 
+1

Co jeśli chcesz zrobić to tylko dla jednego tiku? –

+3

Tak, jest to przydatne tylko do ukrycia etykiet, ponieważ .set_xticks ([]) również usuwa same znaczniki. – zbyszek

12

nie był rzeczywiście w stanie renderować obraz bez obramowań lub danych osi na podstawie dowolnego fragmentu kodu tutaj (nawet tego zaakceptowanego przy odpowiedzi). Po wykopaniu przez jakiś dokumentacji API, trafiłem na ten kod, aby uczynić 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 tick_params nazwać w zasadzie zamknięty żadnych dodatkowych informacji, które mogą być wydane i mam idealny wykres w moim pliku wyjściowego:). Mam nadzieję że to pomoże!

+0

Gdy osie są współużytkowane, rozwiązania oparte na set_ticklabels propagują na współdzielonych osiach. Tylko to rozwiązanie oparte na tick_params działało dobrze dla mnie. –

41

Jeśli jesteś podobny do mnie i nie zawsze pobierać osie, ax, podczas kreślenia figurę, to proste rozwiązanie byłoby zrobić

plt.xticks([]) 
plt.yticks([])