Run The Bridge

Chapter3 그래프그리기 본문

Python/머신러닝 그리고 AI

Chapter3 그래프그리기

anfrhrl5555 2020. 7. 21. 17:26
728x90
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
# 모듈
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
# data
np.random.seed(1)  # 난수를 1로 고정
= np.arange(10)
= np.random.rand(10)
 
# 그래프 표시
plt.plot(x, y)  # 꺾은선 그래프
plt.show()  # 그래프 그리기
cs


결과: 


Pycharm에서 사용할 때는 %matplotlib inline을 빼주어야 한다.



※ 지금까지의 이력을 메모리에 삭제하는 명령: %reset



3차 함수 f(x) = (x-2)x(x+2) 그리기

1
2
3
4
5
6
7
8
# 모듈
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
def f(x):
    return (x-2* x * (x+2)
print(f(1))
cs

f(1) = -3  # x(x2-4)


x는 ndarray배열이며 각각에 대응한 f를 한꺼번에 ndarray로 돌려준다.


벡터의 사칙연산은 각 요소마다 이루어지는 성질이 있기에 매우 편리하다


1
print(f(np.array([123])))
cs

f(np.array([1, 2, 3])) = [-3 0 15]



1
2
= np.arange(-33.50.5)  # x의 범위를 -3 ~ 3까지로 제한
print(x)
cs

x = [-3. -2.5 -2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. 2.5 3. ]


그래프의 x를 정의하는 경우 arange보다 linspace라는 명령이 사용하기 쉬울수 있다.


linspace(n1, n2, n)하면 범위 n1에서 n2사이를 일정 간격 n개의 구간으로 나눈 값을 돌려준다.

1
2
= np.linspace(-3310)  # linspace(n1, n2, n), n1에서 n2사이를 일정 간격 n개의 구간으로 나눈 값을 return한다.
print(np.round(x, 2))
cs

x = [-3. -2.33 -1.67 -1. -0.33 0.33 1. 1.67 2.33 3. ] # 모든 수는 가장 가까운 수들과 0.66 ~ 0.67씩의 차이를 가진다.


1
2
plt.plot(x, f(x))
plt.show()
cs

로 출력해보면 다음과 같은 모양이나온다.




But, x = -2, 0 ,2일 때 f(x)가 0의 값을 갖는지 여부를 알기 어렵다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def f2(x, w):
    return (x-w) * x * (x + 2)  # 함수정의
 
# x를 정의
= np.linspace(-33100)  # x를 100분할하기
 
# 차트 묘사
plt.plot(x, f2(x, 2), color='black', label='$w=2$')
plt.plot(x, f2(x, 1), color='cornflowerblue', label='$w=1$')
plt.legend(loc="upper left")  # 범례표시, label표시부분
plt.ylim(-1515)  # y축의 범위
plt.title('$f_2(x)$')  # 제목
plt.xlabel('$x$')  # x 라벨
plt.ylabel('$y$')  # y 라벨
plt.grid(True)  # 그리드, 뒤에 바둑무늬
plt.show()
cs


그래프가 매끄러워지고, 그리드와 라벨, 제목, 범례가 들어갔습니다.

x(x2-4)함수가 x축과 만나는 점은 -2, 0, 2라는 것이 명확해졋습니다.


검정: -2, 0, 2

파랑: -2,0, 1


사용할 수 있는 색상목록 리스트 확인

1
2
import matplotlib
matplotlib.colors.cnames
cs



그래프를 여러 개 보여주기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f2(x, w):
    return (x-w) * x * (x + 2)  # 함수정의
 
# x를 정의
= np.linspace(-33100)  # x를 100분할하기
 
plt.figure(figsize=(103))  # figure 지정
plt.subplots_adjust(wspace=0.5, hspace=0.5)  # 그래프의 간격을 지정, 액자 크기지정 작으면 늘려주자
for i in range(6):
    plt.subplot(23, i + 1)  # 그래프 묘사의 위치를 지정
    plt.title(i + 1)
    plt.plot(x, f2(x, i), 'k')
    plt.ylim(-2020)
    plt.grid(True)
plt.show()
cs

여러 그래프를 나란히 표시하려면 plt.subplot(n1, n2, n)를 사용한다.


전체를 세로 n1, 가로 n2로 나눈 n번째에 그래프가 그려진다.


plt.subplot(23, i + 1)  # 그래프 묘사의 위치를 지정

--> 2 x 3행의 i + 1(1)번째 위치를 가리키고, 1씩 증가하면서 오른쪽으로 위치를 옮긴다.

plt.figure(figsize=(w, h)) = 전체 영역의 크기를 지정한다. 


가로길이 = w, 세로길이 = h


subplot으로 늘어놓을 때, 좌우 및 상하 간격은 plt.subplots_adjust(wspace=w, hspace=h)로 조절이 가능하다.


좌우간격 = w, 상하간격 = h


plt.subplot의 n은 0이 아닌 1부터 시작한다.




3차원 그래프 그리기

f(x0, x1) = (2x20 + x12)exp(-(2x02+ x12))를 그래프로 표현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt
 
# 함수 f3을 정의
def f3(x0, x1):
    r = 2 * x0**2 + x1 ** 2
    ans = r * np.exp(-r)
    return ans
 
xn = 9
x0 = np.linspace(-22, xn)  # A
x1 = np.linspace(-22 ,xn)  # B
= np.zeros((len(x0), len(x1)))  # C
for i0 in range(xn):
    for i1 in range(xn):
        y[i1, i0] = f3(x0[i0], x1[i1])  # D
print(np.round(y, 1))
 
cs


xn = 9이므로 x0은 9개의 요소로 구성된 것을 알 수 있다.

print(x0): [-2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. ]


#C에서 계산 결과를 넣을 2차원 배열 변수 y를 준비하고, x0과 x1에서 정의된 바둑판의 각 점에서 f3를 구한 뒤 y[i0, i1]에 저장하고있다.


여기서 요소의 인덱스는 x1의 내용을 가리키는 인덱스 i1이 먼저오고 i0이 온다는 점


행렬 y는 print(y)로 표시가능하지만 복잡하기 때문에 numpy함수 round를 사용해준다.


np.round(y, n)를 활용해 입력 값 y를 소수점 n자리로 반올림한다.


1
print(np.round(y, 1))
cs




수치를 색으로 표현하기: pcolor

1
2
3
4
5
plt.figure(figsize=(3.53))
plt.gray()  # A
plt.pcolor(y)  # B 행렬을 색상으로 표시한다.
plt.colorbar()  # C 행렬 옆에 컬러 바를 의미한다.
plt.show()
cs


1
2
3
4
5
plt.figure(figsize=(3.53))
plt.pink()  # A
plt.pcolor(y)  # B 행렬을 색상으로 표시한다.
plt.colorbar()  # C 행렬 옆에 컬러 바를 의미한다.
plt.show()
cs




함수의 표면을 표시: surface


1
2
3
4
5
6
7
8
9
10
11
12
13
from mpl_toolkits.mplot3d import axes3d  # A
 
xx0, xx1 = np.meshgrid(x0, x1)  # B
 
plt.figure(figsize=(53.5))  # 크기지정
ax = plt.subplot(111, projection='3d')  # C
ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3,
                color='blue', edgecolor='black')  # D
ax.set_zticks((00.2))  # E
ax.view_init(75-95)  # F
plt.show()
print(x0)
print(x1)
cs


#B에서 좌표점 x0, x1으로 xx0, xx1을 만든다.


x0과 x1의 내용은 다음과 같다.


np.meshgrid(x0, x1) 명령으로 생성된 xx0은 2차원 배열이 된다.



y의 모든 요소에 대해 x0및 x1좌표가 할다된 형태로 xx0[i1, i0]과 xx1[i1, i0]를 입력했을 때 f3이 y[i1, i0]가 되고 있다.


차트를 3차원으로 만들기 위해 subplot 선언시 projection='3d'로 지정한다.


그래프의 id를 나타내는 반환값을 ax로 저장한다.


이 리스트에서는 figure내에 subplot을 하나만 지정하고 있지만, subplot(n1, n2, n, projection='3d')로 여러 좌표계를 지정할 수도 있다.


surface를 표시하는 부분은 

1
2
ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black')
cs

인데, 옵션인 rstridecstride에 자연수를 부여해 가로 및 세로로 몇 개의 선을 긋는지 지정이 가능하다.


alpha는 면의 투명도를 지정하는 옵션으로 0에서 1사이의 실수로 면의 투명도를 지정하며, 1에 가까울수록 불투명해진다.


z축의 눈금은 기본 상태로 표시하면 숫자가 겹쳐진다. 그래서 ax.set_zticks((0, 0.2))명령으로 z의 눈금을 0과 0.2으로 제한하고 있다.

1
ax.set_zticks((00.2))
cs


ax.view_init(인수1, 인수2)는 3차원 그래프의 방향을 조절한다.

1
ax.view_init(75-95)
cs


'인수1'은 상하회전으로 '0'을 지정하면 옆에서 본 그래프고, '90'을 지정하면 위에서 본 그래프가 된다.


'인수2'는 좌우회전으로 '양수'를 입력하면 시계방향으로, '음수'를 부여하면 시계반대방향으로 차트가 회전한다.




등고선으로 표시: contour

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
xn = 50
x0 = np.linspace(-22, xn)
x1 = np.linspace(-22, xn)
 
= np.zeros((len(x0), len(x1)))
for i0 in range(xn):
    for i1 in range(xn):
        y[i1, i0] = f3(x0[i0], x1[i1])  # A
        
xx0, xx1 = np.meshgrid(x0, x1)
 
plt.figure(1, figsize=(44))
cont = plt.contour(xx0, xx1, y, 5, colors='black')  # B
cont.clabel(fmt='%3.2f', fontsize=8)  # C
plt.xlabel('$x_0$', fontsize=14)
plt.ylabel('$y_0$', fontsize=14)
plt.show()
cs


1
cont = plt.contour(xx0, xx1, y, 5, colors='black')  # B
cs

plt.contour(xx0, xx1, y, 5, colors='black')로 등고선 플롯을 작성한다.


5는 표시하는 높이를 5단계로 지시한다는 뜻이고, colors='black'은 등고선의 색상을 검정색으로 만든다.


plt.contour의 반환값을 cont에 저장하고 cont.clabel(fmt='%3.2f', fontsize=8)로 설정하여 각 등고선에 숫자를 넣을 수 있다.


fmt='%3.2f'로 숫자 형식을 지정하고 fontsize옵션은 문자의 크기를 지정한다.

728x90
반응형

'Python > 머신러닝 그리고 AI' 카테고리의 다른 글

DALL-E 체험기  (4) 2022.08.01
Chapter5 지도학습: 회귀  (0) 2020.08.05
Chapter 4 머신러닝에 필요한 수학의 기본  (0) 2020.07.22
Chapter2 파이썬 기초  (0) 2020.07.21
Comments