IT/파이썬

[Python] matplotlib.pyplot - 간단한 그래프 그리기

천사환 2024. 5. 20. 21:40
반응형

numpy로 수식을 표현했을 때 그래프는 어떻게 그리는지 간단하게 보려고 합니다.


먼저 그래프를 그리기 위해서는 matplotli.pyplot 모듈이 필요합니다.

 

import matplotlib.pyplot as plt

 

일반적으로 plt로 줄여서 불러옵니다.

 

 

수식을 표현하기 위한 numpy도 같이 불러왔습니다. 깜빡했더라도 필요한 모듈이 있으면 그때 끄때 위에다 추가해주면 되니까 한번에 다 적을 필요는 없긴 합니다.

 


x, y 정하기

함수를 표현한다고 하면 제일 먼저 알려줘야 할 것은 정의역입니다.

x가 존재하는 영역을 먼저 정의해주어야 합니다.

 

x = np.arange(0,10)

 

저는 0부터 10까지의 정수로 정의했습니다. 연속된 범위로 정하면 좋겠지만 그렇게 할 수는 없는 것 같습니다. 생각해보면 무수힌 많은 x값을 메모리 공간에 둘 수 없을 테니까 그런 것 같습니다. 원한다면 간격을 가능한 촘촘이 두는 걸로 문제를 어느 정도 극복할 수 있을 겁니다. 대신 촘촘해질수록 메모리 공간이 늘어나거나 처리 시간이 늘어가긴 하겠죠.

 

x를 정했으면 이제 y를 정해야겠죠. x와 y의 함수식을 적어줍니다.

 

y = np.exp(x) 

 

저는 지수함수를 입력해봤습니다.


그래프 그리기

식을 정했으니 이제 좌표평면을 그려봅시다.

일단 도화지가 필요합니다.

 

plt.figure()

 

로 도화지를 열어줍니다. 괄호 () 안에 도화지 번호를 입력할 수도 있습니다. 공란으로 두면 0부터 차례대로 생성해줍니다.

 

도화지를 열고 나면 각 가로축, 세로축에 해당하는 값들을 정해줍니다.

 

plt.plot(x, y)

 

저희는 x, y니까 plt.plot(x, y)라고 입력해줍니다. 그러면 이제 plot이 될 겁니다.

하지만 아직 보이지 않을 수도 있습니다. plot을 한 다음에 도화지에 띄우는 작업이 하나 더 필요합니다.

 

plt.show(block = False)

 

plt.show를 꼭 입력해줘야 비로소 화면에 보이게 됩니다.

 

 

정의역으로 정수만 지정했기 때문에 해당하는 점에서 꺾기는 걸 볼 수 있습니다. 그래도 그래프로 점만 나오는 게 아니라 자동으로 이어서 보여줍니다. 촘촘할수록 연속에 가깝게 보일 겁니다.

 

근데 아까 plt.show를 입력할 때 옵션으로 block = False라고 넣어주었습니다. 

plt.show는 defalt가 block = True입니다. block은 뭘까요?

그러니까 figure 창에 plot한 그래프를 띄어놓고 있는 동안은 다른 작업을 할 수 없다는 의미입니다.

따라서 띄어놓고 다른 일을 추가로 하고 싶을 때는 block = False을 옵션으로 입력해줘야 합니다.

근데 각자 작업하는 소프트웨어에 따라 block의 개념이 통하지 않기도 합니다.

 


이번에는 -파이에서 파이까지 sin 함수를 그려보겠습니다.

 

삼각함수는 numpy 모듈을 이용해서 정의할 수 있습니다.

 

 

이번에는 x축 정보, y축 정보, 그래프 제목까지 붙여봤습니다.

 

plt.xlabel()

plt.ylabel()

을 통해서 각 x축, y축 정보를 달아줄 수 있습니다.

 

plt.title()

을 사용하면 제목을 달아줄 수 있습니다.

 

그래프를 그리는 목적이 한 눈에 보기 위함이니까 이런 정보를 적절히 달아주는 게 좋을 겁니다.

 


그래프 여러 개

이번에는 여러 개의 그래프를 그려보려고 합니다.

x는 똑같이 가져가고요.

 

다른 figure에 그리고 싶지 않고 하나의 figure안에 그리고 싶을 때가 있겠죠.

그럴 때 사용하는 것은 plt.subplots()입니다.

 

subplots는 f와 axes를 항상 같이 정의해줍니다. 

 

f, axes = plt.subplots(2, 1)

 

2 * 1의 그리드가 생성됩니다. (m, n)이면 m * n 그리드가 생성되는 겁니다.

그리고 각 그리드는 axes[ ]로 부를 수가 있습니다. 

 

그래서 axes[0].plot() 을 하면 0번 그리드에서 plot을 수행하겠다는 의미가 됩니다.

원하는 위치에 원하는 그래프를 그려줍니다.

 

제목도 달 수 있는데 이 경우 그냥 .title()이 아니라 .set_title()을 사용하셔야 합니다.

 

axes[0].set_title('sine')

axes[1].set_title('cosine')

 

 

결과는 다음과 같습니다.

 

다만 matplotlib.pyplot에서 바로 한글을 사용하게 되면 오류가 생길 수도 있습니다. 

 


그렇다면 하나의 그리드 안에서 그리려면 어떻게 해야할까요?

간단하게 그냥 plot하면 됩니다.

 

 

알아서 색깔도 다르게 해주네요.

다만 그래도 .legend()를 사용해서 범례를 적어줍니다. 범례는 먼저 plot된 게 먼저로 적용됩니다.

 

이 정도만 알아도 수학 그래프 그리는 데는 문제가 없을 것 같습니다.

물론 데이터 분석 결과를 도식화하는 건 좀 다른 얘기겠지만 그것은 추후에 다루도록 하겠습니다.

반응형