학습주제
- 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()
- plt.hist() : 히스토그램 (Histogram)은 도수분포표를 그래프로 나타낸 것으로서, 가로축은 변수 값, 세로축은
- 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()
- plt.pie(): 파이 차트는 범주별 구성 비율을 원형으로 표현한 그래프이며, 부채꼴의 중심각을 구성 비율에
- 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()
- plt.matshow() : 히트맵 (Heatmap)은 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서
- 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()
- plt.text(x위치, y위치, 텍스트, fontdict): 그래프의 적절한 위치에 텍스트를 삽입
- 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 |

