본문 바로가기
컴퓨터/자질구레 팁

매틀랩에서 히스토그램 선으로 그리기

by adnoctum 2011. 3. 9.


   내가 원하는 그래프의 모양은 두 개의 히스토그램이 한 그래프에 '선'으로 그려진 다음과 같은 것이다.

그림 1. 선으로 된 히스토그램. 내가 원했던 그래프 형태.



물론 기본적으로 메틀랩에서는 다음과 같이 서로 다른 두 히스토그램을 한 그래프에 그릴 수 있는 방법을 제공하기는 한다.

그림 2. bar로 된 히스토그램. 메틀랩에서 기본적으로 제공해 주는, 여러 히스토그램을 한 그래프에 그릴 수 있는 형태.


그러나 나는 위 그림이 좀 마음에 안 들어서 hist 명령어만 가지고 그림 1. 과 같이 하고자 하였지만 적절한 방법을 찾지 못하다가, 살짝 생각을 바꿔서 binning[각주:1] 에 관련되어 있을 것으로 추측, 메틀랩 도움말을 검색하니 역시나 있다. 그 방법을 살펴 보자.

관건은 histc 라는 명령어 이다. 이 명령어의 가장 기본적인 형태는 다음과 같다.

h = histc(d, intervals);

vector d 에 대하여, intervals vector 의 i 번째와 i+1 번째 사이에 들어가는 d 의 요소의 개수를 세서 h[i] 로 반환을 하는 역할을 한다. 즉, 각 구간에 속한 데이터의 개수를 세어서 반환하는 역할을 한다. 따라서, 원래 hist 명령어는 저렇게 반환된 h 를 bar 명령어로 넘기는 정도의 일을 할 것이다. 어쨌든, 저렇게 반환받은 값을 이용해서 plot 명령어로 넘기면 되는 것이지. 실제 matlab 코드는 다음과 같다.

% ... 이 앞에 d1 과 d2 가 생략되어 있음.
% 0 부터 1 까지를 100 개의 구간으로 자른다.
intervals = linspace(0, 1, 100);
% 각 데이터 d1 과 d2 에 대하여, 각 구간에 속한 데이터의 개수를 세어서 h1 과 h2로 반환한다.
h1 = histc(d1, intervals);
h2 = histc(d2, intervals);
% 선으로 도수분포표를 그린다.
plot(intervals, h1, 'r', intervals, h2, 'b');

실제 m 파일은 다음에 있다.


위 데이터에서는 별로 차이가 없는데, 만약 위에서 d1과 d2의 요소의 개수가 많이 달랐고, 중요한 것은 각 데이터에서 각 구간에 속한 데이터의 '비율'이었다고 하면 plot 명령어를 다음과 같이 바꾸면 된다.

plot(intervals, h1./size(h1,1), 'r', intervals, h2./size(h2,1), 'b', 'LineWidth',2);

즉, h1과 h2 의 각 요소를 각각의 데이터의 전체 요소의 개수로 나누어 주는 것이지. 물론 h1과 h2 가 단일열벡터이기 때문에 나누기를 할 때 각 요소별로 하라고 ./ 처럼 점을 붙일 필요는 없으나 명확히 하기 위해 그렇게 했다.


그 후 각 축의 구간이나 기타 그래프의 옵션들을 자신의 구미에 맞게 변경한다.



  1. analogue(continuous한) 인 데이터를 적절히 잘라서 discrete 하는 작업. [본문으로]