MEP25: Serialisierung #
Status #
Abgelehnt
Diese Arbeit ist wichtig, aber diese besondere Anstrengung ist ins Stocken geraten.
Branches und Pull-Requests #
Entwicklungszweige:
verwandte Pull-Requests:
Zusammenfassung #
Dieses MEP zielt darauf ab, serialisierbare ControllerObjekte hinzuzufügen, die als ArtistManager fungieren. Benutzer würden dann Änderungen an
 Artistüber eine Controller. Auf diese Weise kann die Funktionalität der
 ControllerObjekte schrittweise hinzugefügt werden, da jedes
 Artistimmer noch dafür verantwortlich ist, alles zu zeichnen. Das Ziel besteht darin, eine API zu erstellen, die sowohl von Grafikbibliotheken, die Beschreibungen von Abbildungen auf hoher Ebene erfordern, als auch von Bibliotheken, die Interpretationen auf niedriger Ebene erfordern, verwendbar ist.
Detaillierte Beschreibung #
Matplotlib ist eine Kernplot-Engine mit einer API, die viele Benutzer bereits verstehen. Für andere Grafikbibliotheken ist es schwierig/unmöglich, (1) eine vollständige Abbildungsbeschreibung zu erhalten, (2) Rohdaten aus dem Abbildungsobjekt so auszugeben, wie der Benutzer sie bereitgestellt hat, (3) die Semantik der Abbildungsobjekte ohne Heuristik zu verstehen und ( 4) Matplotlib eine vollständige Figurenbeschreibung zur Visualisierung geben. Da an außerdem Artistkeine Vorstellung von seiner eigenen Semantik innerhalb der Figur hat, ist es schwierig, auf natürliche Weise mit ihnen zu interagieren.
In diesem Sinne wird Matplotlib ein Standard-Model-View-Controller (MVC)-Framework übernehmen. Das Modell besteht aus den benutzerdefinierten Daten, dem Stil und der Semantik. Die Views sind die Gesamtheit jedes Einzelnen Artist, die für die Erstellung des endgültigen Bildes auf der Grundlage des Modells verantwortlich sind . Der Controller ist das
 ControllerObjekt, das seinen Satz von ArtistObjekten verwaltet.
Der Controllermuss in der Lage sein, die Informationen, die er über die Figur trägt, auf Befehl zu exportieren, vielleicht über eine to_jsonMethode oder ähnliches. Da es äußerst irrelevant wäre, alle Informationen im Modell mit dem Controller zu duplizieren, werden nur benutzerspezifische Informationen (Daten + Stil) explizit beibehalten. Wenn ein Benutzer weitere Informationen (Standardwerte) von der Ansicht/dem Modell wünscht, sollte er in der Lage sein, danach zu fragen.
Dies kann lästig sein, da nicht spezifizierte kwargs aus dem rcParams-Objekt gezogen werden, das wiederum aus dem Lesen einer benutzerdefinierten Datei erstellt wird und zur Laufzeit dynamisch geändert werden kann. Ich nehme an, wir könnten ein Diktat der Standardwerte führen und damit vergleichen. Es ist nicht klar, wie dies mit dem Stylesheet [[MEP26]] - @tacaswell interagieren wird
Zusätzliche Bemerkungen:
Die "Rohdaten" müssen nicht unbedingt ein
list,ndarray, usw. sein. Vielmehr können sie abstrakter nur eine Methode haben, um bei Bedarf Daten zu liefern.Da die
Controllerzusätzliche Informationen enthält, die Benutzer möglicherweise nicht aufbewahren möchten, sollte sie nicht standardmäßig erstellt werden. Sie sollten in der Lage sein, sowohl (a) aControllermit einer Figur zu instanziieren als auch (b) eine Figur mit a zu erstellenController.
Anwendungsfälle:
Exportieren Sie alle erforderlichen Informationen
Eine Matplotlib-Figur serialisieren, speichern und später erneut ausführen können.
Jede andere Quelle, die eine entsprechend formatierte Darstellung zum Öffnen an matplotlib sendet
Beispiele #
Hier sind einige Beispiele dafür, was die Controller können sollten.
Instanziieren Sie eine Matplotlib-Figur aus einer serialisierten Darstellung (z. B. JSON):
import json from matplotlib.controllers import Controller with open('my_figure') as f: o = json.load(f) c = Controller(o) fig = c.figure
Künstler vom Controller aus verwalten (z. B. Line2D):
# not really sure how this should look c.axes[0].lines[0].color = 'b' # ?
Serialisierbare Figurendarstellung exportieren:
o = c.to_json() # or... we should be able to throw a figure object in there too o = Controller.to_json(mpl_fig)
Implementierung #
Erstellen Sie Basisobjekte
Controller, die Objekte verwaltenArtistkönnen (z. B.Hist)Kommentare:
Die Initialisierung sollte über das Entpacken erfolgen
**, daher benötigen wir eine Kopie des Anrufsignaturparameters für den, denArtistwir letztendlich zu kontrollieren versuchen. Unglückliche fest codierte Wiederholung ...sollte die
**kwargsjeweils zusätzlich akzeptierteArtistnachverfolgt werdenControllerwoher weiß man
Controller, welcher künstler wohin gehört? Müssen wir zBaxesReferenzen übergeben?
Fortschritt:
Line2DControllerEine einfache Anmerkung, die einige Funktionen für Objekte demonstriert : https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
Protokolle schreiben , um das Modell
Controllerzu aktualisieren .Kommentare:
Wie ist mit Containern umzugehen? Was passiert zB mit alten Patches, wenn wir ein Histogramm neu ordnen?
Im Link von (1) wird die alte Linie vollständig zerstört und neu gezeichnet. Was ist, wenn etwas darauf verweist?
Create-Methode, mit der ein JSON-Objekt aus der zusammengestellt werden kann
ControllersUmgang mit der Serialisierung der deserialisierbaren Aspekte einer Figur (z. B. nicht-affine Transformationen?)
In der Lage sein, aus einer serialisierten Darstellung zu instanziieren
Reimplementieren Sie die vorhandene Pyplot- und Axes-Methode, z. B.
pyplot.histundAxes.histin Bezug auf die neue Controller-Klasse.
> @theengineer: in Nr. 2 oben, was meinst du damit , Updates von jedem zu erhalten Artist?
^ Ja. Die Controller sollten nicht aktualisiert werden müssen. Das passiert einfach in #3. Löschen Sie Kommentare, wenn Sie dies sehen.
Abwärtskompatibilität #
Beizen wird sich ändern
nicht-affine Transformationen erfordern ein definiertes Beizverfahren
Alternativen #
PR #3150 schlug vor, Semantik hinzuzufügen, indem zusätzliche Container parasitär an Achsenobjekte angehängt wurden. Dies ist eine vollständigere Lösung mit einem entwickelteren/flexibleren/leistungsstärkeren Framework.