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

matplotlib의 여러가지 플롯

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

바 차트

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

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

바 차트 작성시 주의점은 첫번째 인수인 left 가 x축에서 바(bar)의 왼쪽 변의 위치를 나타낸다는 점이다.

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

xerr 인수나 yerr 인수를 지정하면 에러 바(error bar)를 추가할 수 있다. 여기에서 alpha는 투명도를 지정한다. 0이면 완전 투명, 1이면 완전 불투명이다.

In:
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 라벨')
plt.show()

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

In:
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',
                 align='edge')

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

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()
plt.show()

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

In:
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, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.show()

연습 문제 1

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

스템 플롯

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

In:
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)
plt.show()

파이 차트

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

In:
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')
plt.show()

연습 문제 2

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

히스토그램

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

In:
x = np.random.randn(5000)
arrays, bins, patches = plt.hist(x, bins=50, normed=True)
plt.show()
In:
arrays
Out:
array([ 0.00141537,  0.        ,  0.00283075,  0.        ,  0.00141537,
        0.00141537,  0.00566149,  0.01839986,  0.01839986,  0.01415374,
        0.03255359,  0.02547673,  0.03396897,  0.07926093,  0.06227644,
        0.13304513,  0.12455288,  0.14861424,  0.18116783,  0.22504441,
        0.25901338,  0.25901338,  0.2958131 ,  0.36092029,  0.32553594,
        0.33119744,  0.4515042 ,  0.41895061,  0.40196612,  0.3495973 ,
        0.37790477,  0.34535118,  0.29864385,  0.26184413,  0.22362904,
        0.20522918,  0.17267559,  0.15286036,  0.10332228,  0.09907616,
        0.07926093,  0.04670733,  0.04387658,  0.04529196,  0.01556911,
        0.01698448,  0.00566149,  0.00707687,  0.00566149,  0.00707687])
In:
bins
Out:
array([-3.85202561, -3.71072017, -3.56941473, -3.42810929, -3.28680385,
       -3.14549841, -3.00419297, -2.86288753, -2.72158209, -2.58027665,
       -2.43897121, -2.29766577, -2.15636033, -2.01505489, -1.87374945,
       -1.73244401, -1.59113857, -1.44983313, -1.30852769, -1.16722225,
       -1.02591681, -0.88461137, -0.74330593, -0.60200049, -0.46069505,
       -0.31938961, -0.17808417, -0.03677873,  0.10452671,  0.24583215,
        0.38713759,  0.52844303,  0.66974847,  0.81105391,  0.95235935,
        1.09366479,  1.23497023,  1.37627567,  1.51758111,  1.65888655,
        1.800192  ,  1.94149744,  2.08280288,  2.22410832,  2.36541376,
        2.5067192 ,  2.64802464,  2.78933008,  2.93063552,  3.07194096,
        3.2132464 ])

스캐터 플롯

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

In:
X = np.random.normal(0,1,1024)
Y = np.random.normal(0,1,1024)
plt.scatter(X,Y)
plt.show()
In:
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)
plt.show()

Imshow

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

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

In:
from sklearn.datasets import load_digits
digits = load_digits()
X = digits.images[0]
X
Out:
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:
plt.imshow(X, interpolation='nearest');
plt.grid(False)
plt.show()
In:
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)
plt.show()