본문으로 이동

Matlab/그래프

위키배움터
(Semilogx에서 넘어옴)
자료 정보
진행 상황: 이 자료는 아직까지 만들어지는 중입니다. 여러분이 빨리 진행될 수 있도록 도와주세요.
교육 수준: 이 자료는 대학교 강의 수준의 자료입니다.
과목 정보: 이 자료는 공학 과목의 자료입니다.
자료 형식: 이 자료는 강의형식의 자료입니다.

Matlab에서 2차원 선 그래프를 그리는 방법을 두 가지로 크게 분류하자면, 대표적으로 plot 함수를 사용하는 방법과 fplot 함수를 사용하는 방법이 있습니다. plot은 값을 만들어서, fplot은 식을 통해서 그리는 선 그래프라고 생각하면 되겠습니다. 우리는 그중 plot을 먼저 이해하고 잘 다루어야 합니다.

plot(x, y)

[편집]

그래프를 그릴 때 가장 빈번하게 사용하는 첫번째 방법은 plot함수를 이용하는 것입니다. plot 함수에 들어가는 변수들을 의미대로 적어보면 다음과 같습니다.

plot( X Data, Y Data, 'Line Specifiers', 'Property Name', Property Value)

x나 y 부분에 들어가는 것은 그래프를 그릴 때 나타낼 값의 범위를 지정하는 것으로, 벡터가 들어갑니다. x, y 이후에 그래프 그리기 옵션 값을 비워두어도 되는데, 이렇게 하면 기본값으로 출력됩니다. 즉 반드시 지정할 필요는 없습니다. 예를 들어, 기본 옵션으로 y=x2을 그린다면 다음과 같이 하면 됩니다.

>> x=-5:1:5
x =

  -5  -4  -3  -2  -1   0   1   2   3   4   5

>> y=x.^2
y =

   25   16    9    4    1    0    1    4    9   16   25

>> plot(x,y)


그래프를 자세히 보면 곡선이 부드럽지 않은 것을 볼 수 있는데, 부드럽게 해주려면 x값을 여러 값으로 해주면 됩니다.

>> x=linspace(-5,5); y=x.^2; plot(x,y)

앞서 배웠듯이, linspace에서 세번째 변수인, '원소 개수'를 지정해주지 않으면, 자동으로 100개의 원소로 만들어주기 때문에 x 벡터는 100개의 값을, x 벡터값을 이용해 만든 y 벡터 역시 100개의 값을 가지고 있습니다. 이정도면 충분히 부드러운 곡선이 만들어 지겠죠. 주의할 점은, 그래프를 다시 그릴 때 x 벡터만 다시 만들어주면 안 된다는 것입니다. y벡터도 다시 입력해주지 않으면, 위에서 만들었던 열한 개의 원소가 들어있는 y 벡터가 사용되기 때문에 에러가 발생합니다. (x벡터는 새로 100개의 원소로 만들어 줬으나, y 벡터는 기존의 11개 원소를 재사용하여 에러 발생)

plot에 사용되는 변수

[편집]

plot의 괄호 안에 들어가는 변수들을 나열하면 다음과 같습니다.

plot(x, y, 'line specifiers', 'Property name', Property Value)

x와 y는 굳이 설명하지 않아도 되는 벡터입니다. 그래프를 그릴 때 x값의 범위 및 간격, 그리고 y가 그려지는 그래프의 함수입니다.

'line specifiers'

[편집]

'line specifiers'에 들어가는 항목은(반드시 작은 따옴표(' ')로 감싸주어야 합니다) 선의 종류, 선의 색, 그래프 상의 점 모양이 있습니다. 순서에 상관없이, 따옴표 안에만 적어주면 됩니다.

  • 선 종류 : -(실선), --(파선), :(점선), -.(일점 쇄선)
  • 색 : r(red), g(green), b(blue), c(cyan), m(magenta), y(yellow), k(black), w(white)
  • 그래프 상 점 모양 : +(+), o(원), *(*), .(.), x(x), ^(위 삼각형), v(아래 삼각형), <(왼쪽 삼각형), >(오른쪽 삼각형), s(정사각형), d(마름모), p(5각별), h(6각별)
파선, 점 모양 원, 색상 red를 적용한 모습

'Property Name', Property Value

[편집]

작은 따옴표에 들어가는 문자는 소문자로 해도 상관 없습니다.

'Property Name' Property Value 설명
'LineWidth' point 단위(기본값 0.5) 선 폭 지정
'MarkerSize' point 단위 점 표시 크기 지정
'MarkerEdgeColor' line specifiers에서 사용했던 색상 문자(작은 따옴표에 넣어야함) 점 표시 테두리 색 지정
'MarkerFaceColor' line specifiers에서 사용했던 색상 문자(작은 따옴표에 넣어야함) 점 표시 배경색 지정

예시) 위에서 사용했던 그래프를 바꿔봅시다.

>> x=-5:1:5; y=x.^2; plot(x,y, '--ro', 'linewidth', 3, 'markersize', 3, 'markeredgecolor', 'c', 'markerfacecolor', 'r')

하나의 그림에 여러 그래프 넣기

[편집]

plot에 여러 변수 넣어서 한번에 그리기

[편집]

하나의 그림에 plot으로 여러 그래프를 넣으려면 다음과 같이 해줍니다.

plot(x1, y1, x2, y2, x3, y3)

즉 각각의 함수의 정의역과 치역을 순서대로 나열해주면 됩니다. 예를 들어 의 그래프를 그리고, , y=3.3의 두 직선을 추가해봅시다. x축에 Q, y축에 y를 넣는 그래프입니다. Q의 범위는 0에서 5까지 100개의 원소로, y의 범위는 Q에 해당하는 100개 원소로 그려봅시다.

>> y=linspace(0,5); Q=sqrt(2*9.81*(5-y).*y.^2);
>> plot(Q,y, linspace(max(Q), max(Q)), y, Q, linspace(3.3,3.3))

같은 정의역에 대해서 여러 그래프를 그리는 경우, 위와 같은 방법으로 일일이 나열해주어야 합니다. 즉 다음과 같은 방법으로는 그래프를 그릴 수 없습니다.

>> x=0:10; y1=x; y2=2*x; y3=3*x; plot(x, [y1, y2, y3])
error: __plt2vv__: vector lengths must match
error: called from
    __plt__>__plt2vv__ at line 489 column 5
    __plt__>__plt2__ at line 248 column 14
    __plt__ at line 113 column 17
    plot at line 223 column 10

옳은 방법은 다음과 같습니다.[1]

>> x=0:10; y1=x; y2=2*x; y3=3*x; plot(x, y1, x, y2, x, y3)

hold on을 이용해 한개씩 추가하기

[편집]

plot으로 하나의 그래프를 그리고나서 hold on 명령어를 쓴 다음 다시 plot으로 그래프를 그리면 기존 그림에 그래프를 하나씩 추가할 수 있습니다.

응용 예제

평균압밀도 시간계수 Tv의 관계곡선을 그려봅니다. 입력해야할 값은 다음과 같습니다.

Tv
양면 배수 조건 일면 배수 조건(하단 배수) 일면 배수 조건(상단 배수)
0.1 0.008 0.047 0.003
0.2 0.031 0.100 0.009
0.3 0.071 0.158 0.024
0.4 0.126 0.221 0.048
0.5 0.197 0.294 0.092
0.6 0.287 0.383 0.160
0.7 0.403 0.500 0.271
0.8 0.567 0.665 0.440
0.9 0.848 0.940 0.720

먼저 값을 입력합니다.

>> U=[0.1:0.1:0.9];
>> Tv1=[0.008 0.031 0.071 0.126 0.197 0.287 0.403 0.567 0.848];
>> Tv2=[0.047 0.100 0.158 0.221 0.294 0.383 0.500 0.665 0.940];
>> Tv3=[0.003 0.009 0.024 0.048 0.092 0.160 0.271 0.440 0.720];

그리고 plot으로 첫번째 그래프를 그립니다.

>> plot(U,Tv1)

그 다음 그래프를 그리기 위해 hold on을 하고 이어서 plot합니다.

>> hold on
>> plot(U,Tv2)
>> plot(U,Tv3)

그러면 세 개의 그래프가 동시에 그려집니다.

축 제목 설정

[편집]

xlabel('문자열'), ylabel('문자열')을 이용해 축의 제목을 넣어줄 수 있습니다. 바로 위에서 한 의 그래프에서 x축에 Q, y축에 y라고 써봅시다.

>> xlabel('Q'), ylabel('y')

라고 쳐주면 됩니다.

축 제목 글자 크기를 키우려면 'fontsize', xx 를 괄호 안에 추가해주면 됩니다. xx에 원하는 폰트사이즈를 입력합니다. 기본 크기는 10입니다. 예를 들어 축 제목 글자 크기를 16폰트로 하고 싶으면 다음과 같이 입력합니다.[2]

>> xlabel('Q', 'fontsize', 16), ylabel('y', 'fontsize', 16)

그래프에 문자 넣기

[편집]

text(x, y, '문자열') 명령어를 이용해 원하는 (x, y) 점에 해당하는 위치에 문자열을 넣을 수 있습니다. 예를 들어 y=x의 그래프를 그리고, y축의 (0, 4) 점에 'y-axis'라는 문자열을 넣어봅시다.

>> x=linspace(0,10); y=x; plot(x,y), text(0,4,'y-axis')

응용 예제

위에서 그린 의 그래프에서 x축에 Q, y축에 y라고 쓰고, Q의 범위는 0에서 5까지 100개의 원소로, y의 범위는 Q에 해당하는 100개 원소로 그려봅시다. , y=3.3의 두 직선을 추가해봅시다. x축 제목은 Q, y축 제목은 y로 하고, (0, 4.8) 위치에 h_e를, (18, 0.2)위치에 Q_{max}를, (0, 3.2)위치에 y_c를 입력해봅시다. 그 다음 (5, 4.3)위치에 subcritical flow라고 쓰고, (5, 3.4)자리에 critical flow를, (5, 2)자리에 supercritical flow라고 써서 그래프를 완성해봅시다.

>> y=linspace(0,5); Q=sqrt(2*9.81*(5-y).*y.^2);
>> plot(Q,y, linspace(max(Q), max(Q)), y, Q, linspace(3.3,3.3))
>> xlabel('Q'), ylabel('y'), text(0,4.8,'h_e'), text(18, 0.2, 'Q_{max}'), text(0,3.2, 'y_c')
>> text(5, 4.3, 'subcritical flow'), text(5, 3.4, 'critical flow'), text(5, 2, 'supercritical flow')

semilogx

[편집]

semilogx(x, y)를 사용하면 가로축이 log x인 그래프를 그릴 수 있습니다.

예제

다음 값을 이용해 가로축이 log p, 세로축이 er인 그래프를 그려라. 단, *로 값을 표시하고 실선으로 그린다.

p er
0 0.71880
0.05 0.71055
0.1 0.69474
0.2 0.67136
0.4 0.64249
0.8 0.59780
1.6 0.52974
3.2 0.45411
풀이
>> p=[0;0.05;0.1;0.2;0.4;0.8;1.6;3.2];
>> er=[0.71880;0.71055;0.69474;0.67136;0.64249;0.59780;0.52974;0.45411];
>> semilogx(p, er, '*-')

연습문제

토질역학에서 압밀 실험 결과를 나타내는 공극비-압력 곡선을 그리기 위해 다음과 같은 계산을 해야한다. Matlab 또는 GNU Octave를 이용하여 그래프를 그려라. ()

압력 p (kgf/cm2) 압밀 완료 시료 최종 높이 H(cm) Hs Hv
0 2.500 1.4545
0.05 2.488 1.4545
0.1 2.465 1.4545
0.2 2.431 1.4545
0.4 2.389 1.4545
0.8 2.324 1.4545
1.6 2.225 1.4545
3.2 2.115 1.4545


풀이
>> H=[2.5;2.488;2.465;2.431;2.389;2.324;2.225;2.115];
>> Hv=H-1.4545;
>> Hv/1.4545
ans =

   0.71880
   0.71055
   0.69474
   0.67136
   0.64249
   0.59780
   0.52974
   0.45411

>> e_ratio=ans;

여기까지 하면 표가 완성된다.

압력 p (kgf/cm2) 압밀 완료 시료 최종 높이 H(cm) Hs Hv
0 2.500 1.4545 1.04550 0.71880
0.05 2.488 1.4545 1.03350 0.71055
0.1 2.465 1.4545 1.01050 0.69474
0.2 2.431 1.4545 0.97650 0.67136
0.4 2.389 1.4545 0.93450 0.64249
0.8 2.324 1.4545 0.86950 0.59780
1.6 2.225 1.4545 0.77050 0.52974
3.2 2.115 1.4545 0.66050 0.45411

아직 입력하지 않은 p값을 주고 그래프를 그린다.

>> p=[0;0.05;0.1;0.2;0.4;0.8;1.6;3.2];
>> semilogx(p, e_ratio, '*-')

fplot

[편집]

fplot으로도 함수의 그래프를 그릴 수 있습니다.

fplot('function', limits, 'line specifiers')

'function'에는 함수를 넣으면 되는데, 여기선 plot과 다르게 원소별 연산(./ 등)을 할 필요 없이 그냥 수식을 적어주면 됩니다. limits는 []괄호를 이용해 x의 최솟값과 최댓값 두 개의 원소로만 벡터로 범위를 넣어주면 됩니다. 'line specifiers'는 plot과 동일합니다.

예시)

>> fplot('x^2',[-5, 5], '-*k')

레이블

[편집]

x축 이름, y축 이름, 그래프 제목 등을 입력해줄 수도 있습니다. 이 부분은 설명보다 예시를 보이는 게 더 나을 것 같네요.

>> fplot('x^2',[-5, 5], '-*k')
>> xlabel('x'), ylabel('y'), title('Parabola')

각주

[편집]
  1. GNU Octave의 Command Window에서 help plot을 쳐서 나오는 도움말을 참고함
  2. http://psahnwoo.blog.me/110150821905

참고 자료

[편집]