Python Library - #6 Matplotlib

임다이·2023년 11월 9일
0

Matplotlib

  • 2D 그래프로 시각화가 가능한 라이브러리
  • 파이썬에서 데이터를 차트로 그려줌
  • 차트의 종류는 산점도, 막대, 파이, 히스토그램, 꺽은선 그래프 등 다양함

  • 데이터 시각화란?
    -광범위하게 분산된 방대한 양의 자료를 한눈에 볼 수 있도록 도표나 차트 등으로 정리하는 것
    -시각화를 통해 데이터의 특징을 쉽게 파악 가능
    -분석 결과를 상대방에게 효과적으로 전달 가능


Matplotlib 라이브러리 로딩

import matplotlib.pyplot as plt

기본적인 그래프 그려보기

  • Line Plot(선 그래프)

    y = [2, 12, 6]
    
    plt.plot(y)
    # x좌표는 0부터 1씩 증가하며 자동 할당
    
    plt.show()
    # 그렸던 plot(그래프)들을 출력

  • x축, y축 설정해서 그려보기

    x = [1, 2, 3]
    y = [2, 4, 6]
    
    plt.plot(x, y, ls = ':', color = 'hotpink', lw = 2, marker = 'D', mec = 'r', mfc = 'red',ms = 10)
    
    plt.show()



  • 속성값

  1. 라인의 스타일 설정 : ls(Line Style) -> 문자열
  2. 라인의 두께 지정 : lw(Line Width) -> 그냥 숫자로 적어주기!! 문자X
  3. 선의 색 바꾸기 : c(color) -> 선색과 마커의 색까지 모두 변경
  4. 값의 위치 표시 : marker -> 문자열
  5. 마커 내부 색깔 : mfc(marker face color) -> 문자열
  6. 마커 선 색깔 : mec(marker edge color) -> 문자열
  7. 마커 크기 : ms -> 숫자
  8. 마커 선 굵기 : mew(marker egde width) -> 숫자

import numpy as np

x = np.arange(8)
y = [5,2,3,6,8,7,5,7]

plt.plot(x, y, ls = ':', color = 'hotpink', lw = 2, marker = 'D', mec = 'red', mfc = 'pink',ms = 5)

plt.show()

x = np.arange(8)
y = [5,2,3,6,8,7,5,7]
# 색상코드표를 활용해서 색상 지정 가능
# https://www.rapidtables.org/ko/web/css/css-color.html
plt.plot(x, y, ls = '--', color = '#FF6347', lw = 2, marker = '$♥$', mec = 'g', mfc = 'g',ms = 10)

# 그래프 숫자 표시 범위 지정(xlim, ylim)
# 범위를 지정하여 그래프 확대, 축소 출력 가능
plt.xlim(-2, 10)
plt.ylim(-5, 12)

# 그리드 그리기(모눈종이, 격자눈금)
plt.grid()

# 눈금 출력하기
plt.yticks(y)

plt.show()


여러개 차트를 하나의 공간에 그리기

  • 한글 인코딩하는 법 - matplotlib 한글이 깨졌을 때 사용!

    from matplotlib import rc
    rc('font', family = 'Malgun Gothic')
    # font : 폰트를 설정하겠다
    # family : 글꼴집합이라는 의미로 글꼴명을 적어주면됨
    x = [2,3,4,5,6,7,8]
    y1 = [5,7,3,9,1,8,6]
    y2 = [9,5,7,2,3,7,1]
    
    plt.plot(x, y1)
    plt.plot(x, y2)
    
    # x축이름 설정
    plt.xlabel('X축')
    
    # y축이름 설정
    plt.ylabel('Y', rotation=0)
    
    plt.show()

  • 여러 개의 차트 하나의 공간에 그리기

    x = [1,2,3,4]
    y = [2,4,6,8]
    z = [3,6,9,12]
    
    plt.plot(x, label = 'x데이터')
    plt.plot(y, label = 'y데이터')
    plt.plot(z, label = 'z데이터')
    
    # 범례 설정하기
    # 범례 : 참고사항, 데이터를 식별하기 위한 text
    plt.legend()
    
    # 차트 제목 설정하기
    plt.title('차트 제목', loc = 'right')
    
    plt.show()


산점도(scatter) 그래프

  • DataFrame 생성

    import pandas as pd
    
    df = pd.DataFrame(np.random.rand(50,4), columns=['A','B','C','D'])
    
    # 최상단에 있는 데이터 확인
    display(df.head(10))
    # 최하단에 있는 데이터 확인
    display(df.tail(10))


  • scatter 그래프 생성하기

    plt.scatter(x = df['A'], y = df['B'], label = 'Group1', s=90, c='gray')
    plt.scatter(x = df['C'], y = df['D'], label = 'Group2')
    
    plt.legend()
    
    plt.show()


막대 그래프 그려보기

  • 바(막대) 그래프

    x = [0,1,2,3,4,5]
    y = [80,85,70,60,50,90]
    
    plt.bar(x, y, color='pink')
    plt.xlabel('스인개 반')
    plt.ylabel('점수', rotation = 0)
    
    # plt.text (x좌표, y좌표, 적고자하는 값)
    for i in range(0, 6) :
        plt.text(x[i], y[i]-5, f'{y[i]}')
    # plt.text(x[0], y[0]-5, f'{y[0]}')
    # plt.text(x[1], y[1]-5, f'{y[1]}')
    # plt.text(x[2], y[2]-5, f'{y[2]}')
    # plt.text(x[3], y[3]-5, f'{y[3]}')
    # plt.text(x[4], y[4]-5, f'{y[4]}')
    # plt.text(x[5], y[5]-5, f'{y[5]}')
    
    # ylim을 설정해서 막대그래프 확대
    plt.ylim(45, 100)
    
    # 제목 달아주기
    plt.title('스인개 반별 성적', loc = 'left')
    
    plt.show()

  • barh(수평막대) 그래프

    x = [0,1,2,3,4,5]
    y = [80,85,70,60,50,90]
    
    plt.barh(x, y)
    
    plt.show()


실습

  • 공공데이터 분석 및 시각화
    -2017년 전국 사망교통사고 데이터

  • 데이터 분석에 필요한 라이브러리 로딩

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
  • 데이터 로딩(불러오기)

    data = pd.read_csv('./data/Traffic_Accident_2017.csv', encoding = 'euc-kr')
  • 데이터 정보 확인

    data.info()

  • 데이터의 크기 확인
    data.shape
  • 데이터 최상단 5개의 데이터 확인
    data.head()

교통사고 사망자 수를 count 해보자
  • 컬럼(열)만 추출
    data.columns
  • 교통사고 사망자 수를 count 하기
    value_counts : 특정 컬럼의 값들의 개수를 각각 출력
    data['사망자수'].value_counts()

    사망자가 1인인 사고가 교통사고의 대부분을 차지

요일별 사고건수를 카운트

-요일별 사고건수 확인
-요일 순서대로(월 ~ 일) 출력


  • 요일별 사고건수 카운트
    y= data['요일'].value_counts()
  • 정렬을 하더라도 가나다순으로 정렬되어 요일별 정렬이 불가능함
    y.sort_index()
  • 재정렬 하는 방법
    y = y[['월','화','수','목','금','토','일']]
    y

  • 시각화
    -막대그래프
x = y.index # y의 인덱스를 추출하여 x에 요일정보로 삽입
y1 = y.values

plt.bar(x, y1,color='pink')

plt.xlabel('요일')
plt.ylabel('사고건수', rotation = 90)
plt.title('요일별 교통사고 건수')

for i in range(0, 7) :
    plt.text(x[i], y[i], f'{y[i]}')

plt.ylim(450, 650)

plt.show()


'차대차'(차와 차의 사고) 사건 중 사상자 수가 많은 발생지 시도를 알아보고 시각화 해보자!
  • 키워드 : 차대차, 사상자수, 발생지 시도

  • 'display.max_columns', None : 모든 열 출력

    pd.set_option('display.max_columns', None)
  • 사고유형_대분류가 '차대차'인 경우만 출력

    car = data[data['사고유형_대분류'] == '차대차']
    car

    car[['발생지시도','사상자수']]

  • 발생지시도를 기준으로 사상자수를 확인 / groupby 사용
    car1 = car[['발생지시도','사상자수']].groupby(['발생지시도']).sum()
    car1
x = car1.index
y = car1['사상자수']
# = car1.values

plt.figure(figsize = (15,8))
plt.plot(x, y, color='hotpink')

plt.title('차 vs 차 교통사고의 사상자수')
plt.xlabel('지역')
plt.ylabel('사상자 수', rotation=0)
plt.grid()

plt.show()

x = car1.index
y = car1['사상자수']
# = car1.values

plt.figure(figsize = (15,8))
plt.bar(x, y, color='hotpink')

plt.title('차 vs 차 교통사고의 사상자수')
plt.xlabel('지역')
plt.ylabel('사상자 수', rotation=0)
plt.grid()

plt.show()

  • 그래프를 내림차순으로 정렬
car1 = car1.sort_values('사상자수', ascending = False)
x = car1.index
y = car1['사상자수']
# = car1.values

plt.figure(figsize = (15,8))
plt.bar(x, y, color='hotpink')

plt.title('차 vs 차 교통사고의 사상자수')
plt.xlabel('지역')
plt.ylabel('사상자 수', rotation=0)
plt.grid()

plt.show()


profile
개발자 임다이입니다~!

0개의 댓글