개인적으로 MATLAB의 가장 큰 장점 중 하나는 강력한 그래프 출력 기능이라고 생각한다.
실제로 나를 포함한 많은 대학원생들 및 연구자들이 매트랩을 이용해서 지금 이 순간에도 이쁜 그래프를 얻기 위해 편집과 수정을 반복하고 있을 것이다.
하지만, 그럼에도 불구하고 종종 내 모니터에서 보던 이쁜 그래프는 온데간데 사라지고 저장해뒀던 그래프를 불러면 일주일 넘게 가출했다가 거지몰골로 돌아온 행색처럼 보인다. 분명히 선도 깔끔하고 마커 사이즈도 적당하고 폰트도 모든것이 완벽했는데 EPS 포맷의 그래프는 그 모든것을 부정해버리는 것 같다.
실제로 구글을 해보면 이러한 문제에 대해 호소하는 전 세계 유저들의 글을 쉽게 찾아 볼 수 있다.
그럼 도대체 왜 이런 현상이 벌어지는 거고 우리가 원하는 이쁜 그래프는 어떻게 그릴수 있고 얻을 수 있는걸까?
일단 이러한 차이가 발생하는 가장 큰 이유는 '그림의 크기를 고려하는 단위(관점)의 차이'이다.
즉, 자신의 모니터 해상도에 따른 픽셀의 수를 기준으로 그림의 크기를 조정하기 때문에 위와 같은 문제가 발생하는 것이다. 매트랩은 기본적으로 그림 파일을 출력할 때 그림의 크기를 기본적으로 A4로 지정하고 있기 때문에 figure의 크기를 A4의 물리적 사이즈에 맞춰서 설정해줘야 한다.
위에서 언급한 문제들에 대해서 정확한 원인과 해결 방법을 상세하게 설명해 둔 'AureaGenus'님의 글이 있으니 참고하면 좋을 것 같다. [링크]
나 또한 비슷한 내용으로 고민했는데 해당 글을 참고하여 원하는 사이즈와 형태의 EPS 그래프를 얻을 수 있었다.
매트랩에서는 하나의 figure안에 여러개의 그래프를 그리기위해 subplot 함수를 종종 이용하는데, 문제는 subplot내의 여백이 꽤나 크다는 점이다. 따라서 subplot을 이용하여 EPS 포맷으로 그대로 저장하게 되면 각 subfigure의 그림들이 매우 작아 보이게 되어 가독성이 떨어지는 그래프가 만들어지게 된다.
아래의 코드는 subplot 2X2에 대한 예제이다.
위에서 참고한 방법과는 조금 다르게 접근한 방식인데, 전체 figure(not subplot)의 사이즈만 정해주고,
subplot들의 사이즈를 늘이거나 줄이는 방식을 통해 전체 figure의 사이즈에 딱 맞게 조절하였다.
물론 이 경우엔 약간의 노가다가 필요하지만, 그래프나 텍스트의 사이즈 및 특성에 따라 자유롭게 조절이 가능하여 subplot을 EPS 포맷으로 저장할 때 원하는 사이즈에 맞춰서 저장할 수 있다.
clear all, close all, clc;
%%
fig_width = 8; % Figure width size [inch]
fig_height = 7; % Figure height size[inch]
hFig = figure(1);
set(hFig,'renderer','painters');
set(hFig,'units','inches');
set(hFig,'position',[3 2 fig_width fig_height]);
set(hFig,'PaperUnits','inches'); % Figure의 사이즈 단위를 'inch'로 설정
set(hFig,'PaperSize', [fig_width fig_height]);
set(hFig,'PaperPositionMode', 'manual');
set(hFig,'PaperPosition',[0 0 fig_width fig_height]);
set(hFig,'Color','w');
fontname = 'times new roman';
set(0,'defaultaxesfontname',fontname);
set(0,'defaulttextfontname',fontname);
fontsize = 9; % pt
set(0,'defaultaxesfontsize',fontsize);
set(0,'defaulttextfontsize',fontsize);
set(0,'fixedwidthfontname','times');
%%
Line_Style = {'-d', '-h', '-s', '-.>', '--v'};
Line_Color = [ {'[1 0 0]'}, {'[0 0.4470 0.7410]'}, {'[0.4660 0.6740 0.1880]'}, {'[0 0 0]'}, {'[0.72, 0.27, 1.00]'}];
Legend_List = {'A-scheme', 'B-scheme', 'C-scheme', 'D-scheme' };
Size_Marker = 4;
Line_Size = [0.5 0.5 0.5 0.5 0.5];
label_FontSize = 10;
%%
x = linspace(0, 1, 50);
y(1,:) = sin(2*pi*x);
y(2,:) = cos(2*pi*x);
y(3,:) = 1.5*sin(2*pi*x);
y(4,:) = 1.5*cos(2*pi*x);
sub_pos = [0.06 0.53 0.42 0.33 ; ...
0.56 0.53 0.42 0.33 ; ...
0.06 0.09 0.42 0.33 ; ...
0.56 0.09 0.42 0.33];
for idx=1:4
subFig=subplot(2,2,idx);
plot(x, y(idx,:) , Line_Style{idx}, 'MarkerSize', Size_Marker, ...
'Color', Line_Color{idx}, 'LineWidth', Line_Size(idx) ), grid on, hold on;
xlabel('Time [s]', 'FontSize', label_FontSize, 'FontName', 'times');
ylabel('Voltage [V]', 'FontSize', label_FontSize, 'FontName', 'times');
legend(Legend_List(idx), 'FontSize', 7, 'FontName', 'times', 'NumColumns', 2);
set(subFig, 'position', sub_pos(idx,:));
end
'Engineering > MATLAB' 카테고리의 다른 글
#4. 무작위로 행렬 원소 섞기 (0) | 2018.10.12 |
---|---|
#3. 매트랩 CVX 다운로드 및 설치 (1) | 2018.10.08 |
#2. 매트랩을 이용한 원 내부에 임의의 점 생성 (0) | 2018.09.17 |
#1. Matlab을 이용한 간단한 Signal 의 Convolution 구현 (2) | 2013.02.12 |