Matplotlib는 그래프를 그리는 함수를 내장하고 있는 확장 라이브러리다. matplotlib.pyplot을 import하여 해당 모듈의 각 함수를 사용해 간편하게 그래프를 만들고 변화를 줄 수 있다.
기본적으로 plot() 함수를 사용해 그래프를 그릴 수 있으며, 인자로 리스트 형식의 값을 2개(x축, y축) 받는다.
plt.plot([1, 2, 3, 4])
이렇게 하나의 리스트만 전달하게 됐을 때, 인자로 넘겨준 리스트는 y축으로 인식하고 x축은 인자로 넘겨준 리스트의 길이에 맞춰 자동 생성된다. 예시의 경우 자동 생성되는 x축 리스트는 [0, 1, 2, 3]이다. 나타나는 그래프는 다음과 같다.
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
다음과 같이 두개의 리스트를 전달할 경우, 좌측이 x축, 우측이 y축이 된다. 해당 그래프는 다음과 같이 나타난다.
데이터프레임을 활용한 그래프 그리기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 인코딩방식 지정 : euc-kr -> cp949 -> mbcs
weather = pd.read_csv('data/weather.csv', encoding='euc-kr')
weather.head()
도시 월 평균기온 최저기온 최고기온
0 서울 Jan -4.0 -7.3 0.1
1 서울 Feb -1.6 -5.9 3.3
2 서울 Mar 8.1 3.8 13.6
3 서울 Apr 13.0 8.1 18.5
4 서울 May 18.2 13.4 23.3
예시로 사용할 데이터는 서울과 대구의 월별 평균, 최저, 최고 기온을 취합한 데이터다.
# '도시' 컬럼 값이 '서울'인 데이터만 추출해서 변수에 담기
seoul = weather[weather['도시']=='서울']
# '도시' 컬럼 값이 '대구'인 데이터만 추출해서 변수에 담기
daegu = weather[weather['도시']=='대구']
fig, ax = plt.subplots()
여러 그래프를 그려 비교하기 위해선 subplots() 함수를 사용하면된다. subplots() 함수에선 두 개의 값을 리턴 받을 수 있는데, 그래프의 사이즈를 나타내는 figure 값과 subplot 내부에 선언된 그래프 정보가 담긴 axes 값을 fig, ax 변수로 언패킹해주었다.
fig, ax 출력 예시
print(fig)
print(ax)
fig, ax = plt.subplots()
ax.plot(seoul['월'], seoul['평균기온'])
서울의 월 별 평균기온을 그래프로 표현하고 싶다면 다음과 같이 작성하면 된다.
서울과 대구의 월 별 평균기온을 그래프로 그려 비교하려면 다음과 같이 작성하면 된다.
fig, ax = plt.subplots()
ax.plot(seoul['월'], seoul['평균기온'])
ax.plot(daegu['월'], daegu['평균기온'])
그 외에 그래프의 스타일을 변경하거나, 간단한 꾸미기도 가능하다.
fig, ax = plt.subplots()
# marker : (x,y) 위치에 마커 속성, linestyle : 그래프 스타일 속성, color : 컬러 속성
ax.plot(seoul['월'], seoul['평균기온'], marker='v', linestyle='--', color='r')
# x축 타이틀 설정
ax.set_xlabel('월')
# y축 타이틀 설정
ax.set_ylabel('기온')
# 그래프 타이틀 설정
ax.set_title('서울 기온');
나타내려는 값이 많을 때, 한 그래프에 나타내면 가독성이 떨어지고 무엇을 말하고자 하는지 단번에 파악하기 힘들어, 데이터 시각화의 목적성에 어긋난다. 이럴 때 그래프를 두개 그려서 보여주는 방법도 있다.
fig, ax = plt.subplots(2, 1, sharey=True)
ax[0].plot(seoul['월'], seoul['평균기온'], color='b')
ax[0].plot(seoul['월'], seoul['최저기온'], color='b', linestyle='--')
ax[0].plot(seoul['월'], seoul['최고기온'], color='b', linestyle='--')
ax[1].plot(daegu['월'], seoul['평균기온'], color='r')
ax[1].plot(daegu['월'], seoul['최저기온'], color='r', linestyle='--')
ax[1].plot(daegu['월'], seoul['최고기온'], color='r', linestyle='--')
ax[0].set_ylabel('기온')
ax[1].set_xlabel('월')
ax[1].set_ylabel('기온')
여기서 subplot(2, 1, sharey=True)의 의미는 subplot(nrows=2, ncols=1, sharey=True)와 같다. 해석하자면 그래프를 2행 1열로 2개 만들거고, 두 그래프는 y축 기준을 공유한다는 의미이다(sharex는 x축 기준 공유 여부를 따진다). 두 그래프의 경우 x축은 컬럼이 동일해 공유 여부에 상관 없이 같은 기준으로 표현되지만, y축의 경우 데이터 프레임 별로 범위가 다르기 때문에 설정해주지 않으면 표현 기준이 달라질 수 있다.
plt.subplots()
= plt.subplots(1, 1, sharex=False, sharey=False)
= plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False)
multplotlib.pyplot을 통해 그래프를 그릴 때, plot 그래프 말고도 bar 그래프도 그릴 수 있다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
olympics = pd.read_csv('data/olympics.csv')
olympics.head()
Country Gold Silver Bronze
0 USA 2235 1252 1098
1 URS 838 627 584
2 GBR 546 621 553
3 FRA 408 491 497
4 GER 452 378 475
fig, ax = plt.subplots()
# 바 형식의 그래프로 표현
ax.bar(olympics['Country'], olympics['Gold'])
# x축의 컬럼 값이 길어 겹칠 때, roatation 값을 통해 값 기울기를 줄 수 있다.
ax.set_xticklabels(olympics['Country'], rotation=90);
fig, ax = plt.subplots()
# label : 범례에 표시할 라벨, bottom : 해당 데이터 밑에 놓일 데이터 지정
ax.bar(olympics['Country'], olympics['Gold'], label='금메달')
ax.bar(olympics['Country'], olympics['Silver'], bottom=olympics['Gold'], label='은메달')
ax.bar(olympics['Country'], olympics['Bronze'], bottom=olympics['Gold']+olympics['Silver'], label='동메달')
ax.set_xticklabels(olympics['Country'], rotation=90)
# legend() : 범례 표시 함수
ax.legend();
'빅데이터분석👨💻' 카테고리의 다른 글
[Python] 범주형 변수의 빈도 시각화 - Countplot() (0) | 2023.12.26 |
---|---|
[Python] 빅데이터분석 시각화 - 그래프 그리기 (Matplotlib 활용) (2) | 2023.12.21 |
[Python] 빅데이터 분석 기초 - 객체 병합 함수 (concat, join, merge) (0) | 2023.12.18 |
[Python] 빅데이터 분석 기초 - 집계 (Aggregation) (0) | 2023.11.27 |
[Python] 빅데이터 분석 기초 - 필터링 (Filtering) (1) | 2023.11.27 |