[matplotlib] 데이터 시각화 1

Pygmalion Dali·2023년 10월 5일
0

matplotlib

목록 보기
2/3
import matplotlib.pyplot as plt
import numpy as np

#난수를 예측 가능하도록 만드는 함수 seed
np.random.seed(0)

n_data = 100
s_idx = 30

#연속값이 들어가는 넘파이의 배열
x_data = np.arange(s_idx, s_idx + n_data)
y_data = np.random.normal(0,1, (n_data))

fig, ax = plt.subplots(figsize= (10, 5))
ax.plot(x_data, y_data)

#pad -> 패딩값, 여백
fig.tight_layout(pad=3)

#30시작으로 131까지. 20 간격으로 값을 뽑겠다는 의미
x_ticks = np.arange(s_idx, s_idx + n_data + 1, 20)

#
ax.set_xticks(x_ticks)

ax.tick_params(labelsize=25)
ax.grid()

plt.show()
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

#array - numpy array로 만들어줌
x_data = np.array([10, 25, 31, 40, 55, 80, 100])

#scalar: (), 0차 tensor(shape)
#vector: (a, ),1차 tensor(shape)
#matrix: (a,b), 2차 tensor(shape)
#에러 방지를 위한 습관들이기

y_data = np.random.normal(0, 1, (7, ))

fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x_data, y_data)

fig.subplots_adjust(left=0.2)
ax.tick_params(labelsize=25)
#----

ax.set_xticks(x_data)

#ylim: y축의 양 끝값을 가져오는 것
ylim = ax.get_ylim()

print(ylim)
#ylim의 시작값(0)과 끝점(1)인 인덱스를 가져온 것
yticks = np.linspace(ylim[0], ylim[1], 8)
ax.set_yticks(yticks)

ax.grid()
plt.show()
import matplotlib.pyplot as plt
import numpy as np

#PI 값을 지정해주어 호출해주는 것
PI = np.pi

#linsapce: min / max
t= np.linspace(-4*PI, 4*PI, 300)
#사인 함수 호출
sin = np.sin(t)

#y = ax 그래프를 그려주는 것
linear = 0.1*t

fig, ax = plt.subplots(figsize=(14, 7))
ax.plot(t, sin)
#선 그래프
ax.plot(t, linear)

ax.set_ylim([-1.5, 1.5])

x_ticks = np.arange(-4*PI, 4*PI+0.1, PI)

#PI값을 써준것
#질문 및 복습
x_ticklabels = [str(i) + r'$\pi$'
                for i in range(-4,5)]

ax.set_xticks(x_ticks)
ax.set_xticklabels(x_ticklabels)

ax.tick_params(labelsize=20)
ax.grid()

plt.show()

삼각함수

import matplotlib.pyplot as plt
import numpy as np

PI = np.pi
t = np.linspace(-4*PI, 4*PI, 1000)
sin = np.sin(t)
cos = np.cos(t)
tan = np.tan(t)
#tan 그래프를 그릴 수 없기 때문에 만들어주는 함수

#트릭을 활용해 불완전한 tan 그래프를 완성시킨다
tan[:-1][np.diff(tan) < 0] = np.nan

#nrows: 행의 개수 #ncols: 열의 개수
# 3,1 짜리 행렬을 만들어주는 axes 생성
fig, axes = plt.subplots(3, 1,
                        figsize=(7, 10))
print(axes.shape)
axes[0].plot(t, sin)
axes[1].plot(t, cos)
axes[2].plot(t, tan)

fig.tight_layout()

#tan 그래프의 범위를 설정
axes[2].set_ylim([-5,5])

plt.show()
#np.diff: 차이를 계산해주는 함수
y[:-1][np.diff(y) < 0] = np.nan #not a number

[:-1]:불리안 인덱싱 하나의 값을 뺴주어서 개수를 맞춰준다

탄젠트

import matplotlib.pyplot as plt
import numpy as np

PI = np.pi
#reshape: shape를 바꿔준다. (1000, ) 에서 (1,1000)으로 바꿔줌
#질문해야 할듯?
t = np.linspace(-4*PI, 4*PI, 1000).reshape(1, -1)
sin = np.sin(t)
cos = np.cos(t)
tan = np.tan(t)

#각각의 데이터들을 차례대로 접근해 수정하기 위해 행렬의 형태로 바꿔주는 것
#(3,1000)짜리 행렬이 만들어지게 됨
#vertical stack: 수직방향으로 쌓아준다. cf) hstack: horizonal
data = np.vstack((sin, cos, tan))

#결과적으로 matrix의 행렬은 (3,1000)형태가 될듯
title_list = [r'$sin(t)$', r'$cos(t)$', r'$tan(t)$']
x_ticks = np.arange(-4*PI, 4*PI+PI, PI)
x_ticklabels = [str(i) + r'$\pi$' for i in range(-4,5)]
fig, axes = plt.subplots(3, 1,
                         figsize=(7, 10),
                         sharex=True)

for ax_idx, ax in enumerate(axes.flat):
    #flatten을 통해 vectorization을 해주는 것
    ax.plot(t.flatten(), data[ax_idx])
    ax.set_title(title_list[ax_idx],
                 fontsize=30)
    ax.tick_params(labelsize=20)
    ax.grid()
    if ax_idx == 2:
        ax.set_ylim([-3, 3])
fig.subplots_adjust(left=0.1, right=0.95,
                    bottom=0.05, top=0.95)
axes[-1].set_xticks(x_ticks)
axes[-1].set_xticklabels(x_ticklabels)
plt.show()

스크린샷 2023-10-04 오후 2.28.35.jpg

ax.axvline & ax.axhline

수평 점근선

import matplotlib.pyplot as plt
import numpy as np

#점근선 그려보기

fig, ax = plt.subplots(figsize=(7, 7))
ax.set_xlim([-5, 5])
ax.set_ylim([-5, 5])
ax.axvline(x=1,
           color='black',
           linewidth=1)

ax.axvline(x=1,
           ymax=0.8, ymin=0.2,
           color='black',
           linewidth=1)
plt.show()

수직 점근선

import matplotlib.pyplot as plt
import numpy as np

#점근선 그려보기

fig, ax = plt.subplots(figsize=(7, 7))
ax.set_xlim([-5, 5])
ax.set_ylim([-5, 5])
ax.axhline(x=1,
           color='black',
           linewidth=1)

ax.axhline(x=1,
           ymax=0.8, ymin=0.2,
           color='black',
           linewidth=1)
plt.show()
import matplotlib.pyplot as plt
import numpy as np

#점근선 그려보기

x = np.linspace(-4*np.pi, 4*np.pi, 200)
sin = np.sin(x)

fig, ax = plt.subplots(figsize=(10,5))
ax.plot(x, sin)

#ls: line style / lw:line width
ax.axhline(y=1, ls=':', lw=1, color='gray')
ax.axhline(y=-1, ls=':', lw=1, color='gray')

Basic Usage of Legend

legend 삽입하기

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

n_data = 100
random_noise1 = np.random.normal(0, 1, (n_data,))
random_noise2 = np.random.normal(1, 1, (n_data,))
random_noise3 = np.random.normal(2, 1, (n_data,))

fig, ax = plt.subplots(figsize=(10, 7))
ax.tick_params(labelsize=20)

#랜덤한 노이즈 값을 집어넣어줌
ax.plot(random_noise1,label='random noise1')
ax.plot(random_noise2,label='random noise2')
ax.plot(random_noise3,label='random noise3')

ax.legend(fontsize=20)

plt.show()

legend의 위치

스크린샷 2023-10-04 오후 3.20.03.jpg

# 위 내용과 같음""

#레전드 삽입을 통해 위치를 설정해줄 수 있음
ax.legend(fontsize=20, loc='upper right')

plt.show()

bbox to andchor Argument

스크린샷 2023-10-04 오후 3.24.05.jpg

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

n_data = 100
random_noise1 = np.random.normal(0, 1, (n_data,))
random_noise2 = np.random.normal(1, 1, (n_data,))
random_noise3 = np.random.normal(2, 1, (n_data,))

fig, ax = plt.subplots(figsize=(10, 7))
ax.tick_params(labelsize=20)

#랜덤한 노이즈 값을 집어넣어줌
ax.plot(random_noise1,label='random noise1')
ax.plot(random_noise2,label='random noise2')
ax.plot(random_noise3,label='random noise3')

#x를 기준으로 레전드를 찍어주는데 반해, bbox를 선언할 시 bbox가 중심이 됨
ax.legend(fontsize=20, bbox_to_anchor = (1, 0.5),
          loc='center left')

#그래프가 짤리지 않게 방지해주는 효과
fig.tight_layout()
plt.show()

bbox를 선언할 시. bbox 중심으로 선언해줄 수 있음

레전드 라벨링을 통한 데이터 삽입

import matplotlib.pyplot as plt
import numpy as np

PI = np.pi
t = np.linspace(-4*PI, 4*PI, 300)
sin = np.sin(t)

fig, ax = plt.subplots(figsize=(10,10))

for ax_idx in range(12):
    label_template = 'added by {}'
    print(label_template)
    print(label_template.format(ax_idx))
    ax.plot(t, sin+ax_idx,
            label=label_template.format(ax_idx))

ax.legend(fontsize=15,
          ncol=4,
          bbox_to_anchor=(0.5, -0.05),
          loc='upper center')

#그래프가 짤리지 않게 방지해주는 효과

fig.tight_layout()
plt.show()

아이리스 데이터 플롯

바이올린 플롯

스크린샷 2023-10-04 오후 4.07.06.jpg

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

fig, ax = plt.subplots(figsize=(7, 7))

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(5, 2, 200)
data3 = np.random.normal(13, 3, 300)

xticks = np.arange(3)

ax.violinplot([data1, data2, data3], positions=xticks)

ax.set_xticks(xticks)
ax.set_xticklabels(['setosa', 'versicolor', 'virginica'])
ax.set_xlabel('species', fontsize=15)
ax.set_xlabel('Values', fontsize=15)
#그래프가 짤리지 않게 방지해주는 효과

fig.tight_layout()
plt.show()

평균이 나타난 바이올린 플롯

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

fig, ax = plt.subplots(figsize=(7, 7))

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(5, 2, 200)
data3 = np.random.normal(13, 3, 300)

xticks = np.arange(3)

ax.violinplot([data1, data2, data3],
              showmeans=True,
              positions=xticks)

ax.set_xticks(xticks)
ax.set_xticklabels(['setosa', 'versicolor', 'virginica'])
ax.set_xlabel('species', fontsize=15)
ax.set_xlabel('Values', fontsize=15)
#그래프가 짤리지 않게 방지해주는 효과

fig.tight_layout()
plt.show()

사분위가 나타난 바이올린 플롯

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

fig, ax = plt.subplots(figsize=(7, 7))

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(5, 2, 200)
data3 = np.random.normal(13, 3, 300)

xticks = np.arange(3)

ax.violinplot([data1, data2, data3],
              showmeans=True,
              positions=xticks)

ax.set_xticks(xticks)
ax.set_xticklabels(['setosa', 'versicolor', 'virginica'])
ax.set_xlabel('species', fontsize=15)
ax.set_xlabel('Values', fontsize=15)
#그래프가 짤리지 않게 방지해주는 효과

fig.tight_layout()
plt.show()

색 입혀진 바이올린 플롯

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(5, 2, 200)
data3 = np.random.normal(13, 3, 300)

fig, ax = plt.subplots(figsize=(7, 7))

xticks = np.arange(3)

violin = ax.violinplot([data1, data2, data3], showmeans=True, positions=xticks)

ax.set_xticks(xticks)
ax.set_xticklabels(['setosa', 'versicolor', 'virginica'])
ax.set_xlabel('species', fontsize=15)
ax.set_xlabel('Values', fontsize=15)

violin['bodies'][0].set_facecolor('blue')
violin['bodies'][0].set_facecolor('red')
violin['bodies'][0].set_facecolor('green')

violin['cbars'].set_edgecolor('gray')
violin['cmaxes'].set_edgecolor('gray')
violin['cmins'].set_edgecolor('gray')
violin['cmeans'].set_edgecolor('gray')

fig.tight_layout()
plt.show()

아이리스 데이터를 통한 데이터 분석

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

#아이리스 로드하기
iris = load_iris()

#dir: 객체가 갖고 있는 attribute를 가져오는 것
#객체 : 데이터에 메소드가 작동하는 것

for attr in dir(iris):
    print(attr)

print(iris.target_names)

feature_names = iris.feature_names
n_feature = len(feature_names)
species = iris.target_names
n_species = len(species)

#행렬: 대문자 X ->
#타겟데이터: y: vector로 연산
iris_X, iris_y = iris.data, iris.target

0개의 댓글