[matplotlib] savefig non salva in trasparenza
ciao, avrei bisogno di salvare il Fit in trasparenza da sovrapporre alla distribuzione :
Ho salvato in questo modo , nel buffer, ma non salva in trasparenza.Vedo solo il fit a sfondo bianco ma non più la distribuzione:
Come posso risolvere? Grazie
Ho salvato in questo modo , nel buffer, ma non salva in trasparenza.Vedo solo il fit a sfondo bianco ma non più la distribuzione:
buf2 = io.BytesIO() self.fig.savefig(buf2, format = 'png', dpi=100, transparent = True) buf2.seek(0)
Come posso risolvere? Grazie
Risposte
mic_1 te l'abbiamo già fatto notare nei thread precedenti: non puoi mostrare solo tre linee di codice ed aspettarti che chi legge capisca e risolva il problema.
Tutto quello che sappiamo è che hai salvato un oggetto di tipo Figure in un buffer.
Cosa contiene quella figura?
Che assi ci hai creato?
Che grafici hai creato su quegli assi?
Come e quante altre volte usi quel buffer?
Come estrai l'immagine da quel buffer?
Cosa vuoi ottenere di preciso?
Discutere online è un aspetto frequente e fondamentale per uno sviluppatore, e sapere come chiedere (ma anche offrire) aiuto è una competenza importante da imparare. Qui c'è una scaletta abbastanza dettagliata per creare un esempio minimo e completo. Fanne tesoro per il futuro.
Farò comunque un tentativo di capire cosa vuoi ottenere e quale sia il problema, senza garanzia di riuscirci.
Stai creando due figure diverse con grafici diversi ma "logicamente" collegati, e vuoi ottenere una figura finale contenente la loro sovrapposizione. Quindi hai pensato di salvare la prima figura in un buffer, "riavvolgere" il buffer, e salvare la seconda figura nello stesso.
Questo purtroppo non funziona come credi. [inline]savefig()[/inline] converte la figura nel formato PNG, cioè una sequenza di byte, che viene copiata dentro il buffer.
Quando salvi la seconda figura, viene convertita anche essa in una sequenza di byte, che vengono scritti nel buffer, sovrascrivendo qualsiasi cosa ci fosse prima.
In un'immagine PNG la trasparenza è sostanzialmente un colore (o più precisamente un canale), cioè alcuni pixel possono avere un colore più o meno trasparente. Ma una volta che hai convertito l'immagine in una sequenza di byte, questo concetto perde di significato. I byte non hanno trasparenza, se li scrivi sopra altri byte quelli vecchi vanno perduti, quindi alla fine ti rimane solamente la seconda immagine.
Per ottenere quello che vuoi hai due possibilità:
Tutto quello che sappiamo è che hai salvato un oggetto di tipo Figure in un buffer.
Cosa contiene quella figura?
Che assi ci hai creato?
Che grafici hai creato su quegli assi?
Come e quante altre volte usi quel buffer?
Come estrai l'immagine da quel buffer?
Cosa vuoi ottenere di preciso?
Discutere online è un aspetto frequente e fondamentale per uno sviluppatore, e sapere come chiedere (ma anche offrire) aiuto è una competenza importante da imparare. Qui c'è una scaletta abbastanza dettagliata per creare un esempio minimo e completo. Fanne tesoro per il futuro.
Farò comunque un tentativo di capire cosa vuoi ottenere e quale sia il problema, senza garanzia di riuscirci.
Stai creando due figure diverse con grafici diversi ma "logicamente" collegati, e vuoi ottenere una figura finale contenente la loro sovrapposizione. Quindi hai pensato di salvare la prima figura in un buffer, "riavvolgere" il buffer, e salvare la seconda figura nello stesso.
Questo purtroppo non funziona come credi. [inline]savefig()[/inline] converte la figura nel formato PNG, cioè una sequenza di byte, che viene copiata dentro il buffer.
Quando salvi la seconda figura, viene convertita anche essa in una sequenza di byte, che vengono scritti nel buffer, sovrascrivendo qualsiasi cosa ci fosse prima.
In un'immagine PNG la trasparenza è sostanzialmente un colore (o più precisamente un canale), cioè alcuni pixel possono avere un colore più o meno trasparente. Ma una volta che hai convertito l'immagine in una sequenza di byte, questo concetto perde di significato. I byte non hanno trasparenza, se li scrivi sopra altri byte quelli vecchi vanno perduti, quindi alla fine ti rimane solamente la seconda immagine.
Per ottenere quello che vuoi hai due possibilità:
[*:1tnf1a5r] Crei i due grafici sullo stesso oggetto Figure. Non sapendo cosa contengano di preciso i tuoi grafici non so se questo specifico caso sia effettivamente supportato da matplotlib.
[/*:m:1tnf1a5r]
[*:1tnf1a5r] Crei due immagini indipendenti (quindi in due buffer diversi) e usi una libreria come Pillow per sovrapporle (Pillow opera su oggetti Immagine, non su file, quindi supporta la trasparenza nel modo in cui ti aspetti).
Un esempio e un altro a riguardo.
Potresti dover aggiustare manualmente il posizionamento e la scala, altrimenti la sovrapposizione potrebbe risultare errata.[/*:m:1tnf1a5r][/list:u:1tnf1a5r]
Ti ringrazio Claudio
ma ho specificato che ho una Fit (anzi in alcuni casi anche 2 FIT) che vorrei rendere trasparente per poi sovrapporla/e alla distribuzione. Più chiaro di così. Come siano fatte le 2 immagini poco importa, ciò che più conta è una istruzione o parametro che mi permetta alla pressione del bottone ON di inserirla e alla pressione OFF di toglierla (punto che ho già risolto).
Il problema che per come le sovrappongo ora, la fit ha sfondo bianco e si sovrappone alla distribuzione oscurandola. Se fosse trasparente invece si vedrebbe l'immagine sottostante.
Inutile che metta qui tutto il codice perchè non serve, tanto meno il programma perchè è riservato.
Solo a verbalizzazione effettuata lo potrò condividere ai fini di istruzione per chi volesse, ma per il momento non se ne parla. Se non sai aiutarmi va bene lo stesso, figurati, ma non penso sia utile il mio programma tanto meno se non si conosce wxpython
Ho trovato sul web l'uso della libreria OPENCV per il discorso immagini e trasparenze ma la si può installare solo su versione python 2.7. (io ho la 3.7) Ho provato su Ananconda da cui lavoro ma impiega un tempo interminabile.
Si ho trovato anche qualche esempio con l'uso della libreria PILLOW ma mi chiedevo, e chiedo a voi, se con MATPLOTLIB si può risolvere.
Ho visto poi altre librerie python, tipo MATPLOTLIB.IMAGE. Qualcuno di voi conosce questa parte riferita alle immagini? Qualcuno l'ha usata? la Image di Matplotlib può aiutarmi a risolvere?
La istruzione che ho usato plt.savefig() fa parte della libreria MATPLOTLIB.PYPLOT AS PLT. (io ho usato questa libreria per la creazione delle immagini quindi chi la conosce mi sa dire se contiene un qualche parametro o istruzione che mi consenta di ottenere il risultato desiderato)
Ti ringrazio per la spiegazione su savefig(): ho pensato di usare questa istruzione perchè salvava file temporaneo senza lasciare traccia della immagine creata. C'è altro modo con la stessa libreria di ottenere tale risultato? Non vorrei installare troppe librerie sinceramente.
In questo esempio viene usata
Forse devo solo evitare di salvarla nel BUFFER ?!?!
Mi hai dato nuovo spunto su cui lavorare. Alla fine sono bastate quelle 3 righe vedi
Grazie!
ma ho specificato che ho una Fit (anzi in alcuni casi anche 2 FIT) che vorrei rendere trasparente per poi sovrapporla/e alla distribuzione. Più chiaro di così. Come siano fatte le 2 immagini poco importa, ciò che più conta è una istruzione o parametro che mi permetta alla pressione del bottone ON di inserirla e alla pressione OFF di toglierla (punto che ho già risolto).
Il problema che per come le sovrappongo ora, la fit ha sfondo bianco e si sovrappone alla distribuzione oscurandola. Se fosse trasparente invece si vedrebbe l'immagine sottostante.
Inutile che metta qui tutto il codice perchè non serve, tanto meno il programma perchè è riservato.
Solo a verbalizzazione effettuata lo potrò condividere ai fini di istruzione per chi volesse, ma per il momento non se ne parla. Se non sai aiutarmi va bene lo stesso, figurati, ma non penso sia utile il mio programma tanto meno se non si conosce wxpython

Ho trovato sul web l'uso della libreria OPENCV per il discorso immagini e trasparenze ma la si può installare solo su versione python 2.7. (io ho la 3.7) Ho provato su Ananconda da cui lavoro ma impiega un tempo interminabile.
Si ho trovato anche qualche esempio con l'uso della libreria PILLOW ma mi chiedevo, e chiedo a voi, se con MATPLOTLIB si può risolvere.
Ho visto poi altre librerie python, tipo MATPLOTLIB.IMAGE. Qualcuno di voi conosce questa parte riferita alle immagini? Qualcuno l'ha usata? la Image di Matplotlib può aiutarmi a risolvere?
La istruzione che ho usato plt.savefig() fa parte della libreria MATPLOTLIB.PYPLOT AS PLT. (io ho usato questa libreria per la creazione delle immagini quindi chi la conosce mi sa dire se contiene un qualche parametro o istruzione che mi consenta di ottenere il risultato desiderato)

Ti ringrazio per la spiegazione su savefig(): ho pensato di usare questa istruzione perchè salvava file temporaneo senza lasciare traccia della immagine creata. C'è altro modo con la stessa libreria di ottenere tale risultato? Non vorrei installare troppe librerie sinceramente.
In questo esempio viene usata
savefig('demo.png', transparent=True)
Forse devo solo evitare di salvarla nel BUFFER ?!?!

Mi hai dato nuovo spunto su cui lavorare. Alla fine sono bastate quelle 3 righe vedi

Grazie!
"mic_1":
Più chiaro di così. Come siano fatte le 2 immagini poco importa, ciò che più conta è una istruzione o parametro che mi permetta alla pressione del bottone ON di inserirla e alla pressione OFF di toglierla
Ci sono infiniti modi per completare quelle tre linee che hai mostrato all'inizio, e il problema dipende da quale modo in particolare hai seguito nel tuo codice che non hai mostrato. È impossibile risolvere il problema senza queste informazioni.
Ciò non vuol dire che devi mostrare l'intero programma, quello sarebbe ancora sbagliato. Devi mostrare un esempio minimo e completo riguardante il problema specifico della trasparenza. Deve essere sia minimo che completo.
Deve essere abbastanza minimo da non contenere niente che non sia essenziale. Non la raccolta dati, né l'algoritmo di fit, né necessariamente l'interfaccia grafica (a meno che il problema non sia effettivamente nell'interfaccia grafica, ma sembra che qui sia nell'immagine stessa).
Deve essere abbastanza completo da poterlo copiare e incollare in un file ed eseguirlo, ottenendo come risultato un'immagine che copre un'altra immagine. Non deve essere chi ti aiuta a dover completare il codice per renderlo eseguibile. Chi ti aiuta sta dedicando il suo tempo a te senza chiedere niente in cambio: se gli rendi il compito più difficile di quanto già sia, semplicemente lascerà perdere.