2015-06-16 22 views
6

MATLABs nuovo motore grafico, HG2, non riesce a stampare correttamente le patch utilizzando la pittori renderer:patch dividere triangolari con i pittori renderer in MATLAB 2014b e soprattutto

hist(randn(1,1000)); 
colorbar('Location','SouthOutside'); 
print('test.pdf','-dpdf'); 

Le patch derivanti, sia generato da hist o colorbar, hanno divide triangolari:

Triangular splits in patches

La questione è stata discussa in MATLAB Central here e here, dove è stato suggerito che disabilitare l'opzione "smooth line art" nel visualizzatore di file PDF dovrebbe risolverlo. Ciò nasconde il problema in alcuni lettori (ad esempio in Adobe Reader ma non in Apple Preview), ma non è certo una soluzione chiedere ai collaboratori e ai lettori di utilizzare uno specifico visualizzatore di PDF con impostazioni non predefinite affinché la grafica appaia correttamente. Guardando il file risultante in Inkscape, è chiaro che la divisione è presente nella grafica vettoriale di output. Qui, mi sono trasferito una metà del colorbar, dimostrando che in realtà è diviso a metà, e non solo interpretato male dal pdf-viewer:

enter image description here

Il problema non è presente con il renderer OpenGL (print('test.pdf','-opengl') , ma poi l'output non è vettorializzato). Il problema persiste in MATLAB 2015a.

Esiste un modo per esportare immagini vettoriali senza artefatti in MATLAB 2014b o versioni successive?

+0

L'unica soluzione che ho trovato finora è la post-elaborazione, ad es. in Adobe Illustrator. Per La barra dei colori aiuta a rimuovere semplicemente la maschera di ritaglio. Per l'istogramma, devi selezionare tutti i triangoli (Attraverso seleziona lo stesso aspetto) e aggiungere un tratto di contorno sottile. Non aiuta MATLAB a esportare i triangoli come percorsi chiusi, quindi è potenzialmente necessario chiudere manualmente ogni percorso per farlo funzionare. Questo, ovviamente, è fattibile solo per cifre finali non troppo complesse ... – zeeMonkeez

risposta

1

Ecco un discutibile lavoro intorno finché il vero problema è risolto:

Le linee diagonali sono semplicemente lo spazio vuoto tra i triangoli, quindi ciò che vediamo è lo spazio vuoto dietro i cerotti sbirciare attraverso. Stupida idea: Riempiamo quello spazio con i colori corrispondenti invece che con il bianco.

Per fare ciò, copieremo tutti gli oggetti e ne compenseremo i nuovi solo con un bit di tiiiiny.

Codice:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside'); 
print('test.pdf','-dpdf');    %// print original for comparison 

f1 = gcf; 
g = get(f1,'children'); 
n = length(g); 
copyobj(g,f1);       %// copy all figure children 

Gli oggetti copiati sono ora i primi n elementi nell'array 2*nf1.Children. Sono esattamente in cima allo dei vecchi oggetti.

g=get(f1,'children'); 
for i=1:n; 
    if strcmpi(g(i).Type,'axes'); 
     set(g(i),'color','none','position',g(i).Position+[0.0001 0 0 0]); 
     set(g(i+n),'position',g(i+n).Position);       %// important! 
    end; 
end; 
print('test2.pdf','-dpdf'); 

Spiegazione:

g = get(f1,'children'); ottiene tutti gli assi, colorbars, ecc, nella figura corrente.

colorbar oggetti sono collegati a un assi, motivo per cui dovremo spostare solo i bambini di tipo axes.

L'impostazione di color su none rende trasparente lo sfondo dei nuovi assi (poiché sono in cima a quelli precedenti).

g(i).Position+[0.0001 0 0 0] sposta i nuovi assi di 0,0001 unità normalizzate a destra.

set(g(i+n),'position',g(i+n).Position); Questa riga non è necessaria, ma l'ultima immagine qui sotto mostra cosa succede quando si stampa, se non lo si include.

A seconda dei tipi di grafica oggetti che hanno tracciato, potrebbe essere necessario modificare questo per soddisfare le proprie esigenze, ma questo codice dovrebbe funzionare se si dispone di solo colorbar e asce oggetti.

originale:

original

Con mod:

enter image description here

Senza %// important! linea:

enter image description here

0

In R2015b, histogram sembrava non mostrare le linee bianche, ma fill ha fatto.

Per trame semplici basta incollare nuovamente i dati:

x = 0:pi/100:pi; 
y = sin(x); 
f = fill(x,y,'r'); 
hold on; 
f2 = fill(x,y,'r'); %// Worked like magic 

Se la magia non riesce cercare simile alla risposta di Geoff: f2 = fill(x+0.0001,y,'r');

0

A seconda di quale versione di Matlab in uso, si potrebbe tentare di utilizzare epsclean. Non sembra funzionare con versioni molto recenti di Matlab come 2017a.

In caso contrario, epsclean può essere eseguito su un file eps esistente (non in formato pdf) esportato con l'opzione -painters per generare una figura vettoriale, e riscriverà (o creerà un altro file) con quelle linee bianche rimosse.