데이터분석/다섯째주

EDA : 시각화 - matplotlib

핑크댕댕이 2023. 10. 28. 03:38
728x90

목차

     

    Matplotlib 패키지

    https://matplotlib.org/stable/gallery/index

    • 파이썬의 대표 시각화 도구
    • matplotlib은 plt로 많이 naming하여 사용한다.
    • Jupyter Notebook 유저의 경우 matplotlib의 결과가 out session에 나타나는 것이 유리하므로,  %matplotlib inline 옵션을 사용한다.

     

     

    matplotlib.pyplot : 2D 그래프 

     

    import matplotlib.pyplot as plt
    
    # Jupyter Notebook 사용시
    # plt.show()를 하지 않아도 자동으로 생성되도록 만든다.
    # %matplotlib inline 
    # 위의 보다는  %matplotlib inline 아래 내용으로 사용할 것을 권고한다.
    
    get_ipyhon().run_line_magic('matplotlib', 'inline')

     

    Basic Attributes

    • [ parameters ]
      alpha    = 투명도
      kind    = 그래프 종류 'line', 'bar', 'barh', 'kde'
      logy    = Y축에 대해 Log scaling
      use_index    = 객체의 색인을 눈금 이름으로 사용할지 여부
      rot    = 눈금 이름 돌리기 (rotating) 0 ~ 360
      xticks, yticks    = x, y축으로 사용할 값
      xlim, ylim    = X, Y축의 한계
      grid    = 축의 그리드를 표현할지 여부

    • [ functions ]
      subplots    = 각 column에 독립된 subplot 그리기
      sharex, sharey    = (subplots=True) 이면 같은 X,Y축을 공유하고 눈금과 한계를 연결
      figsize    = 생성될 그래프의 크기를 tuple로 지정
      title    = 그래프의 제목 지정
      legend    = subplot의 범례 지정
      sort_columns    = column을 알파벳 순서로 그린다.

     

     

    그래프 도화지 생성 : figure( )

     plt . figure ( )   

     plt . figure ( figsize=(가로, 세로) )   

    • 그래프 사이즈 : figsize
      사이즈 단위는 inch 이다.

     

    그래프 출력 : show( )

     plt . show( )   

     

    선그래프 그리기 : plot( )

     plt . plot ( 데이터 )   

     plt . plot ( 데이터,  '선스타일',  label='범례에 표시될 이름',  drawstyle=' ' )   

    • 선 스타일 옵션
      색상 = b(파란색), g(초록색), r(빨간색), c(청록색), y(노란색), k(검은색), w(흰색)
      마커 = o(원), v(역삼각형), ^(삼각형), s(네모), +(플러스), .(점)

      조합예시 ) k-- , c. ,

    • drawstyle
      steps-post : 계단식 선 모양
    import matplotlib.pyplot as plt
    
    plt.figure()
    plt.plot(np.random.randn(50).cumsum(), 'k--')  
    # cumsum은 random하게 생성된 값들의 누적
    # randn은 정규화된 난수 발생으로 즉, 정규화된 난수를 누적그래프로 만들었다. 
    # k는 검은색을 뜻하며, --를 붙여서 점선으로 만든다.
    
    plt.show()

    -- 출력 --

     

    import matplotlib.pyplot as plt
    
    data = np.random.randn(30).cumsum()
    
    plt.figure()
    
    #그래프 겹쳐서 그리기
    plt.plot(data, 'k--', label='Default')
    plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')
             
    plt.legend(loc='best')
    
    plt.show()

    -- 출력 --

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 삼각함수 그래프 그리기
    t = np.arange(0, 12, 0.01)
    y = np.sin(t)
    
    def drawGraph():
    	plt.figure(figsize=(10, 6))
    	plt.plot(t, y, label='sin')
    	plt.plot(t, np.cos(t), label='cos')
    	plt.grid(True)
    	plt.legend() #범례표시, plot 함수의 label 옵션에 있는 값을 표시
    	plt.xlabel('time')
    	plt.ylabel('Amplitude') #진폭
    	plt.title('Example od sinewave')
    	plt.show()
    
    drawGraph()

    -- 출력 --

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    t = np.arange(0, 5, 0.5)
    
    def drawGraph():
    	plt.figure(figsize=(10, 6))
    	plt.plot(t, t, 'r--')
    	plt.plot(t, t ** 2, 'bs')  #blue square
    	plt.plot(t, t ** 3, 'g^')
    	plt.show()
    
    drawGraph()

    -- 출력 --

     

    import matplotlib.pyplot as plt
    
    t = list(range(0, 7))
    y = [1, 4, 5, 8, 9, 5, 3]
    
    plt.figure()
    plt.plot(t, y, 
    	color='red',
    	linestyle='-',
    	marker='o',
    	markerfacecolor='blue',
    	markersize=10
    )
    
    plt.xlim([-0.5, 6.5])
    plt.ylim([0.5, 9.5])
    plt.show()

    -- 출력 --

     

     

     

    히스토그램 hist( )

     plt . hist( 데이터,  bins=,  color=' ',  alpha= )   

    • bins   = x축 간격
    • color   = 색상
    • alpha   = 그래프 바의 투명도

     

     

    점그래프 scatter( )

     plt . scatter( x축 데이터, y축 데이터,  s=,  c=,  marker=' ' )   

    • s   = 사이즈
    • c   = 컬러맵
    • marker   = 점의 모양 지정, ' >  < o  등등'

    컬러차트 출력 colorbar( )

     plt . colorbar( )   

    import matplotlib.pyplot as plt
    import numpy as np
    
    t = np.array(range(0, 10))
    y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
    colormap = t
    
    plt.figure(20, 6)
    plt.scatter(t, y, s=150, c=colormap, marker='>')
    plt.colirbar()
    plt.show()

    -- 출력 --

     

     

     

     

    막대그래프 bar( ) ,  barh( )

     

     

    원그래프 pie( )

     plt . pie( 데이터,  explode=[ ],  autopct='%.1f%%',  labels=' ',  colors=[ ],   
                   shadow=True,  startangle=  )   

    • explode
      원에서 떨어져나오게 하는 정도
    • labels
      각 데이터별 라벨링
    • colors
      각 데이터별 컬러 지정
    • autopct
      자동으로 퍼센트를 계산하여 출력
      출력 형식 지정:  %  +  . 소수점 자릿수  +  f (숫자데이터 자료형태)  +  %  +  % (텍스트)
    • statrangle
      데이터 출력 시작 각도 설정
    • shadow
      그림자 설정, default값은 False
    import matplotlib.pyplot as plt
    
    data=[15,30,45,10]
    labels=['취업','결혼','출산','건강']
    colors=["yellow","gold","skyblue","lightcoral"]
    ex = (0.1,0,0,0) # 떨어져나오게 하는것 
    
    plt.figure()
    plt.pie(data,explode=ex, autopct="%.1f%%",labels=labels, colors=colors, shadow=True, startangle=90)
    
    plt.show()

    -- 출력 --

     

     

     

     

     

    다중 그래프 그리기 : subplot( ) ,  subplots( )

     plt . subplot ( 행 개수, 열 개수, 순번)   

     figure변수 , plt변수 = plt . subplots ( 행 개수,  열 개수 )   
     figure변수 , plt변수 = plt . subplots ( 행 개수,  열 개수,  sharex=True,  sharey=True )   

     plt변수[ 행위치, 열위치 ] . plot( )   
     plt변수[ 행위치, 열위치 ] . hist( )   
     plt변수[ 행위치, 열위치 ] . scatter( )   

    • sharex,  sharey
      x, y 축 공유
    • figure변수
      그래프 설정에 사용함.
    • plt변수
      그래프 순번 설정해서 그래프 그릴때 사용함.
      plt변수[행 위치, 열 위치] . plot (데이터)

     

    import matplotlib.pyplot as plt
    
    plt.figure()
    
    plt.subplot(2, 2, 1)
    plt.plot(np.random.randn(50).cumsum(), 'k--')
    
    plt.subplot(2, 2, 2)
    plt.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
    
    plt.subplot(2, 2, 3)
    plt.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
    
    plt.show()

    -- 출력 --

     

     

    import matplotlib.pyplot as plt
    
    plt.figure()
    
    # 서브플랏 간의 간격을 주지 않은 그래프를 생성하는 코드 
    fig , axes = plt.subplots(2,2, sharex=True, sharey=True)
    
    for i in range(2):
        for j in range(2):
            axes[i,j].hist(np.random.randn(500), bins=50, color='k', alpha = 0.5)
    
    plt.subplots_adjust(wspace=0, hspace=0)
    
    plt.show()

    -- 출력 --

     

    import matplotlib.pyplot as plt
    
    fig = plt.figure() # 도화지 생성 
    ax1 = fig.add_subplot(2,2,1) 
    ax2 = fig.add_subplot(2,2,2)
    ax3 = fig.add_subplot(2,2,3)
    
    ax1.plot(np.random.randn(50).cumsum(), 'k--')
    ax2.hist(np.random.randn(100),bins=20, color='k', alpha=0.3)
    ax3.scatter(np.arange(30) ,np.arange(30) + 3 * np.random.randn(30))

    -- 출력 --

     

     

     

     

     

     

    범례(레이블) 표시 : legend( )

    범례 (Legend)는 그래프에 데이터의 종류를 표시하기 위한 텍스트이다.

    import matplotlib.pyplot as plt
    
    data = np.random.randn(30).cumsum()
    
    plt.plot(data, 'k--',label='Default')
    plt.plot(data, 'k-', drawstyle = 'steps-post', label ='steps-post')
    
    plt.legend(loc = 'best') # loc : 범례의 위치
    # 축에대한 범례를 추가하려면 ax.legend를 호출
    
    plt.show()

    -- 출력 --

     

     

     

     

    그래프 제목 표시 : title( )

    x축 타이틀 표시 : xlabel( )

    y축 타이틀 표시 : ylabel( )

    import matplotlib.pyplot as plt
    
    plt.figure()
    plt.plot([10,20,30,40], [1,4,9,16], 
    	color="blue", 
    	linewidth=5, 
    	linestyle="--", 
    	marker="o", 
    	ms=15)
    # 그래프 색깔, 그래프 굵기, 그래프스타일, 그래프마커, 마커굵기 
    
    plt.xlabel("x axis") # x축 이름
    plt.ylabel("y axis") # y축 이름
    
    plt.xticks([0,10,20,30,40,50],color = "red",rotation=30) # x축 눈금, 눈금돌리기
    plt.yticks([0,5,10,15,20],color = "red") #y축 눈금 
    
    plt.show()

    -- 출력 --

     

     

     

    그래프 저장하기 : savefig( )

    import matplotlib.pyplot as plt
    
    plt.plot(np.random.randn(1000).cumsum(), 'k', label='one')
    plt.plot(np.random.randn(1000).cumsum(), 'k--', label='two')
    plt.plot(np.random.randn(1000).cumsum(), 'k.', label='three')
    
    plt.legend(loc='best')
    
    plt.show()
    
    plt.savefig("fig_saved.svg")

    -- 출력 --

    <Figure size 432x288 with 0 Axes>

     

     

     

    Pandas에서 plot 그리기

    matplotlib 을 가져와서 사용한다.

    https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html

    • 데이터(컬럼)가 많은 경우 정렬한 후 그리는 것이 효과적일 때가 많다.

     데이터프레임변수명 [ '컬럼명' ] . plot ( kind=' ',  figsize=(가로 , 세로),  grid=True,   )   

     데이터프레임변수명 [ '컬럼명' ] . sort_values() . plot ( kind=' ',   

                                                                                    figsize=(가로 , 세로),  grid=True,  title=' ')   

     

    Basic Attributes

    • [ Series . plot( ) 인자 ]
      label    = 그래프의 범례이름 
      ax    = 서브플롯 객체 
      style    = "ko--" 와같은 그래프 스타일 문자열 
      alpha    = 그래프 투명도 (0~1)
      kind    = 그래프 종류 'area', 'bar', 'barh', 'density', ' hist', 'kde', ' line' ,'pie' 
      logy    = y축에 대한 로그 스케일링 
      use_index    = 객체의 색인을 눈금이름으로 사용할지 여부 
      rot    = 눈금 이름을 로테이션 (0~360) 
      xticks    = x축으로 사용할 값 
      yticks    = y축으로 사용할 값 
      xlim    = x축 한계 : [0,10]
      ylim    = y축 한계 
       
    • [ DataFrame . plot() 메서드 인자 ]
      figsize    = 생성될 그래프 크기 튜플로 지정 
      title    = 그래프의 제목을 문자열로 지정 
      legend    = 서브플롯의 범례 추가, loc 옵션으로 위치 설정
      sort_columns    = 컬럼을 알파벳 순서로 그림

     

     

     

     

    반응형