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 Controller
Objekte hinzuzufügen, die als Artist
Manager fungieren. Benutzer würden dann Änderungen an
Artist
über eine Controller
. Auf diese Weise kann die Funktionalität der
Controller
Objekte schrittweise hinzugefügt werden, da jedes
Artist
immer 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 Artist
keine 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
Controller
Objekt, das seinen Satz von Artist
Objekten verwaltet.
Der Controller
muss in der Lage sein, die Informationen, die er über die Figur trägt, auf Befehl zu exportieren, vielleicht über eine to_json
Methode 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
Controller
zusä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) aController
mit 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 verwaltenArtist
können (z. B.Hist
)Kommentare:
Die Initialisierung sollte über das Entpacken erfolgen
**
, daher benötigen wir eine Kopie des Anrufsignaturparameters für den, denArtist
wir letztendlich zu kontrollieren versuchen. Unglückliche fest codierte Wiederholung ...sollte die
**kwargs
jeweils zusätzlich akzeptierteArtist
nachverfolgt werdenController
woher weiß man
Controller
, welcher künstler wohin gehört? Müssen wir zBaxes
Referenzen übergeben?
Fortschritt:
Line2DController
Eine einfache Anmerkung, die einige Funktionen für Objekte demonstriert : https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
Protokolle schreiben , um das Modell
Controller
zu 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
Controllers
Umgang 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.hist
undAxes.hist
in 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.