티스토리 뷰

스터디 plot

Plot

R 언어에서 표현한 시각화 함수 Plot을 파이썬 언어로 고쳐보자.

Step0. Plot을 구성하기 위한 Data 만들기

In [2]:
import numpy as np

from sklearn.datasets import load_iris

iris = load_iris()
In [3]:
dir(iris)
Out[3]:
['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']
In [5]:
iris.feature_names
Out[5]:
['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']
In [6]:
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을 이용하면 점들을 선으로 연결해놓은 형태로 표현이 된다.

In [8]:
import matplotlib.pyplot as plt

plt.plot(sepal_length)
Out[8]:
[<matplotlib.lines.Line2D at 0x28af32ed0b8>]

step2. 점을 찍어보자

기본 plot 함수는 점을 선으로 연결시켜놓은 형태인데, 점으로만 시각화 해보자.

In [9]:
plt.plot(sepal_length, 'o')
Out[9]:
[<matplotlib.lines.Line2D at 0x28af3386978>]

색 속성 g(green)과 네모모양을 나타내는 D를 이용해 초록색 네모점을 찍어보자.

In [10]:
plt.plot(sepal_length, 'gD')
Out[10]:
[<matplotlib.lines.Line2D at 0x28af3031eb8>]

점과 선으로 같이 표현해보자. '-'는 실선, ':'는 점선을 나타낸다. r은 red, ^는 세모를 나타낸다.

In [15]:
plt.plot(sepal_length, 'r^-')
Out[15]:
[<matplotlib.lines.Line2D at 0x28af45b76a0>]

Step3. 점의 크기와 직선의 두께를 조절해보자.

markersize를 이용해 점의 크기를 조절할 수 있다.

In [22]:
plt.plot(sepal_length, 'o', markersize=10)
Out[22]:
[<matplotlib.lines.Line2D at 0x28af48370b8>]

linewidth라는 조건을 주면 직선의 두께를 조절할 수 있다.

In [19]:
plt.plot(sepal_length, linewidth=3)
Out[19]:
[<matplotlib.lines.Line2D at 0x28af474fda0>]

Step4. X, Y 축에 제목을 넣어보자.

말 그대로 X, Y축에 제목을 지어 주는 것이다. 이를 설정 해주어서 표현하면 그래프에 직관성을 더 해줄수 있다.
가로 축에는 plt.xlabel, 세로 축에는 plt.ylabel를 이용하면 된다.

In [49]:
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)

plt.xlabel('index')
plt.ylabel('sepal_length')
Out[49]:
Text(0, 0.5, 'sepal_length')

Step5. 그래프에 제목을 넣어보자.

이번에는 그래프를 대표하는 제목을 넣어 보도록 하자.
plt.title을 이용하면 되고, fontsize를 이용해 글씨크기를 바꿀수 있다.

In [50]:
plt.plot(sepal_length, 'o-', linewidth = 1, markersize = 4)

plt.xlabel('index')
plt.ylabel('sepal_length')

plt.title('Iris - sepal_length', fontsize=20)
Out[50]:
Text(0.5, 1.0, 'Iris - sepal_length')

Step6. 선을 추가해보자.

그래프에 선을 하나 추가 해보자. plt.hlines와 plt.vlines를 이용해 가로와 세로선을 추가할 수 있다.
좌표라던지 추세선을 그릴때 이용하면 유용하다.

In [57]:
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까지 긋겠다.
Out[57]:
<matplotlib.collections.LineCollection at 0x28af7670a90>

Step7. 선을 추가 해보자. (1차함수)

방법1

이번에는 1차 함수를 사용해 볼 것이다.
plot 함수에 두 점 (0,4)와 (150,8)을 연결해 직선을 그려보자.

In [58]:
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])
Out[58]:
[<matplotlib.lines.Line2D at 0x28af76e06d8>]

방법2

x에 범위 y에 함수를 입력하여 직선을 그릴수도 있다.
y에 2차 3차 4차 함수를 입력하면 각각의 함수들이 그려진다.

In [81]:
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)
Out[81]:
[<matplotlib.lines.Line2D at 0x28af77cecc0>]

Step8. 선을 추가 해보자. (회귀식 사용)

x축과 y축에 각각 sepal_length와 petal_length를 입력하여 그래프를 그리고, 점들에 가장 근접하는 직선의 기울기와 y절편을 구해 회귀그래프를 그려보자.

우선 회귀식을 이용해 기울기와 y절편을 구해본다.

In [100]:
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)
score = 0.7599546457725149
w = 1.8584329782548412
b = -7.101443369602455

구한 기울기(w)와 y절편(b)를 이용해 노란색(y)직선을 x=4부터 x=8까지 두께(lw=5), 투명도(alpha=0.5)로 그린다.

In [103]:
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)
Out[103]:
[<matplotlib.lines.Line2D at 0x28af8ad8cc0>]

Step9. 여러개의 그래프를 한 화면에 그려보자.

방법1

세로 2개 가로 2개 판을 만들자. 각 판의 비율을 가로:세로 = 10 : 8

In [107]:
(fig, axes) = plt.subplots(2,2, figsize=[10,8])

display(axes.shape)
(2, 2)

각 판의 좌표를 이용해, 아이리스 각 속성들의 그래프와 타이틀을 각각 넣어주자.

In [110]:
(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, 2)
Out[110]:
Text(0.5, 1.0, 'petal_width')

방법2

하나씩 판을 만들면서 그래프를 바로바로 넣어준다.

In [111]:
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)
Out[111]:
[<matplotlib.lines.Line2D at 0x28af9ba1ac8>]

Step10. 그래프 겹쳐 그리기

레전드

두 그래프를 겹쳐서 표현해보자.
같이 표현되면 헷갈리므로 레전드를 이용해 각 그래프의 라벨을 출력하자.

In [118]:
plt.plot(sepal_length,'ro', label = 'SL')
plt.plot(petal_length,'bo', label = 'PL')

plt.legend(loc = 'lower right')
Out[118]:
<matplotlib.legend.Legend at 0x28af91adb70>

구간 나누기

두 종류의 히스토 그램을 한 개의 좌표평면에 그려보자.

In [124]:
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개로 쪼개보았다.)

In [125]:
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을 이용해 그래프 축의 범위도 바꿔줄 수 있다.

In [126]:
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를 이용해 그림의 크기도 지정할 수 있다.

In [128]:
plt.hist(np.random.randn(1000))

plt.savefig('Histogram.jpg',dpi=100)

그림을 다시 불러와보자.

In [129]:
import matplotlib.image as mpimg

img = mpimg.imread('Histogram.jpg')
plt.imshow(img)
plt.axis('off') # 저장한것과 새로운 그래프간에 좌표축이 겹쳐보여 새로운 그래프의 좌표축을 지움
Out[129]:
(-0.5, 599.5, 399.5, -0.5)
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함