1. pyplot 시작하기
python에서 데이터 가시화를 위한 라이브러리로 matplotlib.pyplot을 사용한다. 파이썬이 데이터를 처리하는 데에는 일가견이 있는 언어인데 가시화 라이브러리도 있다니.. (R에만 있는 줄 알았는데)
일단 저는 윈도우에서 PyCharm을 설치해서 사용하기 때문에 윈도우에서 설치하는 과정만 소개하겠습니다.
위의 URL에서 사용중인 파이썬의 버전에 맞춰서 다운받은 다음 실행하시면 됩니다.
2. 그래프 그리기 : plot()
간단한 직선 그리기
그래프를 그릴 때 필요한 것은 X축과 Y축, 데이터겠죠??
일단 처음 그려보는거니까 간단한 걸로 한번 그려 봅시다.
1 2 3 4 5 6 7 8 9 | import matplotlib.pyplot as plt # y좌표 데이터만 있는 경우 plt.plot([1, 2, 3]) # (x,y) 좌표를 둘 다 사용할 경우 plt.plot([1,2,3],[2,4,6]) # axis([x축 시작, x축 끝, y축 시작, y축 끝]) plt.axis([0,4,0,7]) plt.show() | cs |
첫 번째 그린 그래프가 파란색 선이에요. Y좌표만 입력받았을 경우에는 축의 시작점 부터 1씩 증가하는 꼴로
좌표가 자동으로 매칭되요. plot([1,2,3])의 경우에는, 따라서, (0,1), (1,2), (2,3)을 이은 선이 그려지는 거죠.
두 번째 주황색 그래프는 (X, Y) 좌표를 직접 입력한 경우에요. 앞의 리스트에는 X축의 좌표,
뒤에는 Y축의 좌표로 사용해요. 따라서 plot([1,2,3],[2,4,6])은 (1,2), (2,4), (3,6)을 이은 선을 그리게 되죠.
axis는 화면에 보여줄 축의 최대 값과 최소 값을 지정하는 함수로 주석에서 보셨듯이,
이 그래프의 X축은 0~4 까지 Y축은 0 ~ 7까지로 설정된 것을 그래프를 통해서도 확인이 가능할 거에요.
그리고 그래프를 화면에 보여주는 show()함수를 사용하는 것으로 마무리!!!
이쁘게 그리고 싶어요..
plot에는 다양한 옵션들이 있어요. 그래프 색깔을 지정할 수 있는 옵션과 선의 스타일도 지정하는 옵션도 있어요. 저는 그 중에서 몇가지 종류만 사용해 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 | import matplotlib.pyplot as plt import numpy as np # x 좌표는 0부터 0.01씩 더해져 최대 5까지 x = np.arange(0.0, 5.0, 0.01) # y = x^2 그래프 plt.plot(x, x**2, 'r--') # y = 2^x 그래프 plt.plot(x, 2**x, 'b') plt.axis([0,6,0,40]) plt.show() | cs |
r |
빨강 | -- | 점선 |
b |
파랑 | o | 동그라미 |
g |
초록 | ^ | 삼각형 |
y |
노랑 | * | 별 |
이 정도가 제가 알고 있는 스타일과 색상이에요. pyplot의 공식페이지에서 더욱 다양한 옵션들이 있어요.
하나의 창 여러 개 그래프
그래프를 이 때까지는 하나의 축상에서 두 개씩 그리는 것을 연습했어요. 그런데 여러 개의 그래프를 각각의 창으로 표현하는 방법도 있어요. 바로 subplot()을 이용하는 방법이죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import matplotlib.pyplot as plt import numpy as np # x 좌표는 0부터 0.01씩 더해져 최대 5까지 x = np.arange(0.0, 5.0, 0.01) # y = x^2 그래프 plt.subplot(221) plt.plot(x, x**2, 'r--') # y = 2^x 그래프 plt.subplot(222) plt.plot(x, 2**x, 'b-') # y = x plt.subplot(223) plt.plot(x, x, 'g') # y = 1/(x+1) plt.subplot(224) plt.plot(x, 1/(x+1)) plt.show() | cs |
subplot()에 들어가는 숫자에 대하여 해설을 하자면 221은 전체창을 2 * 2로 나눈 뒤 1번째 그래프를 의미해요. 222는 2 * 2 중 2번째 이런 식으로 말이죠. 분할하고자 하는 화면의 갯수에 따라서 숫자를 다르게 쓰면 됩니다.
그래프를 상세하게 표기하기
여러 개의 그래프를 subplot으로 그리는 경우나 하나의 축에 그래프를 그리는 경우 제목이나 범례가 없으면 어떤 그래프인지 알기 힘들 겁니다. title() 함수와 legend() 함수를 이용해서 그래프의 제목과 범례를 지정할 수 있답니다. 그리고 X축과 Y축의 의미도 있으면 좋겠죠? X축과 Y축에 라벨을 붙여주는 xlabel(), ylabel()함수도 한 번 사용해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import matplotlib.pyplot as plt import numpy as np # x 좌표는 0부터 0.01씩 더해져 최대 5까지 x = np.arange(0.0, 5.0, 0.01) # 그래프의 타이틀 설정 plt.title('two graph') plt.plot(x, x, 'g', label='y=x') plt.plot(x, 2 * (x+1), 'r', label='y=2*(x+1)') # X, Y축에 이름을 붙어주기 plt.xlabel('X Data') plt.ylabel('Y Data') # 범례 표시 plt.legend() # 눈금 표시를 해주는 함수 plt.grid(True) plt.show() | cs |
3. Scatter 사용하기
산포도 그래프를 그리고 싶다!
분류기를 사용하여 데이터를 분류하는 경우 산포도 그래프로 데이터를 가시화하는 것을 많이 볼 수 있습니다. 데이터가 어느 쪽에 밀집해 있는지를 확인하기 쉽기 때문인데요. matplotlib.pyplot의 scatter() 함수를 이용하면 산포도 그래프를 손쉽게 그릴 수 있답니다. 예제 코드를 보시죠!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import matplotlib.pyplot as plt import numpy as np x1 = [1, 2, 11, 20, 6, 9] y1 = [3, 7, 10, 20, 16, 30] x2 = [5, 7, 1, 6, 9, 2] y2 = [3, 8, 10, 23, 4, 32] # 그래프의 타이틀 설정 plt.title('two scatter') plt.scatter(x1, y1, marker='s', c='r') plt.scatter(x2, y2, marker='*', c='b') # X, Y축에 이름을 붙어주기 plt.xlabel('X Data') plt.ylabel('Y Data') # 범례 표시 plt.legend() # 눈금 표시를 해주는 함수 plt.grid(True) plt.show() | cs |
두 개의 데이터를 간단하게 준비하고 scatter() 함수를 사용해서 그래프를 그립니다. 속성 중에 marker 속성이 있는데 이 속성을 이용하면 네모, 세모, 별 모양 등의 모양을 지정할 수 있고, c는 색깔 속성을 의미합니다. 그 외 다양한 속성들은 pyplot.scatter() 페이지에서 확인할 수 있습니다!
4. annotation 이용하기
아니 이런 기능도 있어??
단순히 그래프 그리는 용도로 선 그래프나 산포도 그래프 등의 그래프를 그리는 함수만 있는 게 아니다. 그래프에 주석을 달거나 화살표를 그리는 등의 기능도 있다. 이 기능을 사용해서 트리형 그래프를 그릴 수도 있고 표시가 필요한 부분을 표시하는 등의 기능을 수행할 수 있습니다. 예제 코드를 한 번 볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import matplotlib.pyplot as plt import numpy as np x1 = [1, 2, 11, 20, 6, 9] y1 = [3, 7, 10, 20, 16, 30] # box 속성 bboxType = dict(boxstyle="round4", alpha=0.8, fc='w') # 화살표 속성 arrow = dict(arrowstyle='-|>', connectionstyle='arc3,rad=0.2', fc="w") # 그래프의 타이틀 설정 plt.title('annotation') plt.scatter(x1, y1, marker='*', c='r', s=40 ) # xy는 도착점, xytext는 text가 위치할 장소 plt.annotate('here!!', xy=(11,10), xytext=(15, 15), size=20, # 수평 정렬 / 수직 정렬 ha='center', va='center', # 화살표와 박스의 속성을 설정 arrowprops=arrow, bbox=bboxType, ) # 눈금 표시를 해주는 함수 plt.grid(True) plt.show() | cs |
우선 아까 scatter 함수를 연습할 때 사용한 데이터로 산포도 그래프를 그려줍니다. 저는 이 데이터 중에 (11, 10) 지점이 중요한 데이터라고 생각하고 표시를 해둘려고 합니다. 이럴 때 annotate() 함수를 사용합니다. 속성이 꽤 많이 필요한걸 볼 수 있는데요. 주석에 정리했지만 아래에 다시 정리 해보았습니다.
xy : 표시할 데이터가 있는 곳입니다. 쉽게 도착점이라고 생각합시다
xytext : 텍스트 박스를 둘 위치를 지정합니다. 이 때 박스의 중앙점의 좌표를 입력하면 됩니다.
ha / va : 각각 수평 / 수직 방향 정렬 속성입니다.
arrowprop : 화살표의 속성을 지정합니다. dict() 함수를 이용하여 지정합니다.
bbox : 텍스트 박스의 속성을 지정합니다. 마친가지로 dict()함수로 지정합니다.
박스와 화살표는 다양한 모양과 속성들이 있습니다. 모든 속성을 블로그에 옮겨 적는데에는 한계가 있어서 api 링크를 납깁니다. 긴 글 읽어주셔서 감사합니다!!
'Data Mining' 카테고리의 다른 글
[Python] pandas plot 함수로 데이터 시각화 (3) | 2018.08.05 |
---|---|
[Data Mining] 의사 결정 트리 (1) | 2017.04.19 |
[Data Mining] k-NN 알고리즘 (1) | 2017.04.02 |
[Tensorflow]선형 회귀(Linear Regression) (0) | 2017.03.07 |
[R프로그레밍] 카카오톡 워드클라우드 (with 자바, 이클립스) (0) | 2016.10.02 |