본문 바로가기
ML&DATA/python for data analysis

그래프의 시각화 - (matplotlib, pandas, seaborn)

by sun__ 2020. 7. 28.

정보시각화는 특이값을 찾아내거나, 데이터 변형이 필요한지 알아보거나, 모델에 대한 아이디어를 찾기 위한 과정의 일부이다.

 

matplotlib은 출판물 수준의 그래프를 만들어내도록 설계되었다. 모든 운영체제의 다양한 GUI 백엔드를 지원하고 있으며 PDF, SVG, JPG, PNG, BMP, GIF 등 널리 사용되는 벡터 포맷과 래스터 포맷으로 그래프를 저장할 수 있다.

 

최근엔 내부적으로 matplotlib을 사용하는 데이터 시각화 도구들이 생겼다. 그 중 하나가 seaborn 라이브러리다.

 

matplotlib의 대화형 시각화기능을 사용하려면 %matplotlib notebook 명령어를 입력해야 한다.

 

 

 

9.1 matplotlib API 간략하게 살펴보기

seaborn, pandas로 데이터 시각화를 수행할 때 matplotlib API를 어느 정도 알고 있으면 최적화할 수 있다.

 

9.1.1 figure와 서브플롯

matplotlib에서 그래프는 Figure객체 내에 존재한다. 그래프를 위한 새로운 figure는 plt.figure를 사용해서 생성한다.

 

plt.figure의 figsize옵션으로 figure의 크기와 비율을 정할 수 있다.

빈 figure로는 그래프를 그릴 수 없다. add_subplot을 사용해서 최소 하나 이상의 subplots을 생성해야 한다.

figure가 2x2크기이고 4개의 서브플롯 중 첫번째를 선택하는 예제는 다음과 같다.(서브플롯은 1부터 숫자가 매겨진다.)

 

다음처럼 2개의 서브플롯을 더 추가하면 그림과 같다.

 

주피터 노트북에선 실행되는 셀마다 그래프가 리셋되므로 한 그래프를 그릴 때 단일 셀에 코드를 전부 입력해야 한다.

 

plot명령으로 그래프를 띄우면 matplotlib은 가장 최근의 figure와 가장 최근의 서브플롯에 그래프를 띄운다. 서브플롯이없다면 서브플롯을 하나 생성한다.

plt.plot([1.5,3.5,-2,1.6])

 

'k--'옵션은 검은 점선을 그리기위한 스타일 옵션이다.

plt.plot(np.random.randn(50).cumsum(), 'k--')

 

 

fig.add_subplot에서 반환되는 객체는 AxesSubplot인데, 각각의 인스턴스 메서드를 호출해서 다른 빈 서브플롯에 직접 그래프를 그릴 수 있다.

_ = ax1.hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3*np.random.randn(30))

 

 

여러 개의 서브플롯을 원하는대로 하나의 figure에 배치해야 하는 일이 많다. 이 때 plt.subplots 메서드를 사용한다. 이 메서드는 numpy배열과 서브플롯 객체를 새로 생성하여 반환한다.

axes배열은 axes[0,1]처럼 2차원 배열로 쉽게 색인되어 편리하다.

subplots에 여러 옵션을 줄 수 있다. (nrows, ncols, sharex, sharey, subplot_kw 등)

fig, axes = plt.subplots(2,3)
axes
#out:
#array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000019683621BA8>,
#        <matplotlib.axes._subplots.AxesSubplot object at 0x0000019683642518>,
#        <matplotlib.axes._subplots.AxesSubplot object at 0x000001968366F630>],
#       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000196836A2748>,
#        <matplotlib.axes._subplots.AxesSubplot object at 0x00000196836D6860>,
#        <matplotlib.axes._subplots.AxesSubplot object at 0x0000019683708C88>]],
#      dtype=object)

 

<서브플롯 간의 간격 조절하기>

matplotlib은 서브플롯 간에 적당한 간격(spacing)과 여백(padding)을 정할 수 있다.

 

Figure객체의 subplots_adjust메서드로 서브플롯 간 간격을 조정할 수 있다. 이 메서드는 최상위 함수(plt.subplots_adjust)로도 존재한다.

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

 

wspace와 hspace는 서브플롯 간의 간격을 위해 figure의 너비와 높이에 대한 비율을 조절한다.

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)

 

9.1.2 색상, 마커, 선 스타일

그래프를 그렸을 때 축 이름이 겹치는 경우 눈금위치와 눈금 이름을 명시적으로 지정해야 한다.(?354pg 맨 위 문단)

 

matplotlib에서 가장 중요한 plot함수는 x와 y 좌푯값이 담긴 배열과 추가적으로 색상과 선 스타일을 나타내는 축약 문자열을 인자로 받는다. 예를 들어 녹색점선으로 그려진 x대 y그래프는 아래처럼 나타낼 수 있다.

ax.plot(x,y, 'g--')
ax.plot(x,y, linestyle='--', color='g') #명시적

 

 

색상에 RGB값(ex: #CECECE)를 직접 지정해서 다양한 색을 지정할 수 있다. 선 스타일에 대한 전체 목록은 plt.plot?으로 확인할 수 있다.

 

 

 

선그래프에 마커(점으로 강조)를 추가하기도 한다. 마커도 스타일 문자열에 포함시킬 수 있다. 색상마커선스타일 순이다.

from numpy.random import randn
plt.plot(randn(30).cumsum(), 'ko--')
#plt.plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')

 

 

점들을 어떻게 이을 것인지 정하는 drawstyle옵션을 넘길 수도 있다.

그래프마다 label옵션으로 라벨을 붙일 수 있다.

plt.legend는 라벨의 linestyle과 라벨이름(범례)을 그래프 구석에 띄워준다. loc옵션으로 범례를 띄울 위치도 정할 수 있다.

data = np.random.randn(30).cumsum()

plt.plot(data, 'k--', label='Default')

plt.plot(data, 'k--', drawstyle='steps-post', label='steps-post')

plt.legend(loc='best')

 

 

 

plot메서드를 실행하면 [<matplotlib.lines.Line2D at 0x196845f8dd8>] 이런 결과가 나온다.

matplotlib은 방금 추가된 그래프의 하위 컴포넌트에 대한 레퍼런스 객체를 리턴한다. 결과는 무시해도 된다. 위에선 label인자로 plot을 전달했기 때문에 plt.legend로 각 선그래프의 범례를 추가할 수 있다.(?)

 

축에 대한 범례를 추가하려면 ax.legend를 호출하면 된다.

 

 

9.1.3 눈금, 라벨, 범례

그래프를 꾸미는 방법은 크게 두가지가 있다.

 

1) matplotlib.pyplot 인터페이스로 순차적으로 꾸미기

pyplot인터페이스는 대화형 사용에 맞추어 설계되었다. xlim, xticks, xticklabels 같은 메서드로 이뤄졌다. 이런 메서드로 표의 범위를 지정하거나 눈금 위치, 눈금 이름을 조절할 수 있다.

 

· 아무런 인자 없이 호출하면 현재 설전된 매개변수의 값을 반환한다. 예를들어 plt.xlim메서드는 현재 x축 범위를 반환한다.

· 인자를 전달하면 매개변수의 값을 설정한다. 예를들어 plt.xlim([0,10])을 호출하면 x축의 범위가 0부터 10까지로 설정된다.

 

위 모든 메서드는 현재 활성화된 AxesSubplot 객체에 대해 동작한다. 그리고 모두 서브플롯 객체의 set/get 메서드로도 존재하는데, xlim이라면 ax.get_xlim, ax.set_xlim 메서드가 존재한다. 이렇게 사용하는게 더 명시적이므로 많이 선호된다.

 

2) matplotlib API로 객체지향적으로 꾸미기

 

 

<제목, 축이름, 눈금, 눈금 이름 설정하기>

다음과 같은 그래프로 설명

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())

 

set_xticks와 set_xticklabels 메서드로 x축의 눈금을 변경할 수 있다.

set_xticks메서드는 전체 데이터 범위를 따라 눈금을 어디에 배치할지 지정한다.

(위에 기본적으론 0,200,400,600,800,1000에 눈금이 배치돼 있고, 각 눈금이름은 숫자이다.)

ticks = ax.set_xticks([0,250,500,750, 1000])
labels = ax.set_xticklabels(['one','two','three','four','five'],
                           rotation=30, fontsize='small')

 

set_xlabel 메서드는 x축에 대한 이름을 지정하고, set_title메서드는 서브플롯의 제목을 지정한다.

 

당연히 x대신 y를써서 y축에도 같은 방법으로 진행할 수 있다. axes클래스는 플롯의 속성을 설정할 수 있도록 set 메서드를 제공한다. 위 예제는 아래와 같이 작성할 수 있다.

props = {
	'title': 'My first matplotlib plot', 
  	  'xlabel': 'Stages' 
  	  } 
ax.set(**props)

 

 

<범례 추가하기>

각 그래프에 label인자를 넘겨 생성한 후 legend로 범례를 띄우는 방법이 가장 일반적이다.

from numpy.random import randn

fig = plt.figure(); ax = fig.add_subplot(1,1,1)

ax.plot(randn(1000).cumsum(), 'k', label='one')
ax.plot(randn(1000).cumsum(), 'g--', label='two')
ax.plot(randn(1000).cumsum(), 'r.', label='three')
ax.legend(loc='best')

 

 

범례에서 제외시키고 싶은 그래프는 legend인자를 넘기지 않거나 '_nolegend_'인자를 넘기면 된다.

 

 

 

9.1.4 주석과 그림 추가하기

그래프에 텍스트나 도형 등으로 자신만의 주석을 그리고 싶은 경우가 있다.

 

text, arrow, annnotate함수를 이용해서 추가할 수 있다. text 함수는 그래프 내의 주어진 좌표(x,y)에 부가적인 스타일로 글자를 그려준다.

ax.text(10,10, 'Hey!', family ='monospace', fontsize=10)
#out:Text(10, 10, 'Hey!')

 

 

 

텍스트와 화살표를 함께 쓸 수도 있다. 2007년부터의 S&P 500지수 데이터로 그래프를 생성하고 2008-2009 사이의 재정위기 중 중요한 날짜를 주석으로 추가해보자.

from datetime import datetime

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']

spx.plot(ax=ax, style='k--')

crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Streans Falls'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy'),
]


for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date)+75),
               xytext = (date, spx.asof(date)+225),
               arrowprops=dict(facecolor='black', headwidth=4, width=2,
                              headlength=4),
               horizontalalignment='left', verticalalignment='top')
    
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600,1800])

ax.set_title('important dates in 2008-2009 financial crisis')

 

위 예제에서

ax.annotate 메서드를 이용해서 x,y 좌표로 지정한 위치에 라벨을 추가했다

ax.set_xlim, ax.set_ylim 메서드로 그래프의 시작과 끝 경계를 직접 지정했다.

 

책에 설명은 없지만, spx는 Series 객체인데 spx.plot을 사용하는 것 보니, pandas로도 내부적으로 matplotlib을 사용하는 것을 알 수 있다.

 

 

 

 

matplotlib은 일반적인 도형을 표현하기 위한 patches 객체를 제공한다. Rectangle과 Circle같은 것은 matplotlib.pyplot에서도 찾을 수 있지만 전체 모음은 matplotlib.patches에 있다.

 

그래프에 도형을 추가하려면 patches 객체인 shp을 만들고 서브플롯에 ax.add_patch(shp)를 호출한다.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

#왼쪽아래 꼭짓점, 밑변길이, 높이
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
#중심, 반지름
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
#각 꼭지점 순서대로
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],
                   color='g', alpha=0.5)

ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

 

 

9.1.5 그래프를 파일로 저장하기

활성화된 figure는 plt.savefig 메서드로 저장할 수 있다. 이 메서드는 figure 객체의 인스턴스 메서드인 savefig와 동일하다. figure를 svg 포맷으로 저장하려면 다음과 같이하면 된다.

plt.savefig('figpath.svg')

 

출판용 그래픽 파일을 생성할 때 자주 사용되는 옵션이 있다. 

dpi는 인치당 도트 해상도를 조절하고

bbox_inches는 실제 figure 둘레의 공백을 잘라낸다.

 

그래프 간 최소 공백을 가지는 400DPI짜리 PNG파일을 만들려면 다음과 같다.

plt.savefig('figpath.png', dpi=400, bbox_inches='tight')

 

 

savefig메서드는 파일에 저장할 뿐만 아니라 BytesIO처럼 파일과 유사한 객체에 저장하는 것도 가능하다.

다음은 BytesIO의 버퍼에 저장했다가 빼는 예제.

from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()

 

 

 

9.1.6 matplotlib 설정

matplotlib은 출판물용 그래프를 만드는 데 손색이 없는 기본 설정과 색상 스키마를 함께 제공한다. 거의 모든 기본 설정은 많은 전역 인자를 통해 설정 가능하다. 그래프 크기, 서브플롯 간격, 색상, 글자 크기, 격자 스타일 등을 설정 가능하다. 

 

matplotlib의 환경설정 시스템은 두 가지 방법으로 다룰 수 있다.

 

1) rc메서드를 사용해서 프로그래밍적으로 설정

figure의 크기를 10x10으로 전역설정하는 예

plt.rc('figure', figsize=(10, 10))

 

rc메서드의 첫 인자는 설정하고자 하는 컴포넌트의 이름이다. ('figure', 'axes', 'xtick', 'ytick', 'grid', 'legend'등) 

두 번째 인자 이후론 설정할 값에 대한 키워드 인자를 넘기게 된다. 

이 옵션을 쉽게 작성하려면 사전타입을 사용할 수 있다.

font_options = {'family' : 'monospace', 'weight' : 'bold', 'size' : 'small'}
plt.rc('font', **font_options)

 

 

2) matplotlib/mpl-data 디렉터리에 matplotlibrc 파일을 수정

위 파일을 적절히 수정해서 사용자 홈 디렉터리에 .matplotlibrc라는 이름으로 저장해두면 matplotlib을 사용할 때마다 불러오게 된다.

 

 

 

seaborn 패키지는 내부적으로 matplotlib 설정을 사용하는 내장 테마 혹은 스타일을 제공한다.

 

 

9.2 pandas에서 seaborn으로 그래프 그리기

matplotlib은 꽤 저수준의 라이브러리이다. 데이터를 어떻게 보여줄지(막대,산포도, 선그래프), 범례와 제목, 눈금 라벨, 주석 같은 기본 컴포넌트로 그래프를 작성해야 한다.

 

pandas에선 로우와 컬럼 라벨을 가진 다양한 컬럼의 데이터를 다루게 된다. Series와 DataFrame객체를 간단하게 시각화할 수 있는 내장 메서드를 제공한다. 다른 라이브러리로는 통계 라이브러리인 seaborn이 있다. seaborn은 흔히 사용하는 다양한 시각화 패턴을 쉽게 구현할 수 있도록 도와준다.

 

*seaborn 라이브러리는 amtplotlib의 기본 컬러 스킴과 플롯 스타일을 변경하여 더 나은 가독성과 이쁜 그래프를 만들어준다. 일부 사람들은 seaborn API를 사용하지 않더라도 일반적인 matplotlib그래프의 스타일을 개선하기 위해 seaborn라이브러리를 import하기도 한다.

 

9.2.1 선그래프

Series와 DataFrame은 둘 다 plot 메서드를 이용해서 다양한 형태의 그래프를 생성할 수 있다. 기본적으로 plot 메서드는 선그래프를 생성한다.

fig = plt.figure()
s = pd.Series(np.random.randn(10).cumsum(), index = np.arange(0,100,10))
s.plot()

 

Series 객체의 인덱스(색인)은 matplotlib에서 그래프를 생성할 때 x축으로 해석되며 use_index=False 옵션을 넘겨서 색인을 그래프의 축으로 사용하는 것을 막을 수 있다. x축의 눈금과 한계는 xticks와 xlim 옵션으로 조절할 수 있다. 

 

대부분의 pandas그래프 메서드는 부수적으로 ax인자를 받는데, 이 인자는 matplotlib의 서브플롯 객체가 될 수 있다. 이를 이용해서 그리드 배열 상에서 서브플롯의 위치를 좀 더 유연하게 가져갈 수 있다.

 

DataFrame의 plot 메서드는 하나의 서브플롯 안에 각 컬럼 별로 선그래프를 그리고 자동적으로 범례를 생성한다.

df.plot()

 

 

9.2.2 막대그래프

plot.bar(), plot.barh()는 각각 수직막대그래프와 수평막대그래프를 그린다. 

Series, DataFrame의 색인은 수직막대그래프의 경우 x눈금, 수평막대그래프의 경우  y눈금으로 사용된다.

인자의 alpha는 투명도를 의미한다. (0~1)

fig, axes = plt.subplots(2,1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)

 

*도수분포표를 그릴 때 Series객체 s의 s.value_counts().plot.bar()을 이용하면 된다.

 

 

 

DataFrame에서 막대그래프는 각 로우의 값을 함께 묶어서 하나의 그룹마다 각각의 각각의 막대를 보여준다.

컬럼의 이름인 'Genus'가 범례의 제목으로 사용됐다.

 

누적막대그래프는 stacked=True 옵션을 사용해서 생성할 수 있다. 각 로우의 값들이 하나의 막대에 누적되어 출력된다.

 

 

예제를 통해 다시 살펴보자.

size :  파티에 참여한 인원 수로 1~6범위를 갖는다.

total_bill : 전체 결제 금액

tip : 웨이터가 받은 팁

smoker : 흡연자 유무(Yes 또는 No)

day : 파티 개최 요일

time : 파티 개최 시간대 (Dinner 또는 Lunch)

 

아래 두가지 그래프를 그려보자. 

1) 요일별 참여인원(1인과 6인제외) 비율 막대그래프

2) 요일별 팁 비율 막대그래프

 

1)

우선 read_csv로 데이터를 불러오고 요일과 참여인원에 따라 교차 테이블(인덱스: 요일, 컬럼: 참여인원, 값: 도수)을 생성한다.

1인과 6인파티는 제외한다.

 

비율을 알고싶은데 군집이 여러개이므로 각 로우의 합이 1이 되도록 정규화하고 그래프를 그려보자.

(pcts는 percentages의 약자인듯)

party_pcts.plot.bar() - 요일별 참여인원

요위 데이터에서 파티의 규모는 주말에 커지는 경향이 있음을 알 수 있다.

 

seaborn패키지로 요일별 팁 비율을 그려보자

비용이아니라 파티소득임

sns.barplot(x='tip_pct', y='day', data=tips, orient='h')

에러막대(95%신뢰구간)를 포함한 요일별 팁 비율

 

seaborn 플로팅(plot) 함수의 data인자는 pandas의 DataFrame을 받는다. 다른 인자들은 DataFrame의 컬럼 이름을 참조한다.

day컬럼의 각 값에 대한 데이터(tip_pct)는 다수 존재하므로 tip_pct의 평균값으로 막대그래프를 그린다. 검정색 검은 선은 95퍼센트의 신뢰구간을 나타낸다.

 

seaborn 플로팅 함수의 hue 옵션을 이용하면 추가분류에 따라 나눠 그릴 수 있다.

시간대로 한 번 더 쪼개서 그래프를 그리면 다음과 같다.

요일과 시간별 팁 비율

 

 

seaborn 라이브러리는 자동으로 기본 색상 팔레트, 그래프 배경, 그리드 선 색상 같은 꾸밈새를 변경한다.

seaborn.set메서드로 이런 꾸밈새를 변경할 수 있다.

 

9.2.3 히스토그램과 밀도그래프

히스토그램은 막대그래프의 한 종류로, 값들의 빈도(도수)를 분리해서 보여준다.

 

밀도그래프는 도수를 사용해서 추정되는 연속된 확률 분포를 그린다. 이를 보통 kernel메서드를 잘 사용해서 근사하는 방법으로 그려진다. 그래서 밀도그래프는 KDE(kernel density estimate, 커널 밀도 추정)그래프라고도 한다. plot.kde로 밀도 그래프를 표준 kde형식으로 생성한다.

적분하면 1이된다.

 

 

바로 직전 단원에서 예제를 그대로 가져간다.

 

팁 비율(tip_pct)의 히스토그램과 밀도그래프를 그리면 다음과 같다.

tips['tip_pct'].plot.hist(bins=50)

팁 비율의 히스토그램

tips['tip_pct'].plot.density()

팁 비율의 밀도그래프

 

 

seaborn 라이브러리의 distplot 메서드를 이용해서 히스토그램과 밀도그래프를 한 번에 그릴 수 있다.

다른 예로 두 개의 다른 표준 정규분포로 이뤄진 양봉분포를 생각해보자.

comp1 = np.random.normal(0,1,size=200)

comp2 = np.random.normal(10,2, size=200)

values = pd.Series(np.concatenate([comp1, comp2]))

sns.distplot(values, bins=100, color='k')

 

bins는 구간 개수를 정해주는 것. 

 

9.2.4 산포도

산포도(scatter plot, point plot)는 두 개의 1차원 데이터 묶음 간의 관계를 나타내고자 할 때 유용하다.

 

statsmodels 프로젝트에서 macrodata 데이터 묶음의 몇가지 변수를 선택하고 로그차를 구해보자

trans_data의 0번 row가 NA인데 dropna()를 쓰지 않았다면 0번 row도 선택됐을 것. (NA가 들어있는 다른 로우가 있을 수도 있고)

 

seaborn 라이브러리의 regplot 메서드를 이용해서 산포도와 선형회귀곡선을 함께 그릴 수 있다.

sns.regplot('m1', 'unemp', data=trans_data)
plt.title('Changes in log %s versus log %s' % ('m1', 'unemp'))

 

탐색 데이터 분석에서는 변수 그룹간의 모든 산포도를 살펴보는 일이 유용한데, 이를 짝지은 그래프 또는 산포도 행렬이라고 한다.  seaborn의 pairplot함수로 대각선을 따라 각 변수에 대한 히스토그램이나 밀도그래프도 생성할 수 있다.

sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha':0.2})

첫 로우 = cpi

왜 대각선에만 산포도가 아닌지는 조금만 생각하면 알 수 잇을 것.

 

plot_kws인자는 각각의 그래프에 전달할 개별 설정값을 지정한다.

 

 

 

9.2.5 패싯 그리드와 범주형 데이터

페싯 그리드로 다양한 범주형 값을 가지는 데이터를 시각화할 수 있다.

seaborn은 factorplot이라는 유용한 내장 함수를 제공하여 다양한 면을 나타내는 그래프 그릴 수 있다.

 

요일/시간/흡연 여부에 따른 팁 비율을 나타내는 그래프

sns.factorplot(x='day', y='tip_pct', hue='time', col='smoker', kind='bar', data=tips[tips.tip_pct<1])

 

요일/시간/흡연 여부에 따른 팁 비율을 나타내는 그래프. hue없이 하면 다음과 같다.

sns.factorplot(x='day', y='tip_pct', row='time',
               col='smoker',
               kind='bar', data=tips[tips.tip_pct < 1])

 

 

factorplot은 보여주고자 하는 목적에 어울리는 다른 종류의 그래프도 함께 지원한다.  예를 들어 중간값과 사분위값 그리고 특잇값을 보여주는 상자그림(box plot)이 효과적일 때도 있다.

sns.factorplot(x='day', y='tip_pct', row='time',
               col='smoker',
               kind='bar', data=tips[tips.tip_pct < 1])

 

 

seaborn.FacetGrid 클래스를 이용해서 나만의 패싯 그리드를 만들고 원하는 그래프를 그릴 수도 있다. 

->seaborn document 참고

 

 

9.3 다른 파이썬 시각화 도구

Bokeh나 Plotly같은 도구 : 웹 브라우저 상에서 파이썬으로 동적 대화형 그래프 그릴 수 있다.

 

웹이나 출판을 위한 정적 그래프를 그리고자 한다면 matplotlib, pandas, seaborn 추천