Zugriff auf den Farbzyklus-Iterator
Es gibt keine "benutzerbezogene" (auch "öffentliche") Methode, um auf den zugrunde liegenden Iterator zuzugreifen, aber Sie können über "private" (gemäß Konvention) Methoden darauf zugreifen. Sie können den Status eines jedoch nicht erhalten, iterator
ohne ihn zu ändern.
Einstellen des Farbzyklus
Schnell beiseite: Sie können den Farb- / Eigenschaftszyklus auf verschiedene Arten einstellen (z. B. ax.set_color_cycle
in Versionen <1.5 oder ax.set_prop_cycler
in> = 1.5). Schauen Sie sich das Beispiel hier für Version 1.5 oder höher oder den vorherigen Stil hier an .
Zugriff auf den zugrunde liegenden Iterator
Es gibt zwar keine öffentlich zugängliche Methode für den Zugriff auf die iterable Datei, Sie können jedoch für ein bestimmtes Achsenobjekt ( ax
) über die Hilfsklasseninstanz darauf zugreifen _get_lines
. ax._get_lines
ist eine verwirrend benannte Berührung, aber es ist die Maschinerie hinter den Kulissen, die es dem plot
Befehl ermöglicht, alle seltsamen und unterschiedlichen Arten zu verarbeiten, plot
die aufgerufen werden können. Unter anderem wird verfolgt, welche Farben automatisch zugewiesen werden sollen. Ebenso können Sie das ax._get_patches_for_fill
Durchlaufen der Standardfüllfarben und Patch-Eigenschaften steuern.
In jedem Fall gilt der iterierbare Farbzyklus ax._get_lines.color_cycle
für Linien und ax._get_patches_for_fill.color_cycle
Patches. Bei matplotlib> = 1.5 wurde dies geändert, um die cycler
Bibliothek zu verwenden , und die iterable wird prop_cycler
anstelle von color_cycle
und ruft eine dict
von Eigenschaften anstelle von nur einer Farbe auf.
Alles in allem würden Sie so etwas tun wie:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
# or ax._get_lines.prop_cycler on version >= 1.5
# Note that prop_cycler cycles over dicts, so you'll want next(cycle)['color']
Sie können den Status eines nicht anzeigen iterator
Dieses Objekt ist jedoch "nackt" iterator
. Wir können leicht das nächste Element erhalten (z. B. next_color = next(color_cycle)
aber das bedeutet, dass die nächste Farbe danach geplottet wird. Konstruktionsbedingt gibt es keine Möglichkeit, den aktuellen Status eines Iterators abzurufen, ohne ihn zu ändern.
In v1.5
oder höher wäre es schön, das verwendete cycler
Objekt zu erhalten , da wir auf seinen aktuellen Zustand schließen könnten. Das cycler
Objekt selbst ist jedoch nirgendwo (öffentlich oder privat) zugänglich. Stattdessen kann nur auf die itertools.cycle
aus dem cycler
Objekt erstellte Instanz zugegriffen werden. In beiden Fällen gibt es keine Möglichkeit, zum zugrunde liegenden Status des Farb- / Eigenschaftszyklers zu gelangen.
Passen Sie stattdessen die Farbe des zuvor gezeichneten Elements an
In Ihrem Fall klingt es so, als ob Sie die Farbe von etwas anpassen möchten, das gerade gezeichnet wurde. Anstatt zu versuchen, die Farbe / Eigenschaft zu bestimmen, legen Sie die Farbe / usw. Ihres neuen Elements basierend auf den Eigenschaften der gezeichneten Elemente fest.
In dem von Ihnen beschriebenen Fall würde ich beispielsweise Folgendes tun:
import matplotlib.pyplot as plt
import numpy as np
def custom_plot(x, y, **kwargs):
ax = kwargs.pop('ax', plt.gca())
base_line, = ax.plot(x, y, **kwargs)
ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)
x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)
plt.show()
Dies ist nicht der einzige Weg, aber in diesem Fall sauberer als der Versuch, die Farbe der gezeichneten Linie vorher zu ermitteln.