Anleitung #

Warum habe ich so viele Ticks und/oder warum sind sie nicht in Ordnung? #

Eine häufige Ursache für unerwartetes Tick-Verhalten ist das Übergeben einer Liste von Strings anstelle von Zahlen oder Datetime-Objekten . Dies kann beim Einlesen einer kommaseparierten Textdatei leicht ohne Vorankündigung passieren. Matplotlib behandelt Listen von Strings als kategoriale Variablen ( Plotten kategorialer Variablen ) und setzt standardmäßig ein Häkchen pro Kategorie und zeichnet sie in der Reihenfolge, in der sie bereitgestellt werden.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))

ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9']  # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)

ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)]  # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)

( Quellcode , png )

../../_images/howto_faq-1.png

Die Lösung besteht darin, die Liste der Zeichenfolgen in Zahlen oder Datetime-Objekte (oft oder ) umzuwandeln.np.asarray(numeric_strings, dtype='float')np.asarray(datetime_strings, dtype='datetime64[s]')

Weitere Informationen finden Sie unter Zu viele Ticks beheben .

Bestimmen Sie den Umfang der Künstler in der Abbildung Nr .

Manchmal wollen wir das Ausmaß eines Künstlers wissen. Matplotlib- ArtistObjekte haben eine Methode Artist.get_window_extent, die normalerweise die Ausdehnung des Künstlers in Pixeln zurückgibt. Einige Künstler, insbesondere Texte, müssen jedoch mindestens einmal gerendert werden, bevor ihr Umfang bekannt ist. Matplotlib liefert Figure.draw_without_rendering, die vor dem Aufruf aufgerufen werden sollte get_window_extent.

Prüfen, ob eine Figur leer ist #

Leer kann tatsächlich verschiedene Dinge bedeuten. Enthält die Figur irgendwelche Künstler? Zählt eine Figur mit einem Leerzeichen Axesimmer noch als Leerzeichen? Ist die Figur leer, wenn sie reinweiß gerendert wurde (es können Künstler anwesend sein, aber sie könnten außerhalb des Zeichenbereichs oder transparent sein)?

Für diesen Zweck definieren wir leer als: "Die Figur enthält keine Künstler außer ihrem Hintergrundfleck." Die Ausnahme für den Hintergrund ist notwendig, da standardmäßig jede Figur einen RectangleHintergrund-Patch enthält. Diese Definition könnte überprüft werden über:

def is_empty(figure):
    """
    Return whether the figure contains no Artists (other than the default
    background patch).
    """
    contained_artists = figure.get_children()
    return len(contained_artists) <= 1

Wir haben uns entschieden, dies nicht als Zahlenmethode aufzunehmen, da dies nur eine Möglichkeit ist, leer zu definieren, und die Überprüfung des Obigen nur selten erforderlich ist. Normalerweise weiß der Benutzer oder das Programm, das die Figur handhabt, ob er der Figur etwas hinzugefügt hat.

Das Prüfen, ob eine Figur leer werden würde, kann nicht zuverlässig geprüft werden, außer durch tatsächliches Rendern der Figur und Untersuchen des gerenderten Ergebnisses.

Finden Sie alle Objekte in einer Figur eines bestimmten Typs #

Jeder Matplotlib-Künstler (siehe Künstler-Tutorial ) hat eine aufgerufene Methode findobj(), die verwendet werden kann, um den Künstler rekursiv nach darin enthaltenen Künstlern zu durchsuchen, die bestimmte Kriterien erfüllen (z. B. Übereinstimmung mit allen Line2D Instanzen oder Übereinstimmung mit einer beliebigen Filterfunktion). Das folgende Snippet findet beispielsweise jedes Objekt in der Abbildung, das eine set_colorEigenschaft hat, und färbt das Objekt blau:

def myfunc(x):
    return hasattr(x, 'set_color')

for o in fig.findobj(myfunc):
    o.set_color('blue')

Sie können auch nach Klasseninstanzen filtern:

import matplotlib.text as text
for o in fig.findobj(text.Text):
    o.set_fontstyle('italic')

Verhindern Sie, dass Ticklabels einen Offset haben #

Der Standardformatierer verwendet einen Offset, um die Länge der Ticklabels zu reduzieren. So deaktivieren Sie diese Funktion pro Achse:

ax.get_xaxis().get_major_formatter().set_useOffset(False)

set rcParams["axes.formatter.useoffset"](Standard: True), oder verwenden Sie einen anderen Formatierer. Siehe tickerfür Details.

Transparente Figuren speichern #

Der savefig()Befehl hat ein Schlüsselwort-Argument transparent , das, wenn es 'Wahr' ist, die Hintergründe der Figur und der Achsen beim Speichern transparent macht, aber das angezeigte Bild auf dem Bildschirm nicht beeinflusst.

Wenn Sie eine feinkörnigere Steuerung benötigen, z. B. keine vollständige Transparenz wünschen oder auch die auf dem Bildschirm angezeigte Version beeinflussen möchten, können Sie die Alpha-Eigenschaften direkt festlegen. Die Figur hat eine RectangleInstanz namens patch und die Achsen haben eine Rectangle-Instanz namens patch . Sie können jede Eigenschaft direkt darauf setzen ( facecolor , edgecolor , linewidth , linestyle , alpha ). z.B:

fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)

Wenn alle Figurenelemente transparent sein sollen, gibt es derzeit keine globale Alpha-Einstellung, aber Sie können den Alphakanal für einzelne Elemente festlegen, z.

ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)

Speichern Sie mehrere Plots in einer PDF-Datei #

Viele Bilddateiformate können nur ein Bild pro Datei enthalten, aber einige Formate unterstützen mehrseitige Dateien. Derzeit bietet Matplotlib nur eine mehrseitige Ausgabe in PDF-Dateien, entweder mit dem pdf- oder dem pgf-Backend, über die Klassen backend_pdf.PdfPagesund .backend_pgf.PdfPages

Machen Sie Platz für Tick-Labels #

Standardmäßig verwendet Matplotlib feste prozentuale Ränder um Teilplots. Dies kann dazu führen, dass Beschriftungen an der Abbildungsgrenze überlappen oder abgeschnitten werden. Es gibt mehrere Möglichkeiten, dies zu beheben:

Meine ylabels über mehrere Subplots hinweg ausrichten #

Wenn Sie mehrere Subplots übereinander haben und die y-Daten unterschiedliche Maßstäbe haben, erhalten Sie oft y-Beschriftungen, die nicht vertikal über die mehreren Subplots hinweg ausgerichtet sind, was unattraktiv sein kann. Standardmäßig positioniert Matplotlib die x-Position des ylabels so, dass es keine der y-Ticks überlappt. Sie können dieses Standardverhalten überschreiben, indem Sie die Koordinaten der Beschriftung angeben. Das folgende Beispiel zeigt das Standardverhalten in den linken Subplots und die manuelle Einstellung in den rechten Subplots.

../../_images/sphx_glr_align_ylabels_001.png

Steuern Sie die Zeichnungsreihenfolge von Plotelementen #

Die Zeichnungsreihenfolge der Plotelemente und damit die Elemente, die oben liegen, wird durch die set_zorderEigenschaft bestimmt. Siehe Zorder Demo für eine detaillierte Beschreibung.

Stellen Sie das Seitenverhältnis für Diagramme gleich #

Die Eigenschaft Axes set_aspect()steuert das Seitenverhältnis der Achsen. Sie können es auf „auto“, „equal“ oder ein Verhältnis einstellen, das das Verhältnis steuert:

ax = fig.add_subplot(111, aspect='equal')

Ein vollständiges Beispiel finden Sie unter Gleichachsiges Seitenverhältnis .

Zeichne mehrere y-Achsen-Skalen #

Ein häufiger Wunsch ist es, zwei Skalen für die linke und rechte y-Achse zu haben, was mit möglich ist twinx()(mehr als zwei Skalen werden derzeit nicht unterstützt, obwohl dies auf der Wunschliste steht). Das funktioniert ziemlich gut, obwohl es einige Macken gibt, wenn Sie versuchen, interaktiv zu schwenken und zu zoomen, da beide Skalen die Signale nicht erhalten.

Der Ansatz verwendet twinx()(und seine Schwester twiny()) 2 verschiedene Achsen zu verwenden , den rechteckigen Rahmen der Achsen auf der 2. Achse auszuschalten, um zu verhindern, dass er die erste verdeckt, und die Tick-Locs und Beschriftungen wie gewünscht manuell einzustellen. Sie können matplotlib.tickernach Wunsch separate Formatierer und Lokalisierer verwenden, da die beiden Achsen unabhängig sind.

( Quellcode , png )

../../_images/howto_faq-2.png

Ein vollständiges Beispiel finden Sie unter Diagramme mit unterschiedlichen Maßstäben .

Bilder erzeugen, ohne dass ein Fenster erscheint #

Einfach nicht aufrufen showund die Figur direkt im gewünschten Format speichern:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')

Siehe auch

Einbetten in einen Webanwendungsserver (Flask) für Informationen zum Ausführen von matplotlib innerhalb einer Webanwendung.

Mit Fäden arbeiten #

Matplotlib ist nicht Thread-sicher: Tatsächlich gibt es bekannte Race-Conditions, die bestimmte Künstler betreffen. Wenn Sie also mit Threads arbeiten, liegt es in Ihrer Verantwortung, die richtigen Sperren einzurichten, um den Zugriff auf Matplotlib-Künstler zu serialisieren.

Möglicherweise können Sie an separaten Abbildungen aus separaten Threads arbeiten. In diesem Fall müssen Sie jedoch ein nicht interaktives Backend (normalerweise Agg) verwenden, da die meisten GUI- Backends auch vom Hauptthread aus ausgeführt werden müssen.