📌 matplotlib를 이용하여 그래프 그리기




✅ 기본 그래프 그리기

import matplotlib.pyplot as plt

-> 라이브러리 임포트


plt.plot([1,2,3,4], [10, 20, 30, 40])
plt.show()

-> plt.plot을 통해서 x,y값을 입력하고 plt.show를 통해서 그래프를 나타낸다.


plt.title("ploting")
-> 을 통해서 그래프 이름 설정 가능


plt.legend()
-> plot에 label을 통해 범례 이름 설정가능


color = 'r', linestyle = '--'
-> color를 통해 색지정, linestyle을 통해 선모양 변경가능.(color는 c로, linestyle은 ls로 요약가능, r,g,b,k,y는 축약가능. 다른 색은 안됨)



✅ 내 생일의 기온 변화를 그래프로 그리기

import csv
import matplotlib.pyplot as plt
from datetime import datetime

# 최고, 평균, 최저, 날짜 기온 데이터 리스트에 담아서 출력
high = []  # 1) list 선언
avg = []
low = []
date_list = []

f = open('/content/seoul2022.csv', encoding='cp949')  # 2) 데이터 불러오기
data = csv.reader(f)
next(data)  # 3) 헤더

# 4-1) list 변수에 최고, 평균, 최저 기온 데이터 담기
for row in data:
  if row[-1] != '' and row[-2] != '' and row[-3] != '':  # 4-1) 결측치 제외
  # 자신이 태어난 월과 일이 일치하는 데이터만
    if row[0].split('-')[1] == '03' and row[0].split('-')[2] == '17':
      high.append(float(row[-1]))  # 4-2) 데이터 담기
      low.append(float(row[-2]))
      avg.append(float(row[-3]))
      date_list.append(datetime.strptime(row[0], '%Y-%m-%d'))  # 2022-08-01 -> %Y-%m-%d

plt.figure(figsize=(10,5), dpi=200) 
plt.plot(date_list, high, 'r', label='high')
plt.plot(date_list, avg, 'g', label='avg')
plt.plot(date_list, low, 'b', label='low')
plt.legend()
plt.show()

🔽 결과

❓ 내가 태어난 연도부터 확인 가능한 코드는 무엇일까?(데이터 편집 없이 코드로 구현한다면)

# 나머지 코드는 그대로
for row in data:
  if 2000 <= int(row[0].split('-')[0]):
    if row[-1] != '' and row[-2] != '' and row[-3] != '':
      if row[0].split('-')[1] == '03' and row[0].split('-')[2] == '17':
        high.append(float(row[-1]))  # 4-2) 데이터 담기
        low.append(float(row[-2]))
        avg.append(float(row[-3]))
        date_list.append(datetime.strptime(row[0], '%Y-%m-%d'))  # 2022-08-01 -> %Y-%m-%d

🔽 결과



✅ 한글 깨짐 방지 코드

import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm

fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
mpl.font_manager._rebuild()

그래프 코드에 아래 코드를 추가하면 된다.

plt.rcParams['axes.unicode_minus'] = False
plt.rc('font', family='NanumBarunGothic') 

🔽 결과

✏️ 범례 위치 수정
plt.legend(loc=)
-> loc=에 위치에 맞는 숫자를 입력하면 됨.



✅ 년도 입력하여 출력하기

start_year = input("언제부터?")
end_year = input("언제까지?")

-> 년도 변수 입력


for row in data:
  if int(start_year) <= int(row[0].split('-')[0]) and int(end_year) >= int(row[0].split('-')[0]):
    if row[-1] != '' and row[-2] != '' and row[-3] != '':
      if row[0].split('-')[1] == '03' and row[0].split('-')[2] == '17':
        high.append(float(row[-1]))  # 4-2) 데이터 담기
        low.append(float(row[-2]))
        avg.append(float(row[-3]))
        date_list.append(datetime.strptime(row[0].split('-')[0], '%Y'))

-> 입력받은 년도 시각화 처리 코드


plt.title(start_year + "년 이후부터" + end_year + "까지의 내 생일의 기온 변화 그래프")

-> 타이틀 입력


🔽 결과(start_year에 2002년, end_year에 2018년 입력한 결과)



✅ 다양한 그래프 그리기

- 히스토그램

import csv
import matplotlib.pyplot as plt

# 최고 기온 데이터만 result 리스트에 담아서 출력
result = []  # 1) list 선언

f = open('/content/seoul2022.csv', encoding='cp949')  # 2) 데이터 불러오기
data = csv.reader(f)
next(data)  # 3) 헤더

# 4) result list 변수에 최고 기온 데이터 담기
for row in data:
  if row[-1] != '':
    if row[0].split('-')[1] == '08':  # 4-1) 결측치 제외
      result.append(float(row[-1]))  # 4-2) 데이터 담기

plt.figure(dpi=100) 
plt.rc('font', family='NanumBarunGothic') 
plt.rcParams['axes.unicode_minus'] = False

plt.title("서울의 8월 최고 기온 데이터 히스토그램")
plt.hist(result, bins=100, color = 'r')
plt.show()

🔽 결과

(※ 히스토그램은 축약 안됨)

✏️ 1,4,8월 최고 기온 그래프

aug = []
jan = []
apl = []

-> 변수 선언


for row in data:
  month = row[0].split('-')[1]
  if month == '08':
    if row[-1] != '':
      aug.append(float(row[-1]))

  if month == '01':
    if row[-1] != '':
      jan.append(float(row[-1]))

  if month == '04':
    if row[-1] != '':
      apl.append(float(row[-1]))

-> 각 달에 맞게 list 변수에 최고 기온 데이터 담기


plt.hist(aug, bins=100, color = 'r', label = "8월 최고 기온")
plt.hist(jan, bins=100, color = 'b', label = "1월 최고 기온")
plt.hist(apl, bins=100, color = 'y', label = "4월 최고 기온")

-> 히스토그램 그리기

🔽 결과


✏️ 8월 최고, 최저, 평균 기온 비교

high = []
low = []
avg = []

-> 변수 선언


for row in data:
  month = row[0].split('-')[1]
  if month == '08':
    if row[-1] != '':
      high.append(float(row[-1]))
    if row[-2] != '':
      low.append(float(row[-2]))
    if row[-3] != '':
      avg.append(float(row[-3]))

-> 각 달에 맞게 list 변수에 최고 기온 데이터 담기


plt.hist(high, bins=100, color = 'r', label = "8월 최고 기온")
plt.hist(low, bins=100, color = 'b', label = "8월 최저 기온")
plt.hist(avg, bins=100, color = 'y', label = "8월 평균 기온")

-> 히스토그램 그리기

✏️ 사용자에게 월을 입력받아 히스토그램 그리기

choice_month = input("원하는 월을 입력하시오")

-> 사용자에게 원하는 달을 입력받음


for row in data:
  month = row[0].split('-')[1]
  if month == choice_month:
    if row[-1] != '' and row[-2] != '' and row[-3] != '':
      high.append(float(row[-1]))
      low.append(float(row[-2]))
      avg.append(float(row[-3]))

-> 입력받은 달의 최고, 최저, 평균의 데이터를 변수에 저장


plt.hist(high, bins=100, color = 'r', label = choice_month + "월 최고 기온")
plt.hist(low, bins=100, color = 'b', label = choice_month + "월 최저 기온")
plt.hist(avg, bins=100, color = 'y', label = choice_month + "월 평균 기온")

plt.title(choice_month + "월 기온 데이터 히스토그램")

-> 히스토그램 그리기

🔽 결과(04 입력한 결과)

- boxplot(상자그림)


-> aug와 jan의 boxplot 코드를 따로 했을 때


-> boxplot([aug, jan])로 했을 때

히스토그램(1월과 8월 최고 기온 비교)이랑 동일한 코드, hist를 boxplot으로만 변경


✏️ 상자그림을 이용한 월별 기온 변화 비교

import csv
import matplotlib.pyplot as plt

high = []
low = []
avg = []

f = open('/content/seoul2022.csv', encoding='cp949')  # 1) 데이터 불러오기
data = csv.reader(f)
next(data)  # 2) 헤더

# 3) 월별 데이터 저장형 month 변수를 선언
# month = [[0], [1],...,[10],[11]] -> 총 12개
# month[0].append()

month = []

for i in range(12):
  month.append([])

# 4) 각 달에 맞게 list 변수에 데이터 담기
for row in data:
  if row[-1] != '':
    month[int(row[0].split('-')[1])-1].append(float(row[-1]))
    # (row[0].split('-')[1]) -> 월 출력, int를 이용해서 형변환(01->1), 인덱스는 0부터 시작이므로 -1을 한 것.

plt.figure(dpi=100) 
plt.rc('font', family='NanumBarunGothic') 
plt.rcParams['axes.unicode_minus'] = False
plt.boxplot(month)

plt.title("서울 최고 기온 데이터 월별 상자 그림")
plt.legend()
plt.show()

🔽 결과

+) 일별 비교

1개의 댓글

comment-user-thumbnail
2022년 8월 16일

깔끔하게 정리 아주 잘 했네요. 글 보면서 어제 강의한 내용 새록새록 생각나면서 되게 까마득한 느낌은?!
하하, 다음주에 봐요

답글 달기