상세 컨텐츠

본문 제목

[Python](matplotlib) 시각화 기초 & 꺾은선 그래프 그리기

파이썬 배우기 - (ver.1)/시각화 기초

by 콩알맹이 2024. 2. 23. 17:23

본문

여기서는 matplotlib의 pyplot 방식을 이용하여 데이터를 시각화하는 방법에 대해 알아볼 것이다.

 

1. matplotlib 라이브러리 불러오기

 

먼저 matplotlib 라이브러리를 불러와야 한다.

또한 matplotlib의 pyplot 방식을 이용한다고 하였으니, matplotlib의 하위 모듈인 pyplot 또한 불러와야 한다.

이는 아래와 같이 불러올 수 있다.

 

import matplotlib as mpl
import matplotlib.pyplot as plt

print(mpl.__version__)

3.8.2

 

이렇게 하면 matplotlib의 버전까지 확인할 수 있다.

 

 

2. 한글 폰트 적용

 

그래프에 한글을 넣고자 하는 경우에는 한글이 깨져 보이지 않을 수 있다.

일단은 아래와 같은 코드를 실행하도록 하자.

import matplotlib.font_manager as fm

font_path = 'C:/Windows/Fonts/gulim.ttc' # 여기 글씨체 경로를 입력한다.
font = fm.FontProperties(fname=font_path).get_name()
mpl.rc('font', family=font)

 

폰트를 적용하는 코드에 대해서는 나중에 따로 설명글을 작성하도록 하겠다.

일단은 이렇게 하면 한글이 적용되는구나 하는 정도로 알고만 넘어가자.

 

 

3. 시각화

 

I. subplot 공간 만들기

 

이제 시각화 그래프를 표현할 공간이 필요하다.

즉, 빈 subplot이 필요하다.

matplotlib 라이브러리에서는 아래와 같은 방법으로 빈 subplot을 만들 수 있다.

fig, ax = plt.subplots()

plt.show()

 

빈 subplot이 생성되었다.

시각화 데이터를 만들 때는 이렇게 빈 subplot을 먼저 만들어놓는 것이 기본이다.

그리고 나서 저 코드 사이에 시각화 함수를 넣으면 된다.

 

참고로 여기서 나오는 ax는 subplot의 위치를 나타내는 객체이다.

'축(axis)'이라고도 하는데, 이러면 그래프의 x축, y축과 헷갈릴 수 있으므로 그냥 subplot의 위치를 나타내는 객체라고 알아두자.

이에 대한 자세한 사항은 아래 링크를 참조하자.

 

링크 : https://kongalmengi.tistory.com/27

 

[Python](Matplotlib) Subplotting : 여러 개의 차트를 하나의 페이지에 그리기

이번에는 Subplotting 기법에 대해 설명하는 시간이다. 여기서 말하는 Subplotting이란 무엇인가? 간단하게 말 하자면, 하나의 페이지에 여러 개의 차트를 그리는 것 이라고 할 수 있다. 참고로 쉬운 이

kongalmengi.tistory.com

 

 

II. 꺾은선 그래프 그리기

 

꺾은선 그래프를 그리기 위해서는, .plot() 메소드를 다음과 같이 빈 subplot 코드 사이에 넣어주면 된다.

fig, ax = plt.subplots()

ax.plot()

plt.show()

 

그런데 여기에는 큰 문제가 있다.

시각화 할 데이터가 존재하지 않는다.

 

그러므로 여기에 시각화 시킬 데이터를 추가하고, 이를 .plot()에 전달해야 한다.

.plot()의 기본적인 사용법은 아래와 같다.

 

- .plot()의 사용법 : .plot(x축 데이터, y축 데이터)


※ 참고 ※

.plot() 메소드를 적용할 때, 본문처럼 ax.plot()으로 적용해도 되고, plt.plot()으로 적용해도 된다. 어떤 것을 적용해도 같은 시각화 결과를 얻을 수 있다.

하지만 코드의 의미상 차이는 존재하는데, 이에 대해 간단히 적어보자면 다음과 같다.

 

a. plt.plot() : 이 경우는 현재 활성화된 figure에 차트를 그리며, plt 모듈의 기본설정을 따른다. 보통 단일 그래프를 그릴 때 사용하는데, 아래의 ax.plot()을 이용해도 ax에 대한 별도의 설정이 없다면 똑같은 단일 그래프를 그릴 수 있다.

b. ax.plot() : 이 경우는 Axis 객체에 메서드로 작용하여 해당 ax에 차트를 그린다. 보통 여러 개의 그래프를 그릴 때 이용된다.

 

추가로 위 사항은 다른 형태의 그래프, 그러니까 막대 그래프(.bar()) 파이 차트(.pie()), 산점도(.scatter()) 등등, 모든 시각화 메소드에 동일하게 적용된다.

 

ax를 설정하여 다중 subplot을 그리는 방법에 대해서는 앞의 링크를 참조하자.


 

다시 본론으로 돌아와서, .plot()메소드의 사용법을 잘 보고, 여기에 sample_data_x와 sample_data_y를 다음과 같이 만들어 적용해보자.

# 시각화 하고자 하는 데이터 만들기
sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

# 시각화
fig, ax = plt.subplots()

ax.plot(sample_data_x, sample_data_y) # 데이터를 시각화 함수에 적용

plt.show()

 

이렇게 .plot()메소드에 x축 데이터와 y축 데이터를 전달하여 위와 같은 시각화 그래프를 얻었다.

(참고로 x축 데이터를 따로 입력해주지 않는 경우, x축은 y축 데이터의 인덱스에 대응된다.)

 

III. subplot 꾸미기

위의 시각화 자료를 보면, 그래프 외에 별다른 정보가 없다.

이번에는 위의 그래프가 무엇을 의미하는지 알 수 있도록 꾸며볼 것이다.

 

i) 데이터 레이블 붙이기

ax.plot()메소드의 label 파라미터를 이용하면, 해당 그래프에 label을 붙일 수 있다.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.plot(sample_data_x, sample_data_y, label='Sample Data') # label을 'Sample Data'로 설정

plt.show()

 

label을 'Sample Data'로 설정했다고는 하는데, 그래프 상에는 아무런 변화가 보이지 않는다.

이런 경우에는 ax.legend()를 이용하여 범례를 표현하면 label을 확인할 수 있다.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.plot(sample_data_x, sample_data_y, label='Sample Data')
ax.legend() # 범례 추가

plt.show()

 

Sample Data라는 범례가 그래프의 좌측 상단에 표시되었다.

여기서 ax.legend()의 loc 파라미터를 이용하면 범주의 위치를 설정할 수 있다.

loc에 입력할 수 있는 값들은 대략적으로 아래와 같다.

 

  • 'best': 최적의 위치를 자동으로 선택.
  • 'upper right': 오른쪽 위에 범례를 배치.
  • 'upper left': 왼쪽 위에 범례를 배치.
  • 'lower left': 왼쪽 아래에 범례를 배치.
  • 'lower right': 오른쪽 아래에 범례를 배치.
  • 'right': 오른쪽에 범례를 배치.
  • 'center left': 왼쪽 중앙에 범례를 배치.
  • 'center right': 오른쪽 중앙에 범례를 배치.
  • 'lower center': 아래 중앙에 범례를 배치.
  • 'upper center': 위 중앙에 범례를 배치.
  • 'center': 중앙에 범례를 배치.

예를 들어 loc = 'lower right'를 적용해보자.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.plot(sample_data_x, sample_data_y, label='Sample Data')
ax.legend(loc='lower right') # loc 설정

plt.show()

 

범례가 우측 하단으로 이동한 것을 확인할 수 있다.

 

ii) 그래프 제목 붙이기

ax.set_title()을 이용하면 그래프에 제목을 추가할 수 있다.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.set_title('Visualization_Sample') # 제목 추가
ax.plot(sample_data_x, sample_data_y, label='Sample Data')
ax.legend(loc='lower right')

plt.show()

 

그래프에 'Visualization Sample'이라는 제목이 추가되었다.

 

iii) 축 이름 붙이기

ax.set_xlabel()을 이용하면 x축 이름을, 그리고 ax.set_ylabel()을 이용하면 y축 이름을 넣어줄 수 있다.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.set_title('Visualization_Sample')
ax.plot(sample_data_x, sample_data_y, label='Sample Data')
ax.legend(loc='lower right')

ax.set_xlabel('여기가 x축') # x축 이름 추가
ax.set_ylabel('여기가 y축') # y축 이름 추가

plt.show()

 

x축과 y축에 축 이름(축 제목)이 출력된 것을 확인할 수 있다.

 

iv) 축 눈금 설정

ax.set_xticks()를 이용하면 x축 눈금에 대한 설정을 할 수 있다.

해당 함수의 기본적인 사용법은 아래와 같다.

 

- .set_xticks() 사용법 : .set_xticks(실제 눈금 데이터, 눈금에 표시할 문자열, rotation = 회전 각도)

 

예를 들어, 위의 예시에서 x축 데이터는 sample_data_x = [3, 4, 5, 6, 7]이다. 여기서 눈금을 숫자 대신에 ['samp_1', 'samp_2', 'samp_3', 'samp_4', 'samp_5']로 표현하고 싶다면, ax.set_xticks()에 다음과 같이 적용하면 된다.

sample_data_x = [3, 4, 5, 6, 7]
sample_data_y = [1, 3, 2, 5, 4]

fig, ax = plt.subplots()

ax.set_title('Visualization_Sample')
ax.plot(sample_data_x, sample_data_y, label='Sample Data')
ax.legend(loc='lower right')

ax.set_xlabel('여기가 x축')
ax.set_ylabel('여기가 y축')

sample_name = ['samp_1', 'samp_2', 'samp_3', 'samp_4', 'samp_5'] # 눈금에 표현할 문구
ax.set_xticks(sample_data_x, sample_name, rotation = 45) # 새 눈금표현 적용

plt.show()

 

눈금이 3, 4, 5, 6, 7에서 samp_1, samp_2, ... 로 바뀌어 표현된 것을 확인할 수 있다.

여기서 x축 눈금의 실제값은 여전히 3, 4, 5, 6, 7이다. 다만 시각화 표현만 samp_1, samp_2, ... 이렇게 바뀌었을 뿐이다.

추가로 rotation=45를 적용하여, x축 눈금의 문구가 45도 기울어진 것도 확인할 수 있다.

 

ax.set_yticks()를 이용하면 마찬가지로 y축 눈금에 대한 설정을 할 수 있다.

사용 방법은 ax.set_xticks()와 동일하므로, y축에 대한 함수 적용은 생략하도록 한다.

 

 

4. 비교 그래프 만들기

 

앞에서 꺾은선 그래프를 예로 들어, 시각화의 기초에 대해 알아봤다.

이번에는 앞서 익힌 기초를 이용하여 비교 그래프를 만들어볼 것이다.

 

I. 데이터 준비.

아래의 데이터는 어떤 지역의 날짜별 최대 온도와 최저 온도를 기록한 것이라고 한다.

dates = [
    '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05',
    '2024-01-06', '2024-01-07', '2024-01-08', '2024-01-09', '2024-01-10'
]
min_temperature = [20.7, 17.9, 18.8, 14.6, 15.8, 15.8, 15.8, 17.4, 21.8, 20.0]
max_temperature = [34.7, 28.9, 31.8, 25.6, 28.8, 21.8, 22.8, 28.4, 30.8, 32.0]

 

이 데이터를 시각화 할 것이다.

 

II. 최대온도와 최저온도의 시각화

일단 계획은, 하나의 그래프 공간에 최대온도와 최저온도의 그래프를 모두 넣을 것이다.

2개의 그래프가 필요하니, 그래프 함수도 2개가 필요할 것이다.

 

- 최소값 그래프 메소드 : min_temperature를 y축의 데이터로, dates를 x축의 데이터로 이용한다.

→ ax.plot(dates, min_temperature, label = 'min_temp')

 

- 최대값 그래프 메소드 : max_temperature를 y축의 데이터로, dates를 x축의 데이터로 이용한다.

→ ax.plot(dates, max_temperature, label = 'max_temp')

 

이를 이용하여 다음과 같이 코드를 구성하면 하나의 그래프 공간에 두 개의 꺾은선 그래프를 표현할 수 있다.

fig, ax = plt.subplots(figsize=(6, 3))

ax.plot(dates, min_temperature, label = 'min_temp')
ax.plot(dates, max_temperature, label = 'max_temp')

ax.legend(loc = 'upper right')
ax.set_title('온도')
ax.set_xticks(dates, dates, rotation=45)

plt.show()

 

 

이렇게 시각화 기초부터 시작해서, 하나의 그래프 공간에 두 개의 그래프를 그리는 과정까지 알아봤다.

이러한 과정에서 사용한 메소드는 .plot() (꺾은선 그래프)였는데, 이 외에도 matplotlib 라이브러리는 다음과 같은 시각화 메소드가 제공된다.

 

- .bar() : 막대 그래프

- .pie() : 파이 차트

- .scatter() : 산점도

- .hist() : 히스토그램

- .contour() : 등고선

- .barh() : 수평 막대 그래프

- .boxplot() : 상자 수염

 

 

다음번에는 이번에 익힌 기초를 토대로, 막대 그래프, 파이 그래프, 산점도를 그려볼 것이다.

관련글 더보기