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.

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


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


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ść.


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)


ł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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.