2024.01.10 TIL

녹차·2024년 2월 7일

TIL_Python

목록 보기
9/9

matplotilb - 선형그래프

import matplotlib.pyplot as plt
# 기본 문법
plt.plot([1, 2, 3], [3, 6, 9])
plt.plot([1, 2, 3], [2, 4, 9])
plt.show()
  • plt.plot() 등의 명령문을 작성한뒤, plt.show()를 통해서 바로 플롯을 보거나, plt.savefig() 를 통해서 플롯을 파일로 저장

# 타이틀

plt.plot([1, 2, 3], [3, 6, 9])
plt.plot([1, 2, 3], [2, 4, 9])

# 타이틀 & font 설정
plt.title('이것은 타이틀 입니다')

plt.show()
  • plt.title('') 플롯의 타이틀을 작성

plt.plot([1, 2, 3], [3, 6, 9])
plt.plot([1, 2, 3], [2, 4, 9])
plt.title('Label 설정 예제입니다', fontsize=20)
# X축 & Y축 Label 설정
plt.xlabel('X축', fontsize=20)
plt.ylabel('Y축', fontsize=20)
  • plt.xlable(), plt.ylable() 플롯의 x축, y축의 label을 설정

# 범례(Legend) 설정
plt.plot(np.arange(10), np.arange(10)*2)
plt.plot(np.arange(10), np.arange(10)**2)
plt.plot(np.arange(10), np.log(np.arange(10)))

# 타이틀 & font 설정
plt.title('범례 설정 예제입니다', fontsize=20)

# X축 & Y축 Label 설정
plt.xlabel('X축', fontsize=20)
plt.ylabel('Y축', fontsize=20)

# X tick, Y tick 설정
plt.xticks(rotation=90)
plt.yticks(rotation=30)

# legend 설정
plt.legend(['10 * 2', '10 ** 2', 'log'], fontsize=15)

plt.show()
  • plt.xticks(rotation=) plt.yticks() 플롯의 x축, y축에 눈금을 그어줍니다
  • plt.legend([‘’,’’,...], fontsize=) 각 플롯에 대해서 범례를 설정합니다

# X와 Y의 한계점(Limit) 설정: xlim(), ylim()

plt.plot(np.arange(10), np.arange(10)*2)
plt.plot(np.arange(10), np.arange(10)**2)
plt.plot(np.arange(10), np.log(np.arange(10)))

# 타이틀 & font 설정
plt.title('이것은 타이틀 입니다', fontsize=20)

# X축 & Y축 Label 설정
plt.xlabel('X축', fontsize=20)
plt.ylabel('Y축', fontsize=20)

# X tick, Y tick 설정
plt.xticks(rotation=90)
plt.yticks(rotation=30)

# legend 설정
plt.legend(['10 * 2', '10 ** 2', 'log'], fontsize=15)

# x, y limit 설정
plt.xlim(0, 5)
plt.ylim(0.5, 10)

plt.show()
  • plt.xlim(), plt.ylim() 플롯의 X축, Y축의 끝값들을 설정해줍니다
  • plt.xlim(0, 5), plt.ylim(0.5, 10) 로 설정하였기 때문에
    x축은 0부터 5까지 y축은 0부터 10까지만 출력됩니다.

# 마커(marker)
# '.': point marker
# 'o': circle marker
# 'v': triangle_down marker
# '+': plus marker
# '*': star marker

# 라인(line)
# '-': solid line style
# '--': dashed line style
# '-.': dash-dot line style
# ':': dotted line style

# 컬러(color)
# 'b': blue
# 'g': green
# 'r': red
# 'c': cyan
# 'm': magenta
# 'y': yellow
# 'k': black
# 'w': white
# alpha를 통해 투명도를 조절할 수 있습니다.
plt.plot(np.arange(10), np.arange(10)*2, marker='o', linestyle='-',
color='b', alpha=.1)
plt.plot(np.arange(10), np.arange(10)*2 - 10, marker='v', linestyle='--',
color='c', alpha=.3)
plt.plot(np.arange(10), np.arange(10)*2 - 20, marker='+', linestyle='-.',
color='y', alpha=.8)
plt.plot(np.arange(10), np.arange(10)*2 - 30, marker='*', linestyle=':',
color='r', alpha=1.)
# 타이틀 & font 설정
plt.title('색상 설정 예제', fontsize=20)
# X축 & Y축 Label 설정
plt.xlabel('X축', fontsize=20)
plt.ylabel('Y축', fontsize=20)
# X tick, Y tick 설정
plt.xticks(rotation=90)
plt.yticks(rotation=30)
plt.show()
  • 선형 그래프나 산점도의 경우 marker나 markersize, linestyle, color, alpha
    등을 설정해 각각 점 모양, 점 크기, 선 모양, 색깔,투명도 등을 조절할 수 있다

matplotilb - 산점도(scatter plot)

# Scatterplot: plt.scatter()
# x, y 좌표로 이뤄진 데이터들을 점으로 표현하는 plot입니다.

# s는 점의 넓이를 나타냅니다. 값이 커지면 당연히 넓이도 커집니다.

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()
  • plt.scatter(s=, c=) x, y 좌표로 이뤄진 데이터들을 점으로 표현하는 플롯
  • s는 점 크기,c는 점 색깔을 조절

matplotilb - Barplot, Barhplot

# 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()
  • plt.bar() 범주가 있는 데이터 값을 직사각형 막대로 표현하는 그래프
  • width, align 등의 옵션으로 막대의 위치를 조정
  • color, alpha 옵션을 이용해 각 막대의 색깔 조정

# 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()

# Barplot에서 비교 그래프 그리기

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()
  • plt.subplots()plt.barplt.barh를 함께 사용하면 비교 그래프를 그릴 수 있음

matplotilb - histogram

N = 100000
bins = 30
x = np.random.randn(N)
plt.hist(x, bins=bins)
plt.show()
  • plt.hist() 히스토그램은 도수분포표를 그래프로 나타낸 것
  • 가로축은 변수 값, 세로축은 빈도나 비율
  • bins 옵션을 통해 히스토그램의 막대 개수를 조절 가능
  • density=True인 경우에는 frequency 대신 density를 y축에 출력

matplotilb - Pie chart

# Piechart
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() 파이 차트는 범주별 구성 비율을 원형으로 표현한 그래프
    부채꼴의 중심각을 구성 비율에 비례하도록 표현
  • explode 파이에서 툭 튀어져 나온 비율
  • autopct 퍼센트 자동으로 표기 → '%.1f%%' 소수점 1자리까지 표기
  • shadow 그림자 표시
  • startangle 파이를 그리기 시작할 각도
  • texts, autotexts인자를 리턴 → texts는 label에 대한 텍스트 효과를, autotexts는 파이 위에
    그려지는 텍스트 효과를다룰 때 활용

matplotilb - Heatmap

# 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() 히트맵은 다양한 값을 갖는 숫자데이터를 열분포 형태와 같이
    색상을 이용해서 시각화한 것
  • 지도 이미지위에 인구의 분포와 같은 2차원 형태로 표현되는 데이터의 빈도 분포에 적합

matplotilb - Colormaps

# Colormaps

import matplotlib.pyplot as plt
import numpy as np

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.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.pyplot 모듈은 컬러맵을 간편하게 설정하기 위한 여러 함수를 제공
  • plt.plasma(), plt.jet()와 같은 함수를 이용해서 플롯에서 사용되는 색깔들을 다양하게 만들 수 있음

matplotilb - 다양한 함수

  • plt.text(x위치, y위치, 텍스트, fontdict)

    • 그래프의 적절한 위치에 텍스트를 삽입
  • plt.style.use()

    • 미리 만들어놓은 Matplotlib 그래프 스타일을 사용
    • 기본 스타일로 돌아가려면 plt.style.use(‘default’)
    • plt.style.available 을 통해 사용 가능한 스타일 조회

matplotilb - Subplots

# Subplots: 여러개의 plot을 그리는 방법

import matplotlib.pyplot as plt

# plt.subplots(행의 갯수, 열의 갯수)

# 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()
  • plt.subplots(행 개수, 열 개수) 하나의 화면 안에 여러 플롯을 넣을 수 있음
  • fig, axesplt.subplots()의 인자로 넣은 후 axex[행,열].plot명령어 를 입력해
    각 subplot에 원하는 플롯을 넣을 수 있음

matplotilb - 이중 y축 표시하기

# 이중 y축 표시하기
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('default')
plt.rcParams['figure.figsize'] = (8, 6)
plt.rcParams['font.size'] = 14

x = np.arange(0, 3)
y1 = x + 1
y2 = -x - 1

fig, ax1 = plt.subplots()
ax1.set_xlabel('X-Axis')
ax1.set_ylabel('1st Y-Axis')
line1 = ax1.plot(x, y1, color='green', label='1st Data')

ax2 = ax1.twinx() # twinx 사용
ax2.set_ylabel('2nd Y-Axis')
line2 = ax2.plot(x, y2, color='deeppink', label='2nd Data')

lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper right')
plt.show()
  • 두 종류의 데이터를 동시에 하나의 그래프에 표현하기 위해 사용
  • ax1.twinx()를 이용하여 ax1과 x축을 공유하는 새로운 axes 객체인 ax2 생성

matplotilb - Boxplot

# 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))
# 기본 박스플롯 생성
box = plt.boxplot(data, notch=True)
plt.tight_layout()
plt.show()
  • plt.boxplot() 수치 데이터의 분포를 표현
  • Maximum / minimum value Q1, Q3로부터 1.5*IQR 내에서 최대/최소값
  • notch=True 중앙값 (Median)의 95% 신뢰 구간을 노치 형태로 표시합니다

matplotilb - Violin plot

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()
  • plt.violinplot() boxplot에 ked 곡선을 같이 그린 형태
  • 더 세밀한 분포 확인 가능
  • quantiles 옵션을 이용해 표시할 분위수 조절

seaborn

  • matplotlib을 기반으로 하며 pandas 데이터 구조와 밀접하게 통합
  • Pandas DataFrame과 직관적으로 연계되어 쉽고 빠르게 데이터 시각화 가능
  • seaborn에서는 3가지 종류의 플룻군 사용가능

  1. Relplot : 2개 이상의 변수간의 관계를 효과적으로 나타내는 플롯
  2. Displot : 1개 이상의 변수 값의 분포를 효과적으로 나타내는 플롯
  3. Catplot : 범주형 데이터의 분포를 효과적으로 나타내는 플롯

Relplot - scatter plot

tips = sns.load_dataset("tips")

# scatter plot

# 두개의 연속형 변수 total_bill과 tip간의 관계를 scatter plot으로 표현할수 있습니다

sns.relplot(data=tips, x="total_bill", y="tip")
sns.scatterplot(data=tips, x="total_bill", y="tip")

sns.relplot(
    data=tips,
    x="total_bill", y="tip", hue="smoker", style="time",size="size"
)
  • 크게 hue, size, style을 통해서 데이터포인트가 가지는 categorical 변수값을 표현할 수 있음

Relplot - line plot

dowjones = sns.load_dataset("dowjones")

sns.relplot(data=dowjones, x="Date", y="Price", kind="line")
sns.lineplot(data=dowjones, x="Date", y="Price")
  • 시간과 같이 지속성을 가진 변수과 다른 변수의 관계를 나타낼 때는 lineplot이 효과적입니다
fmri = sns.load_dataset("fmri")

sns.lineplot(data=fmri, x="timepoint", y="signal")
  • x축 값 하나에 따른 y값이 하나가 아닌 다양한 값을 갖고 있을 경우
  • lineplot 을 사용
  • 여러 값들을 모아서 평균을 선으로, 95% 신뢰구간을 색으로 표현

💡 CI를 표시하지 않으려면 errorbar=None으로

표준편차의 범위로 표시하고싶으면 errorbar='sd'로 옵션 표시

sns.relplot(data=fmri, kind="line",x="timepoint", y="signal", errorbar=None,)

sns.relplot(
 data=dots, kind="line",
 x="time", y="firing_rate",
 hue="coherence", style="choice",
)
  • hue 통해서 연속형 변수 또한 구분하여 lineplot을 그릴 수 있음

Relplot - facet

  • 변수가 많아질수록 한 플롯 안에서 표현하다 보면 가시성이 떨어지고 효과적인 분석이 어려워짐
  • facet 를 사용하여 여러 플롯으로 나눠 분석을 하는 것이 효과적임
  • col, row를 호할용해 플롯들을 나누고 height을 통해 플롯의 크기를 조절
sns.relplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips)

sns.relplot(x="timepoint", y="signal", hue="subject",
            col="region", row="event", height=3.5,
            kind="line", estimator=None, data=fmri)

Displot - histogram

  • 변수 하나 혹은 두개의 분포를 나타날 때 사용
  • 기본적으로 histogram
penguins = sns.load_dataset("penguins")

sns.histplot(penguins, x="flipper_length_mm")
sns.displot(penguins, x="flipper_length_mm")
  • 막대 너비는 binwidth , bins 를 사용해 조절
  • 변수가 이산형 변수인 경우 discrete=True 옵션을 통해 x축 값 중앙에 막대가 오도록 조절
  • shrink 옵션을 통해 막대 간 공간 조절 가능

# histogram의 막대 너비는 binwidth 혹은 bins를 사용해 조절해줄 수 있습니다
sns.displot(penguins, x="flipper_length_mm", bins=20)

# 변수가 이산형 변수인 경우, discrete=True 옵션을 통해 
#x축 값 중앙에 막대가 위치하도록 할 수 있습니다
sns.displot(tips, x="size", discrete=True)

# 또한, shrink 옵션을 통해 막대 간 공간 조절이 가능합니다
sns.displot(tips, x="size", discrete=True, shrink=.7)
sns.displot(penguins, x="flipper_length_mm", hue="species", element="step")
  • hue 옵션을 통해 추가 변수를 조건으로 한 분포를 시각화
  • 막대 간 겹쳐지는 부분의 경우 element=step 옵션을 사용하거나 multiple={stack, dodge} 옵션을 사용 가능

sns.displot(penguins, x="flipper_length_mm", col="sex")
  • distplot 또한 col이나 row를 이용해 변수에 따른 여러 플롯으로 나눌 수 있음

sns.displot(penguins, x="flipper_length_mm", hue="species", stat="probability")
  • stats='probability' 옵션을 통해 모든 막대의 높이의 합이 1이 되게 만들 수 있으며
  • 를 빈도의 비율값으로 해석할 수 있음

Displot - kdeplot

sns.kdeplot(penguins, x="flipper_length_mm")
  • kde plot을 이용해 histogram과 다른 부드러운 곡선으로 이어진 분포 시각화가 가능
sns.displot(penguins, x="flipper_length_mm", kind="kde", bw_adjust=.25)
  • bw_adjust를 이용해 곡선을 세밀하게 혹은 더 부드럽게 표현이 가능

sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde")
  • hue를 이용해서 변수간 분포를 더 세밀하게 시각화 가능

# 또한, fill=True 옵션을 이용해 곡선 아래 색칠된 형태로 표현이 가능합니다
sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde", fill=True)

Displot - heatmap / contour

sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm")
  • hue 옵션을 사용하는 대신, y에 2번째 변수를 넣어 여러 변수의 분포를 표현하는 시각화 또한 가능
  • 기본적으로 displot은 heatmap을 출력

sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", kind="kde")

sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", kind="kde", 
thresh=.2, levels=4)
  • kde plot에서 y 변수를 추가해주면 등고선 플롯을 출력
  • thresh와 levels를 이용해 선의 간격을 조절

sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")
  • joint plot의 경우 2개의 변수 간 분포와 각 변수의 분포를 동시에 출력

sns.pairplot(penguins)
  • Pair plot을 이용해 각 변수들간의 pairwise 관계를 시각화할 수 있음

Catplot - strip plot

sns.catplot(data=tips, x="day", y="total_bill")
  • catplot의 기본 플롯은 strip plot
  • 한쪽 변수가 categorical 데이터인 산점도
  • 한 범주에 속하는 모든 점이 범주형 변수에 해당하는 축을 따라 동일한 위치에 있게 된다

Catplot - swarm plot

sns.catplot(data=tips, x="day", y="total_bill", kind="swarm")
  • swarm plot을 활용하면 점들의 중첩을 방지하는 알고리즘을 사용하여 시각화가 가능
  • 상대적으로 데이터 수가 적은 경우에만 잘 작동하지만 관측치 분포를 더 잘 표현할 수 있다

Catplot - strip plot

sns.catplot(data=tips.loc[tips['size']!=3], x="size", 
y="total_bill")
sns.catplot(data=tips.loc[tips['size']!=3], x="size", 
y="total_bill", native_scale=True)
  • 기본순서 설정 가능
  • native_scale 을 사용하면 x축 데이터의 분포를 보존할 수 있음
  • order 옵션을 사용해서 Categorical 변수의 순서를 바꿀 수 있음

Catplot - boxplot

sns.catplot(data=tips, x="day", y="total_bill", kind="box")
  • 데이터 세트의 크기가 커짐에 따라 범주형 산점도는 각 범주 내의 값 분포에 대해 제공할 수 있는 정보가 제한
  • 이 때 boxplot 사용

Catplot - violinplot

sns.violinplot(
    data=tips, x="total_bill", y="day", hue="sex",
)
sns.catplot(
    data=tips, x="total_bill", y="day", hue="sex", kind="violin",
)
  • violin plot은 box plot과 kde 곡선을 결합한 형태
  • Boxplot에서 쓰인 IQR과 whisker또한 표현가능

💡 box plot이나 violin plot을 swarm plot과 결합하는 것도 가능

Catplot - barplot

sns.catplot(data=titanic, x="sex", y="survived", hue="class", kind="bar")
  • catplot을 통해서도 barplot을 그릴 수 있음

Catplot - Pointplot

sns.catplot(data=titanic, x="sex", y="survived", hue="class", kind="point")
  • Categorical 변수에 따라 다른 변수가 어떻게 변화하는지를 효과적으로 나타낼 수 있음

profile
가장 예쁜 꽃은 우여곡절 끝에 피는 꽃

0개의 댓글