Matlab/그래프
자료 정보 | ||
---|---|---|
| ||
| ||
| ||
| ||
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각별)
'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')
각주
[편집]- ↑ GNU Octave의 Command Window에서 help plot을 쳐서 나오는 도움말을 참고함
- ↑ http://psahnwoo.blog.me/110150821905
참고 자료
[편집]- 충북대 수치해석 강의
- MATLAB log scale 그래프 그리기(자원환경공학과의 별 블로그)