2015-05-04 23 views
5

Quando utilizzo le funzioni fill o viscircles per tracciare cerchi con sfondo alla trama, in figura appare nella parte superiore della trama, come previsto, ma dopo aver salvato come jpg o png, lo sfondo si sposta nella parte inferiore del grafico e non è più visibile.Spostamento dello sfondo di riempimento verso il basso dopo aver salvato come jpg

enter image description here

Come posso risolvere questo problema?

nota: non è perché il bianco è colore trasparente. Ho provato il grigio, ho provato il rosso, entrambi si comportano allo stesso modo del bianco.

+0

Hai provato ['export_fig'] (http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig)? Dovrebbe consentire di salvare figure più vicine al modo in cui vengono visualizzate. –

+0

@ Dev-iL, l'ho provato in questo momento e ha lo stesso problema. – user50222

+0

Potresti caricare il file '.fig' da qualche parte? Potrei riuscire a fare qualcosa con questo ... –

risposta

3

perche il seguente esempio (fatta su MATLAB 2015A):

figure(); h=cell(1); 
%% viscircles method: 
subplot(1,2,1); 
plot([0 1],[0,1]); set(gca,'Color',0.8*[1 1 1]); axis square; 
h{1} = viscircles([0.5,0.5], 0.1,'EdgeColor','k','DrawBackgroundCircle',false); 
get(h{1},'Children') 

%// Line with properties: 
%// 
%//    Color: [0 0 0] 
%//   LineStyle: '-' 
%//   LineWidth: 2 
%//    Marker: 'none' 
%//   MarkerSize: 6 
%// MarkerFaceColor: 'none' 
%//    XData: [1x182 double] 
%//    YData: [1x182 double] 
%//    ZData: [1x0 double] 

%% Annotation method: 
subplot(1,2,2); 
plot([0 1],[0,1]); set(gca,'Color',0.8*[1 1 1]); axis square; 
pos = get(gca,'position'); 
h{2} = annotation('ellipse',[pos(1)+pos(3)*0.5 pos(2)+pos(4)*0.5 0.1 0.1],... 
        'FaceColor','w') 
%// Ellipse with properties: 
%// 
%//  Color: [0 0 0] 
%// FaceColor: [1 1 1] 
%// LineStyle: '-' 
%// LineWidth: 0.5000 
%//  Position: [0.7377 0.5175 0.1000 0.1000] 
%//  Units: 'normalized' 

Quando si salva l'output a .jpg ottengo il seguente risultato (che è identico al l'anteprima all'interno della figura):

Comparison of two circle-drawing methods

Si noti la proprietà FaceColor nella seconda cella di codice, che è assente nel 1 ° oggetto. Il problema sembra essere che la funzione viscircles che hai usato non dovrebbe disegnare una forma con uno sfondo, piuttosto, disegna una linea. Non mi è chiaro il motivo per cui vedi l'anteprima come fai tu (cioè con uno sfondo).

Sidenote: l'opzione 'DrawBackgroundCircle' per viscircles disegna semplicemente uno sfondo bianco per il contorno.

Si dovrebbe provare alcuni modi alternativi per tracciare cerchi pieni, come ad esempio:

  • Utilizzando annotation oggetti come nel mio esempio di cui sopra. Nota che questi richiedono di fornire le coordinate nelle unità figure (e non negli assi!).
  • Utilizzando filled polygons:

    N=20; c=[0.5,0.5]; r=0.1; color = [1 1 1]; 
    t = 2*pi/N*(1:N); 
    hold all; fill(c(1)+r*cos(t), c(2)+r*sin(t), color); 
    

    [frammento si basa su a comment of this submission]

  • Tracciare con indici giganti:

    plot(0.5,0.5,'.r','MarkerSize',70); 
    

    o

    scatter(0.5,0.5,70,'r','filled'); 
    

    [snippet è basato su this answer]. Come accennato nel link, il lato negativo qui è che la dimensione del marcatore non cambia con lo zoom.

  • Come ultima risorsa, è possibile salvare l'immagine in un formato vettoriale (come .emf), modificarla (con qualcosa come InkScape), portare i cerchi di sfondo su un livello superiore ed esportarlo.
+0

In effetti il ​​tuo codice produce cerchi con uno sfondo bianco anche dopo aver salvato in jpg. Ma tracciai più trame in una figura e ho bisogno che i cerchi siano esattamente in una determinata posizione. Non so come ottenere una posizione precisa della trama specifica. Non so quanto siano grandi gli spazi tra le trame. Inoltre sto usando la funzione del pannello per ridurre questi spazi. – user50222

+1

La mappatura delle coordinate degli assi da e per calcolare le coordinate può essere eseguita come spiegato in [questa risposta centrale MATLAB] (http://www.mathworks.com/matlabcentral/newsreader/view_thread/61816). –

0

prova:

print('-painters','-dpng','myFile') 

o

print('-painters','-dsvg','myFile') 

Logic: da documentation sembra che il modello di rendering è cambiato da pittore (quelli desiderati) per OpenGL durante il salvataggio del file. Sospetto che OpenGL non rispetti le tue intenzioni e forzare il rendering a pittore risolverà il problema. Ma non è chiaro se il rendering pittore possa essere utilizzato per immagini bitmap e non solo immagini vettoriali, quindi il primo esempio può fallire.

+0

Grazie per la tua reazione, ma questo approccio non fa differenza. Ancora non funziona. – user50222