티스토리 뷰
Plot¶
R 언어에서 표현한 시각화 함수 Plot을 파이썬 언어로 고쳐보자.
Step0. Plot을 구성하기 위한 Data 만들기¶
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
dir(iris)
iris.feature_names
sepal_length = iris.data[:,0]
sepal_width = iris.data[:,1]
petal_length = iris.data[:,2]
petal_width = iris.data[:,3]
step1. 기본적인 Plot 함수¶
R의 기본 Plot 함수는 'o'와 같이 안에가 비어있는 점의 형태로 표현되는데 반해, 파이썬 기본함수 Plot을 이용하면 점들을 선으로 연결해놓은 형태로 표현이 된다.
import matplotlib.pyplot as plt
plt.plot(sepal_length)
step2. 점을 찍어보자¶
기본 plot 함수는 점을 선으로 연결시켜놓은 형태인데, 점으로만 시각화 해보자.
plt.plot(sepal_length, 'o')
색 속성 g(green)과 네모모양을 나타내는 D를 이용해 초록색 네모점을 찍어보자.
plt.plot(sepal_length, 'gD')
점과 선으로 같이 표현해보자. '-'는 실선, ':'는 점선을 나타낸다. r은 red, ^는 세모를 나타낸다.
plt.plot(sepal_length, 'r^-')
Step3. 점의 크기와 직선의 두께를 조절해보자.¶
markersize를 이용해 점의 크기를 조절할 수 있다.
plt.plot(sepal_length, 'o', markersize=10)
linewidth라는 조건을 주면 직선의 두께를 조절할 수 있다.
plt.plot(sepal_length, linewidth=3)
Step4. X, Y 축에 제목을 넣어보자.¶
말 그대로 X, Y축에 제목을 지어 주는 것이다. 이를 설정 해주어서 표현하면 그래프에 직관성을 더 해줄수 있다.
가로 축에는 plt.xlabel, 세로 축에는 plt.ylabel를 이용하면 된다.
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)
plt.xlabel('index')
plt.ylabel('sepal_length')
Step5. 그래프에 제목을 넣어보자.¶
이번에는 그래프를 대표하는 제목을 넣어 보도록 하자.
plt.title을 이용하면 되고, fontsize를 이용해 글씨크기를 바꿀수 있다.
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)
plt.xlabel('index')
plt.ylabel('sepal_length')
plt.title('Iris - sepal_length', fontsize=20)
Step6. 선을 추가해보자.¶
그래프에 선을 하나 추가 해보자.
plt.hlines와 plt.vlines를 이용해 가로와 세로선을 추가할 수 있다.
좌표라던지 추세선을 그릴때 이용하면 유용하다.
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)
plt.xlabel('index')
plt.ylabel('sepal_length')
plt.title('Iris - sepal_length', fontsize=20)
plt.hlines([5.5],0,150, color='r') # y=5.5 직선을 x=0 부터 x=150까지 긋겠다.
plt.vlines([50,100],4,8, linestyle=':') # x=50,100 두 직선을 y=4부터 y=8까지 긋겠다.
Step7. 선을 추가 해보자. (1차함수)¶
방법1¶
이번에는 1차 함수를 사용해 볼 것이다.
plot 함수에 두 점 (0,4)와 (150,8)을 연결해 직선을 그려보자.
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)
plt.xlabel('index')
plt.ylabel('sepal_length')
plt.title('Iris - sepal_length', fontsize=20)
plt.vlines([50,100],4,8, linestyle=':')
plt.plot([0,150],[4,8])
방법2¶
x에 범위 y에 함수를 입력하여 직선을 그릴수도 있다.
y에 2차 3차 4차 함수를 입력하면 각각의 함수들이 그려진다.
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)
plt.xlabel('index')
plt.ylabel('sepal_length')
plt.title('Iris - sepal_length', fontsize=20)
plt.vlines([50,100],4,8, linestyle=':')
x = np.arange(0,150,0.01)
y = 0.025 * x + 4
plt.plot(x,y)
Step8. 선을 추가 해보자. (회귀식 사용)¶
x축과 y축에 각각 sepal_length와 petal_length를 입력하여 그래프를 그리고, 점들에 가장 근접하는 직선의 기울기와 y절편을 구해 회귀그래프를 그려보자.
우선 회귀식을 이용해 기울기와 y절편을 구해본다.
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(sepal_length.reshape(150,1), petal_length)
w = model.coef_[0]
b = model.intercept_
print('score =', model.score(sepal_length.reshape(150,1), petal_length))
print('w =', w)
print('b =', b)
구한 기울기(w)와 y절편(b)를 이용해 노란색(y)직선을 x=4부터 x=8까지 두께(lw=5), 투명도(alpha=0.5)로 그린다.
plt.plot(sepal_length, petal_length, 'o')
# plt.scatter(sepal_length, petal_length)를 그려도 동일한 그래프가 나온다.(산점도)
plt.xlabel('petal_length')
plt.ylabel('sepal_length')
plt.title('Linear Regression\npetal_length vs sepal_length', fontsize=15)
plt.plot([4,8],[4*w+b,8*w+b],'y',lw=5,alpha=0.5)
Step9. 여러개의 그래프를 한 화면에 그려보자.¶
방법1¶
세로 2개 가로 2개 판을 만들자. 각 판의 비율을 가로:세로 = 10 : 8
(fig, axes) = plt.subplots(2,2, figsize=[10,8])
display(axes.shape)
각 판의 좌표를 이용해, 아이리스 각 속성들의 그래프와 타이틀을 각각 넣어주자.
(fig, axes) = plt.subplots(2,2, figsize=[10,8])
display(axes.shape)
axes[0,0].plot(sepal_length)
axes[0,1].plot(sepal_width)
axes[1,0].plot(petal_length)
axes[1,1].plot(petal_width)
fig.suptitle('Iris', fontsize=20)
axes[0,0].set_title('sepal_length')
axes[0,1].set_title('sepal_width')
axes[1,0].set_title('petal_length')
axes[1,1].set_title('petal_width')
방법2¶
하나씩 판을 만들면서 그래프를 바로바로 넣어준다.
fig = plt.figure(figsize=[10,8])
fig.suptitle('Iris', fontsize=20)
plt.subplot(2,2,1)
plt.title('sepal_length')
plt.plot(sepal_length)
plt.subplot(2,2,2)
plt.title('sepal_width')
plt.plot(sepal_width)
plt.subplot(2,2,3)
plt.title('petal_length')
plt.plot(petal_length)
plt.subplot(2,2,4)
plt.title('petal_width')
plt.plot(petal_width)
Step10. 그래프 겹쳐 그리기¶
레전드¶
두 그래프를 겹쳐서 표현해보자.
같이 표현되면 헷갈리므로 레전드를 이용해 각 그래프의 라벨을 출력하자.
plt.plot(sepal_length,'ro', label = 'SL')
plt.plot(petal_length,'bo', label = 'PL')
plt.legend(loc = 'lower right')
구간 나누기¶
두 종류의 히스토 그램을 한 개의 좌표평면에 그려보자.
a = np.random.randn(1000)
b = np.random.normal(10,5,size=1000)
plt.hist(a, alpha=0.3)
plt.hist(b, alpha=0.3)
print('')
뭔가 이상하다. 히스토 그램의 인덱스의 범위가 다르기 때문에 두 히스토 그램의 막대의 가로 길이가 다르게 설정되어 있는데, 두 히스토그램의 구간을 하나로 통일시켜 쪼개보자.(50개로 쪼개보았다.)
a = np.random.randn(1000)
b = np.random.normal(10,5,size=1000)
_, c = np.histogram(np.r_[a,b], 50)
plt.hist(a, bins=c, alpha=0.3)
plt.hist(b, bins=c, alpha=0.3)
print('')
또 plt.xlim과 plt.ylim을 이용해 그래프 축의 범위도 바꿔줄 수 있다.
a = np.random.randn(1000)
b = np.random.normal(10,5,size=1000)
_, c = np.histogram(np.r_[a,b], 50)
plt.hist(a, bins=c, alpha=0.3)
plt.hist(b, bins=c, alpha=0.3)
plt.xlim(-10,40)
plt.ylim(0,300)
print('')
Step11. 그래프를 코드를 이용해 자동으로 저장 되도록 해보자.¶
plt.savefig를 이용해 그래프를 저장해보자. dpi를 이용해 그림의 크기도 지정할 수 있다.
plt.hist(np.random.randn(1000))
plt.savefig('Histogram.jpg',dpi=100)
그림을 다시 불러와보자.
import matplotlib.image as mpimg
img = mpimg.imread('Histogram.jpg')
plt.imshow(img)
plt.axis('off') # 저장한것과 새로운 그래프간에 좌표축이 겹쳐보여 새로운 그래프의 좌표축을 지움
'beginner > 데이터 분석 스터디' 카테고리의 다른 글
[서울시 먹거리 분석 – 4] 전체 판매업종 이용 통화량 분석 (0) | 2019.04.02 |
---|---|
[서울시 먹거리 분석 – 3] 1월 중국집 판매업종 이용 통화량 분석 (0) | 2019.03.25 |
[서울시 먹거리 분석 – 2] 1월 치킨 판매업종 이용 통화량 분석_2 (0) | 2019.03.17 |
[서울시 먹거리 분석] - 1월 치킨 판매업종 이용 통화량 분석 (0) | 2019.02.27 |