Wie kann ich die obere und rechte Achse in matplotlib entfernen?

133

Anstelle des standardmäßigen "Boxed" -Achsenstils möchte ich nur die linke und untere Achse haben, dh:

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

Dies sollte einfach sein, aber ich kann die erforderlichen Optionen in den Dokumenten nicht finden.

Michael Kuhn
quelle

Antworten:

153

Dies ist die vorgeschlagene Matplotlib 3-Lösung von der offiziellen Website HIER :

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

Geben Sie hier die Bildbeschreibung ein

Divenex
quelle
2
Dies ist die bessere als die akzeptierte Antwort in neueren Versionen von matplotlib.
Jungvogel
3
Zusätzliche Frage für Anfänger: Wo finden Sie diese Antwort basierend auf dem Matplotlib API-Dokument? Wenn ich dorthin gehe: matplotlib.org/api/axes_api.html Ich sehe keinen Verweis auf das spineObjekt und hätte dieses Schlüsselwort nicht erraten.
Eric Burel
63

Alternativ dazu

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

scheint den gleichen Effekt auf einer Achse zu erzielen, ohne die gedrehte Etikettenunterstützung zu verlieren.

(Matplotlib 1.0.1; Lösung inspiriert diese ).

timday
quelle
33

[edit] matplotlib in now (2013-10) auf Version 1.3.0, die dies enthält

Diese Fähigkeit wurde gerade hinzugefügt und Sie benötigen die Subversion-Version dafür. Den Beispielcode sehen Sie hier .

Ich aktualisiere nur, um zu sagen, dass es jetzt ein besseres Beispiel online gibt. Benötige noch die Subversion-Version, es gab noch keine Veröffentlichung mit dieser.

[Bearbeiten] Matplotlib 0.99.0 RC1 wurde gerade veröffentlicht und enthält diese Funktion.

Autoplektisch
quelle
Stellen Sie sicher, dass Sie die Warnung unter matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… lesen, dass die Unterstützung für Häkchen unvollständig ist, bevor Sie versuchen, die oben genannten Informationen mit z. B. gedrehten Etiketten zu verwenden!
Timday
Es sieht so aus, als ob es davon abhängt, wie Sie die Achse konstruieren. Die von erzeugten Achsen mpl.subplotskönnen nicht auf diese Weise verwendet werden?
Stefan van der Walt
8
Der Beispiellink ist jetzt defekt.
mkosmala
9

Wenn Sie keine Zecken und dergleichen benötigen (z. B. zum Zeichnen qualitativer Abbildungen), können Sie auch diese schnelle Problemumgehung verwenden:

Machen Sie die Achse unsichtbar (zB mit plt.gca().axison = False) und zeichnen Sie sie dann manuell mit plt.arrow.

Nikow
quelle
1
Dies scheint die Stacheln zu entfernen, aber die Häkchen bleiben an Ort und Stelle. Irgendeine Idee, wie man auch die Zecken entfernt?
Rob Young
2
@Rob: Sie haben Recht, ich habe tatsächlich eine andere Lösung in dem Skript verwendet, an das ich gedacht habe. Ich habe meine Antwort geändert, dies sollte jetzt funktionieren, aber im Allgemeinen ist die oben akzeptierte Lösung besser.
Nikow
9

(Dies ist eher ein Erweiterungskommentar, zusätzlich zu den umfassenden Antworten hier.)


Beachten Sie, dass wir jedes dieser drei Elemente unabhängig voneinander ausblenden können:

  • So verstecken Sie die Grenze (auch bekannt als "Wirbelsäule"): ax.set_frame_on(False)oderax.spines['top'].set_visible(False)

  • So verstecken Sie die Zecken: ax.tick_params(top=False)

  • So verbergen Sie die Beschriftungen: ax.tick_params(labeltop=False)

Evgeni Sergeev
quelle
schöne Zusammenfassung der Möglichkeiten. +1
geliebt.von.Jesus
9

Die Bibliothek Seaborn hat dies mit der Funktion desine () eingebaut.

Einfach hinzufügen:

import seaborn as sns

Erstellen Sie nun Ihr Diagramm. Und am Ende hinzufügen:

sns.despine()

Wenn Sie sich einige der Standardparameterwerte der Funktion ansehen, werden der obere und der rechte Rücken entfernt und der untere und der linke Rücken bleiben erhalten:

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

Weitere Dokumentation finden Sie hier: https://seaborn.pydata.org/generated/seaborn.despine.html

Sander van den Oord
quelle
7

Wenn Sie es aus all Ihren Plots entfernen müssen, können Sie Stacheln in den Stileinstellungen (Stylesheet oder rcParams) entfernen. Z.B:

import matplotlib as mpl

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

Wenn Sie alle Stacheln entfernen möchten:

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
quelle