작성자: admin 작성일시: 2016-11-03 18:34:32 조회수: 1491 다운로드: 44
카테고리: Python 태그목록:

matplotlib의 여러가지 플롯

matplotlib는 기본적인 라인 플롯 이외에도 다양한 챠트/플롯 유형을 지원한다.

matplotlib의 한글 적용

matplotlib에서 한글을 사용하려면 다음과 같이 한글 폰트를 적용해야 한다. 당연히 해당 폰트는 컴퓨터에 깔려 있어야 한다. 여기에서는 나눔고딕 폰트를 사용하였다.

또한 matplotlib 명령에서는 유니코드 문자열을 사용해야 한다.

In [2]:
mpl.rc('font', family='nanumgothic')

바 차트

x, y 데이터 중 하나가 카테고리 값인 경우에는 bar 명령과 barh 명령으로 바 차트(bar chart) 시각화를 할 수 있다. 가로 방향으로 바 차트를 그리려면 barh 명령을 사용한다.

자세한 내용은 다음 웹사이트를 참조한다.

바 차트 작성시 주의점은 첫번째 인수인 left 가 x축에서 바(bar)의 왼쪽 변의 위치를 나타낸다는 점이다. 바의 위치를 xtick 위치의 중앙으로 옮기려면 align='center' 인수를 지정해야 한다.

In [3]:
y = [2, 3, 1]
x = np.arange(len(y))
xlabel = [u'가', u'나', u'다']
plt.bar(x, y, align='center')
plt.xticks(x, xlabel)
plt.show()

xerr 인수나 yerr 인수를 지정하면 에러 바(error bar)를 추가할 수 있다.

In [4]:
people = (u'박근혜', u'정유라', u'정윤회', u'최순실', u'최태민')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
error = np.random.rand(len(people))

plt.barh(y_pos, performance, xerr=error, align='center', alpha=0.4)
plt.yticks(y_pos, people)
plt.xlabel(u'x 라벨');

두 개 이상의 바 차트를 한번에 그리는 경우도 있다.

In [5]:
n_groups = 5
means_men = (20, 35, 30, 35, 27)
std_men = (2, 3, 4, 1, 2)
means_women = (25, 32, 34, 20, 25)
std_women = (3, 5, 2, 3, 3)

fig, ax = plt.subplots()

index = np.arange(n_groups)
bar_width = 0.35

opacity = 0.4
error_config = {'ecolor': '0.3'}

rects1 = plt.bar(index, means_men, bar_width,
                 alpha=opacity,
                 color='b',
                 yerr=std_men,
                 error_kw=error_config,
                 label='Men')

rects2 = plt.bar(index + bar_width, means_women, bar_width,
                 alpha=opacity,
                 color='r',
                 yerr=std_women,
                 error_kw=error_config,
                 label='Women')

plt.xlabel('Group')
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(index + bar_width, ('A', 'B', 'C', 'D', 'E'))
plt.legend()

plt.tight_layout()

또는 bottom 인수로 바의 위치를 조정하여 겹친 바 차트(stacked bar chart)도 그릴 수 있다.

In [6]:
N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

p1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd)
p2 = plt.bar(ind, womenMeans, width, color='y',
             bottom=menMeans, yerr=womenStd)

plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind + width/2., ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
Out[6]:
<matplotlib.legend.Legend at 0x7fd310968c50>

연습 문제 1

여러분이 가진 데이터를 사용하여 bar plot을 그려보세요.

스템 플롯

바 차트와 유사하지만 폭(width)이 없는 스템 플롯(stem plot)도 있다. 주로 이산 확률 함수나 자기상관관계(auto-correlation)를 묘사할 때 사용된다.

In [7]:
x = np.linspace(0.1, 2*np.pi, 10)
markerline, stemlines, baseline = plt.stem(x, np.cos(x), '-.')
plt.setp(markerline, 'markerfacecolor', 'b')
plt.setp(baseline, 'color', 'r', 'linewidth', 2);

파이 차트

카테고리 별 값의 상대적인 비교를 해야 할 때는 pie 명령으로 파이 차트(pie chart)를 그릴 수 있다.

In [23]:
labels = u'개구리', u'돼지', u'개', u'통나무'
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal');

연습 문제 2

여러분이 가진 데이터를 사용하여 파이차트를 그려보세요

히스토그램

히스토그램을 그리기 위한 hist 명령도 제공한다. hist 명령은 bins 인수로 데이터 집계 구간을 받는다. 또한 반환값으로 데이터 집계 결과를 반환해주므로 이 결과를 다른 코드에서 사용할 수도 있다.

In [9]:
x = np.random.randn(5000)
arrays, bins, patches = plt.hist(x, bins=50, normed=True)
In [10]:
arrays
Out[10]:
array([ 0.00121241,  0.        ,  0.        ,  0.00121241,  0.        ,
        0.00121241,  0.        ,  0.        ,  0.00121241,  0.00606205,
        0.01091169,  0.01454892,  0.03031025,  0.04364676,  0.06183292,
        0.08729353,  0.09941763,  0.14670162,  0.15882573,  0.21702141,
        0.23884479,  0.2752171 ,  0.33462519,  0.35281134,  0.35766099,
        0.42555595,  0.39039606,  0.41100703,  0.39039606,  0.32007627,
        0.32007627,  0.28006674,  0.2400572 ,  0.21217177,  0.14670162,
        0.1200286 ,  0.10911691,  0.07880666,  0.06304533,  0.03515989,
        0.03152266,  0.01697374,  0.01333651,  0.00606205,  0.00363723,
        0.00242482,  0.00121241,  0.00121241,  0.00121241,  0.00121241])
In [11]:
bins
Out[11]:
array([-4.33895223, -4.17399155, -4.00903087, -3.84407019, -3.6791095 ,
       -3.51414882, -3.34918814, -3.18422746, -3.01926678, -2.8543061 ,
       -2.68934541, -2.52438473, -2.35942405, -2.19446337, -2.02950269,
       -1.864542  , -1.69958132, -1.53462064, -1.36965996, -1.20469928,
       -1.0397386 , -0.87477791, -0.70981723, -0.54485655, -0.37989587,
       -0.21493519, -0.04997451,  0.11498618,  0.27994686,  0.44490754,
        0.60986822,  0.7748289 ,  0.93978959,  1.10475027,  1.26971095,
        1.43467163,  1.59963231,  1.76459299,  1.92955368,  2.09451436,
        2.25947504,  2.42443572,  2.5893964 ,  2.75435709,  2.91931777,
        3.08427845,  3.24923913,  3.41419981,  3.57916049,  3.74412118,
        3.90908186])

스캐터 플롯

두 개의 데이터 집합, 예를 들면 두 벡터의 상관관계를 살펴보려면 scatter 명령으로 스캐터 플롯을 그린다.

In [12]:
X = np.random.normal(0,1,1024)
Y = np.random.normal(0,1,1024)
plt.scatter(X,Y);
In [13]:
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 
plt.scatter(x, y, s=area, c=colors, alpha=0.5);

Imshow

지금 까지는 1개 혹은 2개의 1차원 자료에 대한 시각화를 살펴보았다. 이제는 행과 열을 가진 2차원 데이터의 시각화에 대해 알아본다. 예를 들어 화상(image) 데이터는 전형적인 2차원 자료이다.

가장 간단한 2차원 자료 시각화 방법은 imshow 명령을 써서 2차원 자료 자체를 각 위치의 명암으로 표시하는 것이다. 자료의 시각화를 돕기위해 다양한 2차원 인터폴레이션을 지원한다.

In [14]:
from sklearn.datasets import load_digits
digits = load_digits()
X = digits.images[0]
X
Out[14]:
array([[  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.],
       [  0.,   0.,  13.,  15.,  10.,  15.,   5.,   0.],
       [  0.,   3.,  15.,   2.,   0.,  11.,   8.,   0.],
       [  0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.],
       [  0.,   5.,   8.,   0.,   0.,   9.,   8.,   0.],
       [  0.,   4.,  11.,   0.,   1.,  12.,   7.,   0.],
       [  0.,   2.,  14.,   5.,  10.,  12.,   0.,   0.],
       [  0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.]])
In [15]:
plt.imshow(X, interpolation='nearest');
plt.grid(False)
In [16]:
methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
           'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
           'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
fig, axes = plt.subplots(3, 6, figsize=(12, 6), subplot_kw={'xticks': [], 'yticks': []})
fig.subplots_adjust(hspace=0.3, wspace=0.05)
for ax, interp_method in zip(axes.flat, methods):
    ax.imshow(X, interpolation=interp_method)
    ax.set_title(interp_method)

컨투어 플롯

2차원 자료를 시각화하는 또다른 방법은 명암이 아닌 등고선(contour)을 사용하는 방법이다. contour 혹은 contourf 명령을 사용한다.

In [17]:
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 -y ** 2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
XX, YY = np.meshgrid(x, y)
ZZ = f(XX, YY)
In [18]:
plt.contourf(XX, YY, ZZ, alpha=.75, cmap='jet');
plt.contour(XX, YY, ZZ, colors='black', linewidth=.5);

3D 서피스 플롯

입력 변수가 x, y 두 개이고 출력 변수가 z 하나인 경우에는 3차원 자료가 된다. 3차원 플롯은 일반 플롯과 달리 Axes3D라는 3차원 전용 axes를 생성해야 한다.

plot_wireframe, plot_surface 명령을 사용한다.

In [19]:
from mpl_toolkits.mplot3d import Axes3D
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
XX, YY = np.meshgrid(X, Y)
RR = np.sqrt(XX**2 + YY**2)
ZZ = np.sin(RR)
In [20]:
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(XX, YY, ZZ, rstride=1, cstride=1, cmap='hot');

연습 문제 3

matplotlib 갤러리에서 마음에 드는 차트 하나를 고르고 해당 코드에 포함되어 있는 matplotlib 명령 하나를 선택하여 사용법을 조사해 보세요.

질문/덧글

한글 레이블 처리 질문 cute*** 2016년 11월 3일 3:43 오후

교수님, 예를 들어 "파이차트"에서 레이블을 한글로 표시하고 싶습니다. 간단하게 처리하는 방법이 있을까요?

답변: 한글 레이블 처리 질문 관리자 2016년 11월 3일 6:01 오후

한글을 사용하는 방법을 가장 앞부분에 추가하였습니다. 읽어주세요.