Jak mogę usunąć górną i prawą oś w matplotlib?

144

Zamiast domyślnego stylu osi „w ramce” chcę mieć tylko lewą i dolną oś, tj .:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

To powinno być łatwe, ale nie mogę znaleźć niezbędnych opcji w dokumentacji.

Michael Kuhn
źródło

Odpowiedzi:

172

To jest sugerowane rozwiązanie Matplotlib 3 z oficjalnej strony TUTAJ :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

wprowadź opis obrazu tutaj

divenex
źródło
2
To jest lepsze niż akceptowana odpowiedź w nowszych wersjach matplotlib.
ffledgling
4
Dodatkowe pytanie dla początkujących: gdzie można znaleźć tę odpowiedź na podstawie dokumentacji Matplotlib API? Jeśli pójdę tam: matplotlib.org/api/axes_api.html nie widzę żadnego odniesienia do spineobiektu i nie odgadłbym tego słowa kluczowego.
Eric Burel
@EricBurel Uważam, że dokumentacja Matplotlib jest źle zaprojektowana. Generalnie łatwiej jest mi zrozumieć jego API na podstawie przykładów. Dlatego StackOverflow jest tak ważny! Chciałbym, żeby dokumentacja Matplotliob była napisana z jasnym i dobrze zorganizowanym podejściem Scipy i Numpy.
divenex
64

Alternatywnie to

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

wydaje się, że osiąga ten sam efekt na osi bez utraty obsługi obracanych etykiet.

(Matplotlib 1.0.1; rozwiązanie zainspirowane tym ).

Timday
źródło
33

[edytuj] matplotlib w now (2013-10) w wersji 1.3.0, która to obejmuje

Ta umiejętność została właśnie dodana i potrzebujesz do niej wersji Subversion. Przykładowy kod można zobaczyć tutaj .

Aktualizuję tylko, aby powiedzieć, że jest teraz lepszy przykład online. Jednak nadal potrzebuję wersji Subversion, nie było jeszcze wydania z nią.

[edytuj] Matplotlib 0.99.0 RC1 został właśnie wydany i zawiera tę możliwość.

Autoplektyczne
źródło
Upewnij się, że przeczytałeś ostrzeżenie na matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/ ... o tym, że obsługa znaczników jest niekompletna, zanim spróbujesz użyć powyższego z np. Obróconymi etykietami!
dzień
Wygląda na to, że zależy to od tego, jak skonstruujesz oś. Osie wygenerowane przez mpl.subplotsnie mogą być używane w ten sposób?
Stefan van der Walt
8
Przykładowy link jest teraz uszkodzony.
mkosmala
11

(Jest to bardziej komentarz dotyczący rozszerzenia, oprócz wyczerpujących odpowiedzi tutaj).


Zauważ, że możemy ukryć każdy z tych trzech elementów niezależnie od siebie:

  • Aby ukryć obramowanie (inaczej „kręgosłup”): ax.set_frame_on(False)lubax.spines['top'].set_visible(False)

  • Aby ukryć kleszcze: ax.tick_params(top=False)

  • Aby ukryć etykiety: ax.tick_params(labeltop=False)

Evgeni Sergeev
źródło
ładne podsumowanie możliwości. +1
kochany przez Jezusa
10

Jeśli nie potrzebujesz znaczników i tym podobnych (np. Do rysowania ilustracji jakościowych), możesz również skorzystać z tego szybkiego obejścia:

Uczyń oś niewidoczną (np. Za pomocą plt.gca().axison = False), a następnie narysuj je ręcznie plt.arrow.

nikow
źródło
1
wydaje się, że usuwa to kolce, ale pozostawia ślady na miejscu. Masz jakiś pomysł, jak również usunąć kleszcze?
Rob Young
2
@Rob: Masz rację, właściwie użyłem innego rozwiązania w scenariuszu, o którym myślałem. Zmieniłem odpowiedź, to powinno teraz działać, ale ogólnie przyjęte rozwiązanie powyżej jest lepsze.
ników
9

Biblioteka Seaborn ma to wbudowane z funkcją despine ().

Poprostu dodaj:

import seaborn as sns

Teraz stwórz swój wykres. I na końcu dodaj:

sns.despine()

Jeśli spojrzysz na niektóre z domyślnych wartości parametrów funkcji, usunie ona górny i prawy grzbiet i zachowa dolny i lewy grzbiet:

sns.despine(top=True, right=True, left=False, bottom=False)

Sprawdź dalszą dokumentację tutaj: https://seaborn.pydata.org/generated/seaborn.despine.html

Sander van den Oord
źródło
8

Jeśli chcesz usunąć go ze wszystkich swoich wykresów, możesz usunąć grzbiety w ustawieniach stylu (arkusz stylów lub rcParams). Na przykład:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Jeśli chcesz usunąć wszystkie kolce:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
hhh
źródło