Programming/python-visualization

Matplotlib 그래프 시각화 방법 - 두 그래프 평행하게 그리기 (tensorflow, numpy 수치데이터)

방황하는 데이터불도저 2023. 9. 18. 19:34

python의 대표적인 시각화도구인 matplotlib 라이브러리를 사용하여, log함수를 예시로 그래프를 그려보겠습니다.

 

먼저, 함수를 임포트 시켜줍니다.

import matplotlib.pyplot as plt

 

log함수를 그려주기 위해서는 log함수의 x, y좌표값들을 만들어주어야 합니다. x, y값들은 Numpy, Tensorflow 두가지 방법으로 데이터를 만들어 보겠습니다.

 

  • Numpy로 log함수의 x, y 세트 만들기
import numpy as np

x_np = np.linspace(0.1, 10, 1000)
y_np = np.log(x_np)
  • Tensorflow로 log함수의 x,y 세트 만들기
import tensorflow as tf

x_tf = tf.linspace(0.1, 10, 1000)
y_tf = -tf.math.log(x_tf)

** 위의 linspace함수를 실행한 결과로는 0.1부터 10이라는 숫자 사이를 1000개의 간격으로 나누어 숫자리스트를 출력합니다.

 

이제 바로 그래프를 그려볼 차례입니다.

아래는 numpy데이터를 가지고, 다양한 matplotlib의 기능을 활용한 log함수를 그린 코드와 결과입니다.

# 그래프를 그리기 위한 template생성
plt.figure(figsize=(8,6))

# 그래프형태 중 plot그래프를 template에 그려주기
plt.plot(x_np, y_np, label='y = log(x)', color='r', linestyle='-', linewidth=2)

# plot의 x축, y축 범위 설정
plt.xlim(-0.2, 3)
plt.ylim(-2, 3)

# x축과 y축 선을 진하게 표시
plt.axhline(0, color='black', linewidth=1)  # x축 진하게 표시
plt.axvline(0, color='black', linewidth=1)  # y축 진하게 표시

# 텍스트 설명을 달아주기
plt.xlabel('x')
plt.ylabel('y')
plt.title('Logarithmic Function (Tensorflow)')

# 그래프에 그리드 선 표시 유무
plt.grid(True)

# 그래프 범례표시
plt.legend()

# 해당 함수를 사용하지 않아도 시각화가 가능.
# 하지만 사용해주는 이유는 함수실행을 통해 나오는 출력텍스트가 없도록 하기 위해서이다.
# 무슨 소리인지 모르겠다면 직접 실행 후, 확인해보시길 권장드립니다.
plt.show()

tensorflow 데이터를 사용해도 동일한 코드로 plot 함수의 옵션 안에 x, y값만 다르게 해주면 같은 결과를 얻을 수 있습니다.

 

이에 응용하여, 시각적으로 비교에 용이하도록 두 그래프를 평행하게 시각화시켜보겠습니다.

** 두 개 이상의 그래프를 표시하기 위해서는 subplots라는 함수를 사용해주면 됩니다.

# 1개의 행, 2개의 열로 그래프를 출력하겠다는 의미.
fig, axes = plt.subplots(1, 2, figsize=(16, 5))

# 첫번째 (1행 1열) 그래프에 대한 시각화
axes[0].plot(x_np, y_np, label='y=log(x)', color='b', linestyle='-', linewidth=2)
axes[0].set_xlim(-0.2, 3)
axes[0].set_ylim(-2, 3)
axes[0].axhline(0, color='black', linewidth=1)  # x축 진하게 표시
axes[0].axvline(0, color='black', linewidth=1)  # y축 진하게 표시
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].set_title('Logarithmic Function (Numpy)')
axes[0].grid(True)
axes[0].legend()

# 두번째 (1행 2열) 그래프에 대한 시각화
axes[1].plot(x_tf, y_tf, label='y = -log(x)', color='r', linestyle='-', linewidth=2)
axes[1].set_xlim(-0.2, 3)
axes[1].set_ylim(-2, 3)
axes[1].axhline(0, color='black', linewidth=1)  # x축 진하게 표시
axes[1].axvline(0, color='black', linewidth=1)  # y축 진하게 표시
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].set_title('Logarithmic Function (Tensorflow)')
axes[1].grid(True)
axes[1].legend()

plt.show()

  • plt대신  subplot에 시각화 옵션 설정을 해준다.
  • subplot함수의 시각화 옵션에는 set_ 이 붙는다.

만약 그래프의 중복된 y축의 label을 제거하고싶다면, subplot의 sharey 옵션을 사용하면 된다. y축을 share한다는 것으로 sharex도 있어서 필요한 경우대로 활용할 수 있다. 따라서 아래의 코드를 통해 중복된 코드를 줄이고, 더 깔끔한 그래프를 얻을 수 있다.

fig, axes = plt.subplots(1, 2, figsize=(16, 5), sharey=True)

axes[0].plot(x_np, y_np, label='y=log(x)', color='b', linestyle='-', linewidth=2)
axes[0].set_xlim(-0.2, 3)
axes[0].set_ylim(-2, 3)
axes[0].axhline(0, color='black', linewidth=1)  # x축 진하게 표시
axes[0].axvline(0, color='black', linewidth=1)  # y축 진하게 표시
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].set_title('Logarithmic Function (Numpy)')
axes[0].grid(True)
axes[0].legend()

axes[1].plot(x_tf, y_tf, label='y = -log(x)', color='r', linestyle='-', linewidth=2)
axes[1].set_xlim(-0.2, 3)
axes[1].axhline(0, color='black', linewidth=1)  # x축 진하게 표시
axes[1].axvline(0, color='black', linewidth=1)  # y축 진하게 표시
axes[1].set_xlabel('x')
axes[1].set_title('Logarithmic Function (Tensorflow)')
axes[1].grid(True)
axes[1].legend()

# 두 코드를 생략할 수 있음
#axes[1].set_ylim(-2, 3)
#axes[1].set_ylabel('y')

plt.show()

 

위처럼 어렵지 않게 그래프를 시각화시키는 방법에 대해 정리해보았습니다.

보기에 단순해보여도 막상 만들려고할때는 헷갈리는 지점이 많아서, 계속 연습해보는 것을 추천드립니다.