2015-12-20 33 views
6

Io uso plotyy di mettere due lotti in un grafico:MATLAB: disallineato scatole in plotyy dopo aver salvato come fig

f = figure('Color','white'); 
[ax,p1,p2] = plotyy(xx, yy1, xx, yy2); 
ylabel(ax(1),'Phase','FontSize',18); 
ylabel(ax(2),'Spectrum','FontSize',18); 
set(ax,{'ycolor'},{'k';'k'}); 
set(p1,'LineWidth',2,'Color',[0.4940,0.1840,0.5560]); 
set(p2,'LineWidth',2,'Color','red'); 
xlabel(ax(1),['Frequency [THz]'],'FontSize',18); 
set(ax,'FontSize',14) 

figura viene visualizzato perfettamente, ma quando provo a salvarlo come appare fig qualcosa come scatole disallineati .

incorrectly saved figure

ho provato ad usare linkaxes, ma senza risultato.

+0

usare 'export_fig' –

+1

@AnderBiguri, export_fig non salva come file .fig. Le opzioni valide sono le seguenti: '-pdf', '-eps', '-png', '-tif', '-jpg' e '-bmp'. – Sylwia

+0

Quello che stai vivendo non è chiaro. La figura diventa disallineata dopo averla salvata? O torna solo disallineato quando lo si carica dal file '.fig'? Come stai salvando '.fig' in primo luogo? –

risposta

3

plotyy è stata una delle mie funzioni MATLAB preferite da amare odiare. È una funzione davvero utile con cui mi sembra sempre di imbattersi in bug, al punto in cui ho completamente smesso di usarla per impilare solo due (o più) oggetti di assi e tracciandoli separatamente. È quindi possibile impostare la proprietà Position degli assi "secondari" come gli assi primari e verranno impilati correttamente.

Un esempio funzionale:

xx = linspace(-15,15,100); 
yy1 = sin(xx); 
yy2 = cos(xx); 
f = figure('Color','white'); 

ax(1) = axes('Parent', f); 
ax(2) = axes('Parent', f, 'Color', 'none', 'XTick', [], 'YAxisLocation', 'right'); 

p1 = plot(ax(1), xx, yy1); 
hold(ax(2), 'on'); % Hold to preserve our axes properties set above 
p2 = plot(ax(2), xx, yy2); 
hold(ax(2), 'off'); 

ylabel(ax(1),'Phase','FontSize',18); 
ylabel(ax(2),'Spectrum','FontSize',18); 
set(ax,{'ycolor'},{'k';'k'}); 
set(p1,'LineWidth',2,'Color',[0.4940,0.1840,0.5560]); 
set(p2,'LineWidth',2,'Color','red'); 
xlabel(ax(1),'Frequency [THz]','FontSize',18); 
set(ax,'FontSize',14) 

set(ax, 'ActivePositionProperty', 'position'); % Resize based on position rather than outerposition 
set(ax(2), 'Position', get(ax(1), 'Position')); % Set last to account for any annotation changes 

Insieme con impilamento gli assi è possibile notare che ho impostato il ActivePositionProperty a position (anziché outerposition). MATLAB resizes axes automatically quando la proprietà Units è impostata su Normalized e sembra che questo sia il punto principale in cui si verifica il problema. Durante il ridimensionamento, MATLAB modifica anche il valore OuterPosition per i secondi assi, provocando la ridimensionamento della porzione di stampa. La differenza è piccola, [0 0 1 1] rispetto a [0 0.0371 1.0000 0.9599] nel mio caso, ma l'effetto è ovviamente molto pronunciato. È possibile utilizzare get e set per risolvere questo problema, ma è necessario farlo su ogni ridimensionamento che è abbastanza fastidioso. L'alternativa è ridimensionare in base allo Position, che sembra alleviare il problema ed è un tweak presente nell'implementazione R2015b di plotyy. Questo corregge anche plotyy tranne per i casi in cui la finestra è molto piccola, quindi ho lasciato la mia risposta con l'approccio più generico.