2015-12-20 21 views
6

używam plotyy umieścić dwie działki w jednym wykresie:MATLAB: wyrównane pola w plotyy po zapisaniu jako rys

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) 

Rysunek jest doskonale wyświetlanej, ale gdy próbuję go zapisać jako pojawia rys coś skrzynek mylące .

incorrectly saved figure

Próbowałem użyć linkaxes, ale bez rezultatu.

+0

użyj 'export_fig' –

+1

@AnderBiguri, export_fig nie zapisuje jako pliki .fig. Prawidłowe opcje są następujące: "-pdf", "-eps", "-png", "-tif", "-jpg" i "-bmp". – Sylwia

+0

To, czego doświadczasz, jest niejasne. Czy figura nie jest wyrównana po zapisaniu? Czy też wraca on źle po załadowaniu z pliku '.fig'? W jaki sposób zapisujesz ".fig" w pierwszej kolejności? –

Odpowiedz

3

plotyy to jedna z moich ulubionych funkcji MATLAB, która uwielbia nienawidzić. Jest to naprawdę przydatna funkcja, z której zawsze wydaje mi się, że robię błędy, do tego stopnia, że ​​całkowicie przestałem jej używać na rzecz ułożenia dwóch (lub więcej) obiektów osi i spiskowania do nich osobno. Następnie możesz ustawić właściwość Position dla osi "podrzędnych" na takie same, jak osie podstawowe i ładnie się układają.

Funkcjonalny przykład:

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 

Wraz z układania osie można również zauważyć, że mam ustawić ActivePositionProperty do position (zamiast outerposition). MATLAB resizes axes automatically, gdy właściwość Units jest ustawiona na Normalized i wydaje się, że jest to główne miejsce powstawania problemu. Podczas zmiany rozmiaru MATLAB modyfikuje również wartość OuterPosition dla drugiej osi, powodując zmianę rozmiaru części wydruku. Różnica jest niewielka, [0 0 1 1] vs. [0 0.0371 1.0000 0.9599] w moim przypadku, ale efekt jest oczywiście bardzo wyraźny. Możesz użyć get i set, aby to naprawić, ale będziesz musiał to zrobić przy każdej zmianie rozmiaru, co jest dość denerwujące. Alternatywą jest zmiana rozmiaru w oparciu o Position, która wydaje się łagodzić problem i jest poprawką obecną w implementacji R2015b plotyy. To również naprawia plotyy, z wyjątkiem przypadków, gdy okno jest bardzo małe, więc zostawiłem swoją odpowiedź z bardziej ogólnym podejściem.