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, iteratorohne ihn zu ändern.
Einstellen des Farbzyklus
Schnell beiseite: Sie können den Farb- / Eigenschaftszyklus auf verschiedene Arten einstellen (z. B. ax.set_color_cyclein Versionen <1.5 oder ax.set_prop_cyclerin> = 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_linesist eine verwirrend benannte Berührung, aber es ist die Maschinerie hinter den Kulissen, die es dem plotBefehl ermöglicht, alle seltsamen und unterschiedlichen Arten zu verarbeiten, plotdie aufgerufen werden können. Unter anderem wird verfolgt, welche Farben automatisch zugewiesen werden sollen. Ebenso können Sie das ax._get_patches_for_fillDurchlaufen der Standardfüllfarben und Patch-Eigenschaften steuern.
In jedem Fall gilt der iterierbare Farbzyklus ax._get_lines.color_cyclefür Linien und ax._get_patches_for_fill.color_cyclePatches. Bei matplotlib> = 1.5 wurde dies geändert, um die cyclerBibliothek zu verwenden , und die iterable wird prop_cycleranstelle von color_cycleund ruft eine dictvon 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.5oder höher wäre es schön, das verwendete cyclerObjekt zu erhalten , da wir auf seinen aktuellen Zustand schließen könnten. Das cyclerObjekt selbst ist jedoch nirgendwo (öffentlich oder privat) zugänglich. Stattdessen kann nur auf die itertools.cycleaus dem cyclerObjekt 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.