Attention please

Plot(곡선 그리기) 본문

데이터 시각화/matplotlib

Plot(곡선 그리기)

Seongmin.C 2022. 10. 5. 16:59

지난 글에서는 plot으로 그래프를 그려보았는데

따로 곡선에 대해 자세하게 다루지 않고 거의 직선그래프에 대해서만 다루었습니다.

 

이번 글에서는 곡선 그래프에 대해 자세히 알아보도록 하겠습니다.

 

 

 

 

 

 

 

 

sin

이번에는 sin그래프를 그려보도록 하겠습니다.

 

matplotlib 패키지는 numpy객체를 지원하는데 왜 numpy를 사용하는지

sin그래프를 그리면서 알아보도록 하겠습니다.

 

import math

fig=plt.figure(figsize=(6,6), dpi=100)
(ax1, ax2)=fig.subplots(2,1)

## without numpy
T=range(100)
X=[(2*math.pi*t)/len(T) for t in T]
Y=[math.sin(value) for value in X]

ax1.plot(X,Y)
ax1.set_title("without numpy")

## with numpy
X=np.linspace(0,2*np.pi, 100)
Y=np.sin(X)

ax2.plot(X,Y)
ax2.set_title("with numpy")

 

위와 같이 numpy를 사용하지 않으면 불편한 점들이 있습니다.

 

위 코드를 실행시키면 다음과 같은 결과가 출력됩니다.

 

 

 

 

 

 

 

 

 

$$X^{2} + 6X + 9$$

 

이번에는 위 식처럼 일반적인 2차함수를 그려보도록 하겠습니다.

 

fig = plt.figure(figsize = (5,5), dpi = 100)
ax = fig.subplots()

X = np.linspace(-6, 0, 100)
Y = X**2 + 6*X + 9

ax.plot(X,Y, '--g')
ax.set_title("X^2 + 6X + 9")

 

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

 

 

 

 

 

 

 

 

 

다중 곡선 그리기

이번에는 하나의 ax에 2개 이상의 그래프를 그려보도록 하겠습니다.

 

이번에 그려볼 것은 sin과  cos 두 그래프입니다.

 

fig = plt.figure(figsize = (8,5), dpi = 100)
ax = fig.subplots()

X = np.linspace(0, 2*np.pi, 100)
Y1 = np.sin(X)
Y2 = np.cos(X)

ax.plot(X, Y1)
ax.plot(X, Y2)
ax.set_title("sin & cos")

 

위 코드를 실행시키면 다음과 같은 결과가 출력됩니다.

 

 

 

 

 

 

 

 

 

함수 이용

좀더 복잡한 그림을 그릴 때는 따로 함수를 만들어 사용하는 방법이 있습니다.

 

코드를 살펴보겠습니다.

 

def plot_slope(X1,Y1,ax1):
    Xs=X1[1:]-X1[:-1]
    Ys=Y1[1:]-Y1[:-1]
    ax1.plot(X1[1:], Ys/Xs, 'b')
    
fig=plt.figure(figsize=(7,4), dpi=100)
ax=fig.subplots()

X=np.linspace(-3,3,100)
Y=np.exp(-X**2)

ax.plot(X,Y,'r')
plot_slope(X,Y,ax)

 

위 코드와 같이 그래프를 그리는 함수를 따로 만들어 사용할 수 있습니다.

 

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

 

 

 

 

 

 

 

 

 

 

축 limit 설정

따로 축에 대해 범위를 설정해주지 않으면

그린 그림에 맞추어 x, y 축 크기가 달라지게 됩니다.

 

하지만 축에 limit을 주게 되면 그림의 크기 상관없이 도화지의 크기는 고정됩니다.

 

코드로 살펴보겠습니다.

 

fig=plt.figure(figsize=(4,4), dpi=100)
ax=fig.subplots()


h=10

X=[0,  0, h, 0]
Y=[0,2*h, h, h]

ax.plot(X,Y)
ax.set_xlim(-1,2*h)  # x축 범위 설정

 

set_xlim함수를 이용하여 축에 대해 범위를 고정시킬 수 있습니다.

 

만약 고정시키지 않으면 결과는 다음과 같습니다.

 

 

다음은 x축 범위를 고정시켰을 때의 결과입니다.

 

 

위 그림처럼 그리고자 하는 그림의 형태를 보존하고 싶을 때

혹은 축의 범위를 정하고 싶을 때 set_xlim(), set_ylim()함수를 사용할 수 있습니다.

 

 

 

 

 

 

 

 

조건

그림을 그릴 때 조건에 맞게 출력되는 모양을 다르게 할 수 있습니다.

 

fig=plt.figure(figsize=(4,4), dpi=100)
ax=fig.subplots()

X=np.random.choice(range(5),size=3,replace=False)
Y=np.random.choice(range(5),size=3,replace=False)

for ii in range(3):
    if (X[ii]+Y[ii])%2==0:
        ax.plot(X[ii],Y[ii],'or')
    else:
        ax.plot(X[ii],Y[ii],'+b')

 

위 코드는 x좌표와 y좌표의 합이 짝수일때는 빨간 동그라미,

홀수일 때는 파란색 +를 추출하도록 짜여있습니다.

 

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments