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.

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


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


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.


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.


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)


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.