PYTHON DATA 시각화 – MATPLOTLIB #1

Data 시각화 #1 (matplotlib)

matplotlib 를 사용하기 전에 notebook 에 그림을 그리도록 지시를 선언한다.

In [1]:
%matplotlib inline

1. matplotlib 의 구성요소

alt-text

matplotlib 는 두 개의 객체가 있다.

  1. Figure 객체
    • 최상위 객체
    • Figure 안에 모든 것이 그려질 컨테이너(container) 이다.
    • Figure 내에는 하나 이상의 Axes 객체가 포함된다.
  2. Axes
    • 객체의 도면이다.
    • x축, y축, 점, 선, 마커, 레이블, 범례, 기타 등 유용한 항목이 포함돼 있다.
    • axis와 다른 의미로 axis는 도면의 x또는 y축을 나타낸다.

2. 상태저장(stateful) 인터페이스를 사용한 시각화

  • stateful 인터페이스는 pyplot 모듈을 사용해 모든 호출을 사용한다.
  • 도면이 생성될 때마다 matplotlib이 현재 그림이나 현재 축을 찾아 변경한다.
In [2]:
import matplotlib.pyplot as plt
x = [-3,5,7]
y = [10,2,5]
fig = plt.figure(figsize=(15,3))
plt.plot(x,y)
plt.xlim(0,10)
plt.ylim(-3,8)
plt.xlabel('X Axis')
plt.ylabel('Y axis')
plt.title('Line Plot')
plt.suptitle('Figure Title', size=20, y=1.03)
fig.savefig('c13-fig1.png', dpi=300, bbox_inches='tight')

위 코드 처럼 상태 저장 인터페이스를 사용하면 모든 명령은 pyplot 모듈에서 호출되는 함수이다. 선 그림을 만들고 각 축에 레이블을 추가한다.

3. 객체지향 시각화

In [3]:
# 객체지향 접근 방식
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from IPython.core.display import display

fig = Figure(figsize=(15,3))
FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot(x,y)
ax.set_xlim(0,10)
ax.set_ylim(-3,8)
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_title('Line Plot')
fig.suptitle('Figure Title', size=20, y=1.03)
display(fig)
fig.savefig('c13-fig2.png', dpi=300, bbox_inches='tight')

4. 두가지 방법을 이용한 시각화

In [4]:
# 두가지 접근방식을 모두 사용
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(15,3))
ax.plot(x,y)
ax.set(xlim=(0,10), ylim=(-3,8), xlabel='X axis', ylabel='Y axis', title='Line Plot')
fig.suptitle('Figure Title',size=20, y=1.03)
fig.savefig('c13-fig3.png',dpi=300,bbox_inches='tight')

subplots 함수는 아이템이 두 개인 튜플 객체를 반환하는데, Figure 와 하나이상의 Axes 가 들어 있고 fig, ax 에 할당을 한다.

In [5]:
type(fig)
Out[5]:
matplotlib.figure.Figure
In [6]:
type(ax)
Out[6]:
matplotlib.axes._subplots.AxesSubplot

figure 의 크기를 확인한 후 figure 크기 변경

In [7]:
fig.get_size_inches()
Out[7]:
array([15.,  3.])
In [8]:
fig.set_size_inches(14,4)
fig.savefig('c13-step4.png', dpi=300)
fig
Out[8]:

Figure 와 Axes 구분하고 각각에 고유한 색을 부여 회색 음영을 나타내려면 0에서 1 사이의 소수가 포함된 문자열을 사용한다.

In [9]:
fig.set_facecolor('.7')
ax.set_facecolor('.5')
fig.savefig('c13-step7.png', dpi=300, facecolor='.7')
fig
Out[9]:

Axes 의 직계 자손 확인

Axes 의 도면의 자식을 확인을 해보면 4개의 spine 와 두 개의 axis 객체가 있다.

  • spins 는 데이터 경계를 나타내는 figure 와 경계를 이루는 4개의 물리적 선이다.
  • x, y axis 객체에는 눈금, 레이블, 전체 축의 레이블과 같은 더 많은 도식화 객체가 포함되어 있다.
In [10]:
ax_children = ax.get_children()
ax_children
Out[10]:
[<matplotlib.lines.Line2D at 0x7f9343912910>,
 <matplotlib.spines.Spine at 0x7f9344861110>,
 <matplotlib.spines.Spine at 0x7f9344861210>,
 <matplotlib.spines.Spine at 0x7f9344861310>,
 <matplotlib.spines.Spine at 0x7f9344861410>,
 <matplotlib.axis.XAxis at 0x7f9344861050>,
 <matplotlib.axis.YAxis at 0x7f9344861750>,
 Text(0.5, 1.0, 'Line Plot'),
 Text(0.0, 1.0, ''),
 Text(1.0, 1.0, ''),
 <matplotlib.patches.Rectangle at 0x7f93438fb110>]

spine 객체 다루기

spine 는 딕셔너리에 들어 있다.

In [11]:
spines = ax.spines
spines
Out[11]:
OrderedDict([('left', <matplotlib.spines.Spine at 0x7f9344861110>),
             ('right', <matplotlib.spines.Spine at 0x7f9344861210>),
             ('bottom', <matplotlib.spines.Spine at 0x7f9344861310>),
             ('top', <matplotlib.spines.Spine at 0x7f9344861410>)])

left spine 를 위치와 너비를 변경시키고, bottom spine 은 보이지 않게

In [12]:
spine_left = spines['left']
spine_left.set_position(('outward',-100))
spine_left.set_linewidth(5)
spine_bottom = spines['bottom']
spine_bottom.set_visible(False)
fig.savefig('c13-step10.png', dpi=300, facecolor='.7')
fig
Out[12]:

axis 객체 다루기

axis 는 xaxis 와 yaxis 속성을 사용해 접근할 수 있다.

xaxis grid 적용 xaxis grid 의 위치 조정 xaxis label text

ylabel 적용 yticks 위치 지정후 ytickslabels 적용 후 rotation

In [13]:
fig, ax = plt.subplots(figsize=(15,3))
fig.set_facecolor('.7')
ax.set_facecolor('.5')
spine_left = spines['left']
spine_left.set_position(('outward',-100))
spine_left.set_linewidth(5)
spine_bottom = spines['bottom']
spine_bottom.set_visible(False)
ax.xaxis.grid(True, which='major', linewidth=2, color='black', linestyle='--')
ax.xaxis.set_ticks([.2,.4,.55,.93])
ax.xaxis.set_label_text('X Axis', family='Verdana', fontsize=15)
ax.set_ylabel('Y Axis', family='Verdana', fontsize=20)
ax.set_yticks([.1, .9])
ax.set_yticklabels(['point 1', 'point9'], rotation=45)
fig.savefig('c13-step11.png',dpi=300, facecolor='.7')

하나의 도면에 여러개의 axes 를 그리기

In [14]:
fig, axs = plt.subplots(2,4)
fig.savefig('c13-1-works2.png',dpi=300)
In [15]:
axs
Out[15]:
array([[<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>],
       [<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>]],
      dtype=object)

답글 남기기

이메일 주소는 공개되지 않습니다.