데이터분석

33-(2). Matplotlib

장수우 2024. 1. 15. 00:17
학습주제
  • Matplotlib Visualization
주요 학습 내용
  • Matplotlib Visualization - scatter plot(산점도)
    • plt.scatter(s=, c=):x, y 좌표로 이뤄진 데이터들을 점으로 표현하는 플롯
    • s는 점 크기, c는 점 색깔을 조절하며 label이나 class에 따른 데이터 분포를 확인할 때 활용이 가능
      x = np.random.rand(50)
      y = np.random.rand(50)
      
      # 각 데이터점마다 class를 가지고 있는 경우, class를 color로도 표현할 수 있다.
      colors = [0]*25 + [1]*25
      area = x * y * 250
      plt.scatter(x, y, s=area, c=colors)
      plt.show()​
  • Matplotlib Visualization - Barplot, Barhplot
    • plt.bar(), plt.barh(): 범주가 있는 데이터 값을 직사각형의 막대로 표현하는 그래프
    • width, align 등의 옵션으로 막대의 위치를 조정할 수 있으며, color와 alpha 옵션을 이용해 각 막대의
      색깔 또한 조정이 가능하다
      # Barplot: plt.bar()
      x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
      y = [66, 80, 60, 50, 80, 10]
      
      plt.figure(figsize=(6, 3))
      plt.bar(x, y, align='center', alpha=0.7, color='red')
      plt.xticks(x)
      plt.ylabel('Number of Students')
      plt.title('Subjects')
      plt.show()
      
      #----------
      # Barhplot (축 변환): plt.barh()
      # barh 함수에서는 xticks로 설정했던 부분을 yticks로 변경
      x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
      y = [66, 80, 60, 50, 80, 10]
      
      plt.barh(x, y, align='center', alpha=0.7, color='green')
      plt.yticks(x)
      plt.xlabel('Number of Students')
      plt.title('Subjects')
      plt.show()​

 

  • plt.subplots()과 plt.bar나 plt.barh를 함께 사용하면 비교 그래프 또한 그릴 수 있습니다
    x_label = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
    x = np.arange(len(x_label))
    y_1 = [66, 80, 60, 50, 80, 10]
    y_2 = [55, 90, 40, 60, 70, 20]
    
    # 넓이 지정
    width = 0.35
    
    # subplots 생성
    fig, axes = plt.subplots()
    
    # 넓이 설정
    axes.bar(x - width/2, y_1, width, align='center', alpha=0.5)
    axes.bar(x + width/2, y_2, width, align='center', alpha=0.8)
    
    # xtick 설정
    plt.xticks(x)
    axes.set_xticklabels(x_label)
    plt.ylabel('Number of Students')
    plt.title('Subjects')
    plt.legend(['john', 'peter'])
    plt.show()​
  • Matplotlib Visualization - Histogram
    • plt.hist() : 히스토그램 (Histogram)은 도수분포표를 그래프로 나타낸 것으로서, 가로축은 변수 값, 세로축은 
      빈도나 비율을 나타낸다
    • bins 옵션을 통해 히스토그램에서의막대 개수를 조절 할 수 있으며, density=True인 경우에는
      frequency 대신 density를 y축에 나타낸다.
      # density=True 값을 통하여 Y축에 frequency 대신
      # density를 표기 가능
      N = 100000
      bins = 30
      x = np.random.randn(N)
      plt.hist(x, bins=bins, density=True)
      plt.show()​
  • Matplotlib Visualization - Pie chart
    • plt.pie(): 파이 차트는 범주별 구성 비율을 원형으로 표현한 그래프이며, 부채꼴의 중심각을 구성 비율에
      비례하도록 표현
    • explode: 파이에서 툭 튀어져 나온 비율
    • autopct: 퍼센트 자동으로 표기
      - '%.1f%%': 소수점 1자리까지 표기
    • shadow: 그림자 표시
    • startangle: 파이를 그리기 시작할 각도
    • texts, autotexts 인자를 리턴 받습니다
      - texts는 label에 대한 텍스트 효과를, autotexts는 파이 위에 그려지는 텍스트 효과를 다룰 때 활용
      labels = ['Samsung', 'Huawei', 'Apple', 'Xiaomi', 'Oppo', 'Etc']
      sizes = [20.4, 15.8, 10.5, 9, 7.6, 36.7]
      explode = (0.3, 0, 0, 0, 0, 0)
      
      # texts, autotexts 인자를 활용하여 텍스트 스타일링을 적용
      patches, texts, autotexts = plt.pie(sizes,
       explode=explode,
       labels=labels, 
       # autopct='%.2f%%',
       autopct='%.1f%%',
       shadow=True,
       startangle=90)
      plt.title('Smartphone pie', fontsize=15)
      
      # label 텍스트에 대한 스타일 적용
      for t in texts:
       t.set_fontsize(12)
       t.set_color('gray')
       
      # pie 위의 텍스트에 대한 스타일 적용
      for t in autotexts:
       t.set_color("white")
       t.set_fontsize(18)
      plt.show()​
  • Matplotlib Visualization - Heatmap
    • plt.matshow() : 히트맵 (Heatmap)은 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서
      시각화한 것
    • 지도 이미지 위에 인구의 분포와 같이 2차원(x,y) 형태로 표현되는 데이터의 빈도 분포를 보여주기에 적합
      # Heatmap
      import matplotlib.pyplot as plt
      import numpy as np
      arr = np.random.standard_normal((30, 40))
      
      # 컬러맵 종류 지정
      cmap = plt.get_cmap('PiYG')
      # cmap = plt.get_cmap('BuGn')
      # cmap = plt.get_cmap('Greys')
      # cmap = plt.get_cmap('bwr')
      
      plt.matshow(arr, cmap=cmap)
      plt.colorbar(shrink=0.8, aspect=10)
      plt.show()​
  • Matplotlib Visualization - Colormaps
    • matplotlib.pyplot 모듈은 컬러맵을 간편하게 설정하기 위한 여러 함수를 제공
    • plt.plasma(), plt.jet()와 같은 함수를 이용해서 플롯에서 사용되는 색깔들을 다양하게 만들 수 있습니다
      # Colormaps
      arr = np.random.standard_normal((8, 100))
      plt.subplot(2, 2, 1)
      plt.scatter(arr[0], arr[1], c=arr[1])
      plt.viridis()
      plt.title('viridis')
      
      # colorbar() 함수를 사용하면 그래프 영역에 컬러바를 포함 가능
      plt.colorbar()
      plt.subplot(2, 2, 2)
      plt.scatter(arr[2], arr[3], c=arr[3])
      
      plt.plasma()
      plt.title('plasma')
      
      plt.colorbar()
      plt.subplot(2, 2, 3)
      plt.scatter(arr[4], arr[5], c=arr[5])
      
      plt.jet()
      plt.title('jet')
      
      plt.colorbar()
      plt.subplot(2, 2, 4)
      plt.scatter(arr[6], arr[7], c=arr[7])
      
      plt.nipy_spectral()
      plt.title('nipy_spectral')
      
      plt.colorbar()
      plt.tight_layout()
      plt.show()​
  • Matplotlib Visualization - 텍스트 삽입하기
    • plt.text(x위치, y위치, 텍스트, fontdict): 그래프의 적절한 위치에 텍스트를 삽입
      # 텍스트 삽입하기
      import matplotlib.pyplot as plt
      import numpy as np
      
      a = 2.0 * np.random.randn(10000) + 1.0
      b = np.random.standard_normal(10000)
      c = 20.0 * np.random.rand(5000) - 10.0
      
      font1 = {'color': 'darkred',
       'weight': 'normal',
       'size': 16}
      
      font2 = {'color': 'blue',
       'weight': 'bold',
       'size': 12,
       'alpha': 0.7}
      font3 = {'color': 'forestgreen',
       'style': 'italic',
       'size': 14}
       
      plt.hist(a, bins=100, density=True, alpha=0.7, histtype='step')
      plt.text(1.0, 0.35, 'np.random.randn()', fontdict=font1)
      plt.hist(b, bins=50, density=True, alpha=0.5, histtype='stepfilled')
      plt.text(2.0, 0.20, 'np.random.standard_normal()', fontdict=font2)
      plt.hist(c, bins=100, density=True, alpha=0.9, histtype='step')
      plt.text(5.0, 0.08, 'np.random.rand()', fontdict=font3)
      plt.show()​
  • Matplotlib Visualization - 그래프 스타일 설정
    • plt.style.use() : 미리 만들어놓은 Matplotlib 그래프 스타일을 사용해서 다양한 스타일을 지정할 수 있다.
    • plt.style.available를 통해 사용 가능한 스타일을 조회할 수 있다.
      # 그래프 스타일 설정
      np.random.seed(0)
      arr = np.random.standard_normal((8, 100))
      plt.subplot(2, 2, 1)
      plt.scatter(arr[0], arr[1], c=arr[1])
      plt.style.use('bmh')
      plt.title('bmh')
      plt.subplot(2, 2, 2)
      plt.scatter(arr[2], arr[3], c=arr[3])
      plt.style.use('ggplot')
      plt.title('ggplot')
      plt.colorbar()
      plt.subplot(2, 2, 3)
      plt.scatter(arr[4], arr[5], c=arr[5])
      plt.style.use('classic')
      plt.title('classic')
      plt.colorbar()
      plt.subplot(2, 2, 4)
      plt.scatter(arr[6], arr[7], c=arr[7])
      plt.style.use('Solarize_Light2')
      plt.title('Solarize_Light2')
      plt.colorbar()
      plt.tight_layout()
      plt.show()
      plt.style.use('default')​
    • 미리 지정해놓은 스타일을 사용하지 않고, 각각의 스타일 관련 파라미터 (rcParams)를 지정할 수 있다
      # rcParams를 이용해서 커스텀 스타일 설정
      import matplotlib.pyplot as plt
      
      plt.style.use('default')
      plt.rcParams['figure.figsize'] = (6, 3)
      plt.rcParams['font.size'] = 12
      
      # plt.rcParams['figure.figsize'] = (4, 3)
      # plt.rcParams['font.size'] = 14
      
      plt.rcParams['lines.linewidth'] = 3
      plt.rcParams['lines.linestyle'] = '-'
      
      plt.rcParams['xtick.top'] = True
      plt.rcParams['ytick.right'] = True
      plt.rcParams['xtick.direction'] = 'in'
      plt.rcParams['ytick.direction'] = 'in'
      
      plt.plot([1, 2, 3, 4], [4, 6, 2, 7])
      plt.show()
      plt.style.use('default')​
  • Matplotlib Visualization - Subplots
    • plt.subplots(행 개수, 열 개수) : 하나의 화면 안에 여러 플롯을 넣을 수 있다
    • fig, axes 를 plt.subplots()의 인자로 넣은 뒤 axes[행,열].plot명령어 를 입력해 각 subplot에 원하는 플롯을 
      넣을 수 있다.
      # data 생성
      data = np.arange(1, 51)
      
      # 밑 그림: 2행 3열
      fig, axes = plt.subplots(2, 3)
      
      axes[0, 0].plot(data)
      axes[0, 1].plot(data * data)
      axes[0, 2].plot(data ** 3)
      axes[1, 0].plot(data % 10)
      axes[1, 1].plot(-data)
      axes[1, 2].plot(data // 20)
      
      # axes
      plt.tight_layout()
      plt.show()​
    • 각 axes[행,열]에 대해서 plt에서 사용하는 함수들을 이용해서 다양한 스타일 조정이 가능하다.
    • sharex=True, sharey=True로 설정하여 아래와 같이 중복된 축을 한번만 표시할 수 있다
      import matplotlib.pyplot as plt
      import numpy as np
      
      x = np.arange(1, 5) # [1, 2, 3, 4]
      
      fig, ax = plt.subplots(2, 2, sharex=True, sharey=True, 
      squeeze=True)
      ax[0][0].plot(x, np.sqrt(x), 'gray', linewidth=3, 
      label='y=np.sqrt(x)')
      ax[0][0].set_title('Graph 1')
      ax[0][0].legend()
      ax[0][1].plot(x, x, 'g^-', markersize=10, label='y=x')
      ax[0][1].set_title('Graph 2')
      ax[0][1].legend(loc='upper left')
      ax[1][0].plot(x, -x+5, 'ro--', label='y=-x+5')
      ax[1][0].set_title('Graph 3')
      ax[1][0].legend(loc='lower left')
      ax[1][1].plot(x, np.sqrt(-x+5), 'b.-.', 
      label='y=np.sqrt(-x+5)')
      ax[1][1].set_title('Graph 4')
      ax[1][1].legend(loc='upper center')
      
      plt.show()​
  • Matplotlib Visualization - Boxplot
    • plt.boxplot() : 박스 플롯 (Box plot) 은 수치 데이터의 분포를 표현
    • Maximum / minimum value : Q1, Q3로부터 1.5*IQR 내에서 최대/최소값
    • notch=True: 중앙값 (Median)의 95% 신뢰 구간을 노치 형태로 표시
      # box plot
      
      # 샘플 데이터 생성
      spread = np.random.rand(50) * 100
      center = np.ones(25) * 50
      flier_high = np.random.rand(10) * 100 + 100
      flier_low = np.random.rand(10) * -100
      data = np.concatenate((spread, center, flier_high, flier_low))
      
      # 기본 박스플롯 생성
      plt.boxplot(data, notch=True)
      plt.tight_layout()
      plt.show()​
    • plt.subplots()과 plt.boxplot()을 함께 사용하면 한 그림 안에 여러 boxplot을 그릴 수 있다
    • box[‘whiskers’], box[‘median’] 등의 key 호출 후 item.get_ydata()를 통해 각 box의 whisker 범위, median, outlier
      값들을 조회할 수 있다
      # 샘플 데이터 생성
      spread = np.random.rand(50) * 100
      center = np.ones(25) * 50
      flier_high = np.random.rand(10) * 100 + 100
      flier_low = np.random.rand(10) * -100
      data_a = np.concatenate((spread, center, flier_high, flier_low))
      
      spread = np.random.rand(50) * 50
      center = np.ones(25) * 25
      flier_high = np.random.rand(10) * 50 + 100
      flier_low = np.random.rand(10) * -50
      data_b = np.concatenate((spread, center, flier_high, 
      flier_low))
      
      fig, ax = plt.subplots()
      box = ax.boxplot([data_a, data_b])
      plt.show()
      
      whiskers = [item.get_ydata() for item in box['whiskers']]
      medians = [item.get_ydata() for item in box['medians']]
      fliers = [item.get_ydata() for item in box['fliers']]
      
      print('whiskers:', whiskers)
      print('medians:', medians)
      print('fliers:', fliers)​
  • Matplotlib Visualization - Violin plot 
    • plt.violinplot() : boxplot에 kde 곡선을 같이 그린 형태로 좀 더 세밀한 분포 확인이 가능
    • quantiles 옵션을 이용해 표시할 분위수를 조절할 수 있다
      fig, ax = plt.subplots()
      
      violin = ax.violinplot([data_a, data_b, data_c],
       showmeans=True,
       showextrema=True,
       # showmedians=True,
       quantiles=[[0.25, 0.75], [0.1, 0.9], [0.3, 0.7]])
       
      ax.set_ylim(-10.0, 10.0)
      ax.set_xticks(np.arange(1, 4))
      ax.set_xticklabels(['A', 'B', 'C'])
      ax.set_xlabel('Data Type')
      ax.set_ylabel('Value')
      
      violin['bodies'][0].set_facecolor('blue')
      violin['bodies'][1].set_facecolor('red')
      violin['bodies'][2].set_facecolor('green')
      
      violin['cbars'].set_edgecolor('gray')
      violin['cmaxes'].set_edgecolor('gray')
      violin['cmins'].set_edgecolor('gray')
      violin['cmeans'].set_edgecolor('gray')
      
      plt.show()​

 

반응형

'데이터분석' 카테고리의 다른 글

34. 회귀분석과 데이터모델링  (1) 2024.01.27
33-(3). seaborn  (1) 2024.01.15
33-(1) Matplotlib Visualization - 기본문법  (1) 2024.01.14
32-(2). 정량적 데이터 분석  (2) 2024.01.14
32-(1). 확률과 통계  (2) 2024.01.14