[matplotlib] 꺾은 선 그래프

  • 시각화

파이썬 시각화 라이브러리 matplotlib으로 선 그래프 그리는 방법을 정리했다.

선 그래프 그리기 (plot)

선 그래프는 plt.plot() 안에 x축, y축에 해당하는 값을 리스트로 넣어서 그린다.

from matplotlib import pyplot as plt

x_values = [0, 1, 2, 3, 4]
y_values = [0, 1, 4, 9, 16]

plt.plot(x_values, y_values)

plt.show()

plt.plot()을 두 번 호출하면 자동으로 두 줄을 같은 축에 배치하고 서로 다른 색상을 부여한다.

from matplotlib import pyplot as plt

x_values = [0, 1, 2, 3, 4, 5, 6]
y_values_1 = [10, 12, 12, 10, 14, 22, 24]
y_values_2 = [11, 14, 15, 15, 22, 21, 12]

plt.plot(x_values, y_values_1)
plt.plot(x_values, y_values_2)

plt.show()

참고로 선 대신 점으로 표시하고 싶다면 plt.plot() 안에서 x값, y값 다음에 바로  ‘o’를 넣어주면 된다. 이렇게.

plt.plot(x_values, y_values, 'o')

항목 레이블 지정하기 (legend)

레이블을 적어주고 싶다면 plt.legend() 안에 문자열 리스트를 넣어주면 된다. 

from matplotlib import pyplot as plt

plt.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16])
plt.plot([0, 1, 2, 3, 4], [0, 1, 8, 27, 64])

plt.legend(['parabola', 'cubic'])

plt.show()

plt.legend()를 사용할 때는 레이블의 위치를 직접 정할 수도 있는데, loc라는 걸 지정해주면 된다. 기본 값은 0 (best)이지만 원하는 위치에 따라 숫자를 적어줄 수도 있다.

  • 0: best
  • 1: upper right
  • 2: upper left
  • 3: lower left
  • 4: lower right
  • 5: right
  • 6: center left
  • 7: center right
  • 8: lower center
  • 9: upper center
  • 10: center

예를 들어 위 예제에서 이런식으로 center left를 지정했다면

plt.legend(['parabola', 'cubic'], loc=6)

이렇게 표시된다.

애초에 plt.plot() 수준에서 데이터를 넣을 때 label을 바로 지정하는 것도 가능하다. 단, 이 때도 마지막에 plt.legend()는 꼭 적어주어야 한다.

from matplotlib import pyplot as plt

plt.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16], label="parabola")
plt.plot([0, 1, 2, 3, 4], [0, 1, 8, 27, 64], label="cubic")

plt.legend() # 꼭 적어줘야 한다.

plt.show()

선 서식 적용하기 (color, linestyle, marker)

선 두께 linewidth로 지정한다. 숫자를 넣어주면 된다. linewidth=2 이런 식으로.

선 색깔은 color라는 키워드로 지정한다. (HTML color name 이나 HEX code 중에 아무거나 사용할 수 있다.)

선 종류linestyle이라는 키워드로 지정한다.

# Dashed:
plt.plot(x_values, y_values, linestyle='--')
# Dotted:
plt.plot(x_values, y_values, linestyle=':')
# No line:
plt.plot(x_values, y_values, linestyle='')

표식 종류는 marker라는 키워드로 지정한다.

# A circle:
plt.plot(x_values, y_values, marker='o')
# A square:
plt.plot(x_values, y_values, marker='s')
# A star:
plt.plot(x_values, y_values, marker='*')

위 예제를 적용해서 그려보면

from matplotlib import pyplot as plt

plt.plot(x_values, y_values_1, color='green', linestyle='--')
plt.plot(x_values, y_values_2, color='#AAAAAA',  marker='o')

plt.show()

축 이름, 그래프 제목 설정 (xlabel, ylabel, title)

x축, y축의 이름은 plt.xlabel(), plt.ylabel(), 그래프의 제목은 plt.title() 안에 문자열을 넣어 지정할 수 있다.

from matplotlib import pyplot as plt

hours = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
happiness = [9.8, 9.9, 9.2, 8.6, 8.3, 9.0, 8.7, 9.1, 7.0, 6.4, 6.9, 7.5]

plt.plot(hours, happiness)

plt.xlabel('Time of day')
plt.ylabel('Happiness Rating (out of 10)')
plt.title('My Self-Reported Happiness While Awake')

plt.show()

그래프 다단으로 그리기 (subplot)

여러 구역을 만들어서 그래프 여러개를 배치하고 싶다면 subplot을 활용해야 한다.

2행 3열로 이루어진 구역의 4번째 칸에 그래프를 그린다고 하면 plt.subplot(2, 3, 4)라고 쓰는 거다,

예를 들어 1행 2열로 이루어진 구역에 각각 그래프를 그려보자.

from matplotlib import pyplot as plt

x = [1, 2, 3, 4]
y = [1, 2, 3, 4]

# First Subplot
plt.subplot(1, 2, 1)
plt.plot(x, y, color='green')
plt.title('First Subplot')

# Second Subplot
plt.subplot(1, 2, 2)
plt.plot(x, y, color='steelblue')
plt.title('Second Subplot')

# Display both subplots
plt.show()

이런 식으로도 배치가 가능하다.

from matplotlib import pyplot as plt

x = range(7)
a = [0, 1, 2, 3, 4, 5, 6]
b = [0, 1, 4, 9, 16, 25, 36]
c = [0, 1, 8, 27, 64, 125, 216]

plt.subplot(2,1,1)
plt.plot(x, a)

plt.subplot(2,2,3)
plt.plot(x, b)

plt.subplot(2,2,4)
plt.plot(x, c)

plt.show()

subplot의 세부적인 위치는 plt.subplots_adjust()로 조절할 수 있다. subplot 뒤에 s가 붙는 것에 유의하자.

  • left — 왼쪽 마진, 기본값 0.125. 숫자를 늘리면 y축 레이블이 표시될 공간을 확보할 수 있다.
  • right — 오른쪽 마진, 기본값 0.9. 숫자를 늘리면 그래프 이미지(figure)을 넉넉하게 넣을 수 있고, 반대로 줄일 경우 항목 레이블(legend)를 위한 공간을 확보할 수 있다,
  • bottom — 아래쪽 마진, 기본값 0.1. 숫자를 늘리면 눈금이나 x 축 레이블이 표시될 공간을 확보할 수 있다.
  • top — 위쪽 마진, 기본값 0.9.
  • wspace — 가로로 인접한 subplot 사이 공간, 기본값 0.2.
  • hspace — 세로로 인접한 subplot 사이 공간, 기본값 0.2.

예를 들어 아래와 같이 좌우 간격이 좁아서 벌려야 하는 경우

plt.show() 전에 plt.subplots_adjust()를 적어주면 된다.

plt.subplots_adjust(wspace=0.35)
plt.show()

축 범위 설정 (axis)

plt.axis() 안에 리스트를 넣어  x축, y축 각각의 최대값/최소값을 지정할 수 있다. [x축 최소값, x축 최대값, y축 최소값, y축 최대값] 형태로 넣으면 된다.

예를 들어 x축의 범위를 0~3, y축의 범위를 2~5로 지정하고 싶다면 이렇게 하면 된다.

from matplotlib import pyplot as plt

x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]

plt.plot(x, y)

plt.axis([0, 3, 2, 5])

plt.show()

범위에 들어가지 않는 부분은 잘리고 이 부분만 확대되어 나타난다고 생각하면 된다.


축 눈금/표시 설정 (set_xticks, set_yticks, set_xticklabels, set_yticklabels)

눈금(tick)을 설정하려면 plt 수준으로는 불가능하고, subplot 수준에서 해결할 수 있다. 그래서 그래프가 하나만 있더라도 일단 subplot을 불러와서 지정해야 한다.

ax = plt.subplot()
# ax = plt.subplot(1, 1, 1)

()를 비워두면 (1,1,1)과 동일하다.

아래와 같이 x축에서 특정 눈금만 표시되도록 ax.set_xticks()를 사용하면 된다.

plt.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16])
plt.plot([0, 1, 2, 3, 4], [0, 1, 8, 27, 64])
ax = plt.subplot()
ax.set_xticks([1, 2, 4])

당연히 y축에서도 ax.set_yticks()를 사용하면 특정 눈금만 표시되도록 할 수 있다.

축 눈금을 다른 형식으로 표시하려면 .set_xticklabels(), .set_yticklabels()를 사용하면 된다.

예를 들어 숫자를 백분율로 바꿔서 표시하고 싶다면 아래와 같이 할 수 있다.

plt.plot([1, 3, 3.5], [0.1, 0.6, 0.8], 'o')
ax = plt.subplot()
ax.set_yticks([0.1, 0.6, 0.8])
ax.set_yticklabels(['10%', '60%', '80%'])

그래프 생성 및 크기 설정 (figure)

별도로 새로운 그래프를 생성하고 싶으면 plt.figure()를 사용하면 된다. 괜히 plt.plot()를 연달아 사용하면 하나의 그림에 축을 병합해서 그림을 그리게 되니 주의하자.

그리고 이때 plt.figure() 안에 figsize=(width, height)를 직접 적어 넣으면 그래프 크기를 조정할 수 있다. 이런식으로.

plt.figure(figsize=(4, 10))

저장된 플롯 지우기(close)

주의하지 않으면 플롯을 만들어 놓고 시각화 하지 않아서 미리 그려놓은 플롯이 겹쳐 나타나는 등 오류를 범할 수 있다. 새 플롯을 그리기 전에 plt.close('all') 명령을 사용하여 기존 플롯을 모두 지우는 습관을 들이는 것도 좋다.


그래프 이미지 저장 (savefig)

png, svg, pdf 등 다양한 포맷으로 파일을 저장할 수도 있다. 예를 들면 이렇게.

plt.savefig('sample.png')

추천 글


댓글 남기기