머신러닝, 딥러닝 공부를 하다보면 항상 모델의 평가와 데이터 분석에서 그래프로 시각화하는 코드를 마주하게 됩니다.
코드가 다소 직관적이고 간단하게 그래프를 그릴 수 있어서 읽고 이해하는데는 무리가 전혀 없었습니다. 하지만 직접 시각화를 위해 그래프를 그릴 때는 굉장히 막막하고 어려움을 느꼈습니다. 이번 포스팅을 통해 matplotlib을 활용하여 그래프를 시각화하는 코드들을 정리하고 이해해보려고 합니다.
시각화는 눈으로만 이해하는 것보다 직접 코드를 따라 구현해가며 이해하는 것이 직접 사용하기 위해 훨씬 많은 도움이 되므로 직접 코드들을 따라치면서 이해하는 것을 추천드립니다.
matplotlib
matplotlib는 Python의 그래프를 그려주는 굉장히 유용한 라이브러리입니다. matplotlib를 활용하면 막대그래프, 직선그래프, 산점도 등등 다양한 그래프를 구사할 수 있습니다. 그래프를 원하는 형태로 그려가며 데이터에 대한 문제를 풀어나가기 위해서는 이를 원하는대로 사용할 수 있어야 합니다.
matplotlibs는 다양한 그래프를 그릴 수 있게 다양한 함수를 제공합니다. 예를 들어 plot()은 직선, bar()는 막대, scatter()는 산점도 등등의 다양한 함수들을 보유하고 있습니다. 따라서 모든 함수를 외우고 그 함수가 요구하는 파라미터를 기억해서 작성하는 것은 많은 노력이 필요합니다. matplotlib의 원하는 기능을 찾기 위해서 matplotlib홈페이지에서 제공하는 Reference에 친숙해지는 것을 추천합니다.
import matplotlib.pyplot as plt
matplotlib를 알아보기 전에 위 코드를 파이썬에서 동작시켜보시기 바랍니다.
이는 matplotlib.pyplot을 사용하기 위한 import문입니다. as plt를 붙여 별칭으로 plt로 위 pyplot을 사용한다고 선언한 것입니다.
만약 import가 정상적으로 작동되지 않는다면 pip install matplotlib을 하여 모듈을 설치해주시기 바랍니다.
이제 본격적으로 matplotlib.pyplot을 활용하여 그래프를 그리는 방법을 알아보겠습니다.
Figure는 캔버스 Axes는 붓
matplotlib.pyplot에는 Figure와 Axes가 있습니다.
그림을 그릴 때 캔버스와 붓에 비유하면 Figure는 캔버스를 담당하며 Axes는 붓을 담당합니다.
import matplotlib.pyplot as plt
plt.figure(facecolor="yellow")
ax = plt.axes()
matplotlib의 pyplot을 불러서 그림을 그려보겠습니다. figure를 yellow로 색칠하고 axes()를 불러보았습니다.
위 코드를 실행한 결과는 위와 같이 나오게 됩니다. 그래프가 그려지는 가운데 부분을 제외한 주변 부분이 색칠이 되어있는 것을 알 수 있습니다. figure는 캔버스이고 그 내부에서 axes가 그래프를 그려준다는 것을 의미짐작 할 수 있습니다.
figure를 주로 캔버스의 크기를 조정해주는 일을 할 때 사용합니다. 그리고 axes는 그래프를 그려주는 역할을 수행하죠.
plt.figure(figsize=(10,4), facecolor= "yellow")
plt.plot([1,2,3],[2,4,6])
plt.show()
figure 내부에 figsize=(10,4)라고 명시하여 크기정보를 제공해주었습니다. 앞에 값이 가로의 크기이고 뒤에 값이 세로의 크기입니다.
여기서는 plot을 활용해 직선 그래프를 그렸습니다. 앞에 데이터가 x축, 뒤에 데이터가 y축에 대한 정보입니다. 이는 axes가 그려주게 됩니다.
figure의 역할은 이해를 하셨을텐데 아직 axes를 직접 사용해 그래프를 그리지 않았으므로 이해가 어려우실 것이라고 생각합니다.
axes가 붓으로 사용되는 과정을 배우기 위해 axes에서 주로 사용되는 기본적인 함수들을 먼저 배워보도록 하겠습니다.
Axes의 공통 기능
Axes로 그래프를 그리는 공통기능에 대하여 알아보겠습니다.
공통기능 - color
color는 그래프의 색을 색칠해주는 역할을 수행합니다. 직선이라면 직선의 색을 막대그래프라면 막대의 색을 변경시켜줍니다.
plt.plot(x_value,y_value,color="green")
원하는 색을 color에 넣어주면 그 색으로 그래프를 표현하게 됩니다.
보시면 초록색의 직선으로 그래프가 그려짐을 알 수 있습니다.(직선은 추후 알아보도록 하겠습니다.)
공통기능 - title, xlabel, ylabel
그래프의 label이 무엇인지 그리고 제목이 무엇인지를 표시해줄 때 title과 xlabel, ylabel을 사용합니다.
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('title')
직접 실행결과를 보면 이해가 쉬울 것 입니다. y축에 ylabel, x축에 xlabel 그리고 위에 제목으로 title이 들어간 것을 알 수 있습니다.
공통기능 - xticks, yticks, xlim, ylim
ticks는 그래프를 읽을 때 기준이 되는 값들을 의미합니다.
위 실행결과의 예시를 가져와서 확인해보겠습니다. x축의 ticks는 0, 0.2, 0.4, 0.6, 0.8, 1.0이 됩니다.
이러한 ticks들을 조절하는 것이 바로 xticks와 yticks입니다. 이를 활용하면 ticks들을 회전시키거나 특정 ticks로 변경할 수 있습니다.
plt.xticks(rotation=45,ticks= np.arange(1,5,1))
xticks에 rotation을 45 즉 45도 기울이고 ticks를 활용해 1,2,3,4로 표시하도록 하였습니다.
보시면 xticks가 1,2,3,4로 변경되었음을 알 수 있습니다. 주로 rotation은 x값에 한글이 오게 되는 경우 90도로 돌려 세로로 작성을 한다거나 너무 ticks가 밀집되어 그려지는 경우 ticks를 보여주기 위해 약간 기울일 때 주로 사용합니다. 그리고 그래프를 그릴 때 자동으로 적절한 ticks값을 세팅해주기 때문에 ticks값을 임의로 입력하는 일은 거의 없습니다.
ticks을 자동으로 세팅해줄 때 특정 범위의 값만 확인하고 싶을 수 있습니다. 즉 원하는 범위의 ticks들만 그래프로 그려주는 방법이 따로 있습니다. xlim()과 ylim()이 그 역할을 수행합니다. xlim(a,b)을 입력하면 ticks중 a이상 b이하의 ticks들의 정보들만 가져옵니다.
plt.xticks(rotation=45,ticks= np.arange(1,5,1))
plt.xlim(2,3)
위에서 그렸던 xticks중에서 2이상 3이하의 ticks만 확인하기 위해 xlim을 설정하였습니다.
코드를 실행해보면 2와 3만 xticks에서 나왔음을 알 수 있습니다.
공통기능 - legend
그래프를 여러개 그렸을 때 그래프를 구분짓기 위한 범주가 필요합니다. 이는 legend를 활용하여 표시해줄 수 있습니다.
x_value_01 = np.arange(1,10)
y_value_01 = 2*x_value_01
y_value_02 = 4*x_value_01
plt.title('Two line')
plt.plot(x_value_01, y_value_01, color='green', label='1')
plt.plot(x_value_01, y_value_02, color='red', label='2')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
legend()을 사용하면 자연스럽게 범주를 그려줍니다.
그런데 이 때 주의할 점이 하나 있습니다. 아직 설명을 하지 않았지만 plot()을 활용하면 그래프를 그려줍니다. 위에서 배웠던 color를 짐작하면 초록선과 빨간선을 그려주는 것을 알 수 있죠. 범주에서 그래프를 설명할 때 그 그래프가 어떤 그래프인지를 표시해주어야 합니다. 이를 위해 사용하는 것이 label입니다. label을 작성하지 않으면 legend()을 만들 수 없습니다.
코드의 실행 결과를 보면 왼쪽 위에 label로 지정한 1과 2가 범주로 표시됨을 알 수 있습니다.
공통기능 - subplots
굉장히 중요한 기능을 소개하겠습니다. 하나의 figure에 여러개의 그래프를 넣어야하는 경우에는 subplots을 활용하여 넣어줄 수 있습니다. subplots(nrows, ncols, figsize ...)를 사용해 만들어주게 됩니다. 이 때 nrows는 axes의 행의 개수, ncols는 axes의 열의 개수를 의미합니다. subplots(3,4,figsize=(12,12))와 같이 작성을 하게 된다면 3행에 4열의 axes가 완성되어 총 12개의 그래프를 그릴 수 있게 됩니다.
직접 코드로 확인해보겠습니다.
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10,6) )
nrows가 1, ncols가 2로 받아서 1행에 2열의 그래프를 그릴 수 있는 subplots을 만들었습니다.
실행 결과는 이렇게 됩니다. 이 때 nrows가 1이었으므로 위 처럼 튜플로 각각 대입하여 가져올 수 있습니다.
이 때 튜플의 ax1이 왼쪽 그래프를 ax2가 오른쪽 그래프를 그리게 됩니다. 보통은 이렇게 받지 않고 하나로 받아서 index로 접근합니다.
fig, ax = plt.subplots(2,2, figsize=(12,12))
ax[0][0].plot(x_value, y_value, color = 'red', marker='o', markersize=6)
ax[1][0].bar(x_value,y_value,color='green')
ax[0][1].plot(x_value, y_value, color = 'green', marker='o', markersize=6)
ax[1][1].bar(x_value,y_value)
이렇게 2행 2열의 그래프를 가져온다고 하면
ax[0][0], ax[0][1], ax[1][0], ax[1][1]로 접근해서 그래프를 그릴 수 있습니다. 각각은 왼쪽 위에서부터 0행 0열로 시작하여 행렬처럼 접근할 수 있습니다. 위 코드를 보면 axes로 그래프를 그린다는 것을 명확히 이해할 수 있습니다. (그 동안은 plt를 직접 가져와서 그렸지만)
지금까지 배웠던 공통기능들을 활용하여 각각의 axes에 접근해 그래프를 그리고 title을 지정하고 범주를 주는 등의 모든 행동을 할 수 있습니다. axes의 역할이 붓인 이유를 이해하셨길 바랍니다!
(참고 : plt로 접근해 그래프를 그릴 때의 공통기능에서 사용했던 문법과 axes를 활용해 접근해서 그래프를 그릴때의 문법이 약간씩 다른 부분이 있습니다. 예를들어 xlabel을 설정할 때 axes는 set_xlabel을 활용하는 것 처럼요. 하지만 명칭과 하고자하는 일은 모두 같으니 matplotlib을 참고하며 그래프를 그리시는 것을 추천드립니다.)
plot() : 직선 그리기
정말 중요한 기본적인 개념들은 모두 배웠다고 볼 수 있습니다. 이제 정말 간단하면서 자주 쓰일 수 있는 직선인 plot을 그리는 방법을 설명드리겠습니다.
x_value = [1,2,3,4]
y_value = [2,4,6,8]
plt.plot(x_value,y_value)
plot(x,y)를 활용하면 직선의 그래프를 그릴 수 있습니다.
plot()을 사용할 때 주의할 점은 x와 y의 데이터 개수가 동일해야합니다! x의 개수와 y의 개수가 다르다면 오류가 발생합니다.
그리고 x,y를 지금은 python의 list를 주었는데, pandas의 dataframe, numpy에 ndarray도 모두 입력으로 들어올 수 있습니다.
이는 matplotlib을 활용해 그리는 모든 그래프에 동일한 조건이니 반드시 기억해주시기 바랍니다.
plot() - marker, markersize ,linestyle, linewidth
plot을 활용해 직선을 그릴 때 각 x와 y에 매칭되는 점들을 이어 직선으로 그려주는 것을 알 수 있습니다. 그렇다면 그 매칭되는 위치를 직접 마킹을 하고 싶을 수 있습니다. 그럴 때는 marker를 사용하면 됩니다. marker는 직선이 그려지게 된 데이터의 위치를 마킹해주는 역할을 합니다. 이 때 마킹의 크기는 markersize로 조절하게 됩니다.
그리고 직선을 실선 혹은 점선 등 다른 선으로 표시하고 싶을 수도 있을 것 입니다. 이는 linestyle로 변경할 수 있습니다.
linewidth는 선의 굵기를 조절해주는 역할을 합니다.
plt.plot(x_value,y_value,color='green', marker='X',
linestyle='dashed', linewidth=2, markersize=10)
marker로 'X'표시를 하였고 linestyle을 dashed로 표시해주었습니다. 그러면 직선 그래프가 그려지게 된 데이터들의 위치를 X로 표시하고 선을 점선으로 표시하게 됩니다.
실행결과를 보면 4개의 데이터에 대한 점이 'X'로 체크되어 있는 것을 알 수 있고 점선으로 그래프가 그려짐을 확인할 수 있습니다.
bar() : bar차트 그리기
bar(xdata, ydata)을 활용하여 막대그래프를 그릴 수 있습니다.
plt.bar(x_value_01, y_value_01, color='green')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
굉장히 간단한 코드이기에 실행결과만 확인하도록 하겠습니다.
포스팅을 마치며
이번 포스팅에서는 matplotlib의 기초를 알아보았습니다. 이 정도의 기초만 이해를 한다면 기본적인 시각화는 구글링을 조금만 동원하면 굉장히 쉽게 구현하실 수 있을 것 입니다. 이번 포스팅에서 가장 중요한 포인트는 figure와 axes에 대한 이해입니다. figure는 캔버스, axes는 붓의 역할을 수행하며 axes를 활용해 그래프를 그려나간다는 것을 반드시 이해하셨으면 좋겠습니다.
matplotlib도 굉장히 좋은 시각화 라이브러리지만 좀 더 이쁘게 그래프를 그려주는 Seaborn이라는 라이브러리가 있습니다.
다음 시간에는 Seaborn에 대하여 알아보는 시간을 갖도록 하겠습니다. 감사합니다.
References
'Language > Python' 카테고리의 다른 글
seaborn을 활용한 시각화 (2) | 2022.09.10 |
---|---|
파이썬스러운 코드 개발(PEP-8) (0) | 2022.05.28 |