MEP25: Serializzazione #
Stato n.
Respinto
Questo lavoro è importante, ma questo particolare sforzo si è bloccato.
Filiali e Pull request #
rami di sviluppo:
richieste pull correlate:
Estratto n.
Questo MEP mira ad aggiungere Controller
oggetti serializzabili per agire come Artist
gestori. Gli utenti comunicherebbero quindi le modifiche a un
Artist
tramite a Controller
. In questo modo, la funzionalità degli
Controller
oggetti può essere aggiunta in modo incrementale poiché ognuno
Artist
è ancora responsabile del disegno di tutto. L'obiettivo è creare un'API che sia utilizzabile sia mediante rappresentazione grafica di librerie che richiedono descrizioni di figure di alto livello, sia di librerie che richiedono interpretazioni di basso livello.
Descrizione dettagliata #
Matplotlib è un motore di plottaggio di base con un'API che molti utenti già comprendono. È difficile/impossibile per altre librerie grafiche (1) ottenere una descrizione completa della figura, (2) emettere dati grezzi dall'oggetto figura così come li ha forniti l'utente, (3) comprendere la semantica degli oggetti figura senza euristica e ( 4) fornire a matplotlib una descrizione completa della figura da visualizzare. Inoltre, poiché an Artist
non ha idea della propria semantica all'interno della figura, è difficile interagire con esse in modo naturale.
In questo senso, matplotlib adotterà un framework MVC (Model-View-Controller) standard. Il modello sarà costituito dai dati, dallo stile e dalla semantica definiti dall'utente. Le Views sono l'insieme di ogni individuo Artist
, che ha il compito di produrre l'immagine finale basata sul modello . Il Controller sarà l'
Controller
oggetto che gestisce il suo insieme di Artist
oggetti.
Deve essere in grado di esportare a comando le Controller
informazioni che sta portando sulla figura, magari tramite un to_json
metodo o simili. Poiché sarebbe estremamente estraneo duplicare tutte le informazioni nel modello con il controller, vengono mantenute esplicitamente solo le informazioni specificate dall'utente (dati + stile). Se un utente desidera maggiori informazioni (predefinite) dalla vista/modello, dovrebbe essere in grado di interrogarle.
Questo potrebbe essere fastidioso da fare, i kwargs non specificati vengono estratti dall'oggetto rcParams che a sua volta viene creato dalla lettura di un file specificato dall'utente e può essere modificato dinamicamente in fase di esecuzione. Suppongo che potremmo tenere un dict di default default e confrontarlo con quello. Non è chiaro come questo interagirà con il foglio di stile [[MEP26]] - @tacaswell
Note aggiuntive:
I "dati grezzi" non devono necessariamente essere un
list
,ndarray
, ecc. Piuttosto, in modo più astratto possono avere solo un metodo per fornire dati quando necessario.Poiché
Controller
conterrà informazioni aggiuntive che gli utenti potrebbero non voler conservare, non dovrebbe essere creato per impostazione predefinita. Dovresti essere in grado di (a) istanziare aController
con una figura e (b) costruire una figura con aController
.
Casi d'uso:
Esporta tutte le informazioni necessarie
Serializzare una figura matplotlib, salvarla e poterla rieseguire in seguito.
Qualsiasi altra fonte che invia una rappresentazione opportunamente formattata a matplotlib per l'apertura
Esempi #
Ecco alcuni esempi di ciò che i controllori dovrebbero essere in grado di fare.
Crea un'istanza di una figura matplotlib da una rappresentazione serializzata (ad esempio, JSON):
import json from matplotlib.controllers import Controller with open('my_figure') as f: o = json.load(f) c = Controller(o) fig = c.figure
Gestisci gli artisti dal controller (ad esempio, Line2D):
# not really sure how this should look c.axes[0].lines[0].color = 'b' # ?
Esporta rappresentazione della figura serializzabile:
o = c.to_json() # or... we should be able to throw a figure object in there too o = Controller.to_json(mpl_fig)
Implementazione n.
Creare
Controller
oggetti di base in grado di gestireArtist
oggetti (ad esempio,Hist
)Commenti:
l' inizializzazione dovrebbe avvenire tramite unpacking
**
, quindi abbiamo bisogno di una copia del parametro di firma della chiamata per ilArtist
che alla fine stiamo cercando di controllare. Sfortunata ripetizione codificata...dovrebbe essere rintracciato l'ulteriore
**kwargs
accettato da ciascuno alArtist
Controller
come fa a
Controller
sapere quale artista appartiene a dove? Ad esempio, dobbiamo passare iaxes
riferimenti?
Progresso:
Un semplice NB che dimostra alcune funzionalità per
Line2DController
gli oggetti: https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
Scrivere nei protocolli per
Controller
aggiornare il modello.Commenti:
come devono essere trattati i contenitori? Ad esempio, cosa succede alle vecchie patch quando ribiniamo un istogramma?
nel collegamento da (1), la vecchia riga è completamente distrutta e ridisegnata, e se qualcosa vi fa riferimento?
Crea il metodo con cui un oggetto json può essere assemblato dal file
Controllers
Gestire la serializzazione degli aspetti non serializzabili di una figura (ad es. trasformazioni non affini?)
Essere in grado di istanziare da una rappresentazione serializzata
Reimplementare il metodo pyplot e Axes esistente, ad esempio
pyplot.hist
eAxes.hist
in termini della nuova classe controller.
> @theengineer: al n. 2 sopra, cosa intendi per ottenere aggiornamenti da ciascuno Artist
?
^ Già. Non Controller
dovrebbe essere necessario aggiornarsi. Questo accade solo nel numero 3. Elimina i commenti quando vedi questo.
Compatibilità con le versioni precedenti #
il decapaggio cambierà
le trasformazioni non affini richiederanno un metodo di decapaggio definito
Alternative #
PR # 3150 ha suggerito di aggiungere la semantica collegando in modo parassitario contenitori aggiuntivi agli oggetti assi. Questa è una soluzione più completa con quello che dovrebbe essere un framework più sviluppato/flessibile/potente.