반응형
반응형

2016년 9월 12일 오후 7시 45분, 8시 35분 2차례 강력한 지진이 연달아 발생했습니다.


1차 지진의 규모는 5.1, 2차 지진의 규모는 5.8이라고 하는데, 서울에 사는 저도 진동을 꽤 느꼈는데 지진 진앙지 근처인 경주 지방에는 많은 사람들이 엄청나게 놀랐을 것 같습니다.


규모 5.8은 기상청에서 관측한 한반도 지진중 가장 강력하다고 알려져 있습니다. 아마 이 지진은 앞으로 경주 지진으로 불리며 회자 될듯 합니다.


아래 그림은 미국 지질 조사국(USGS)의 실시간 데이터를 받아서 지도에 그린 것입니다.



해당 지역은 양산 단층이 지나가는 곳인데, 이 곳은 예전부터 이 단층이 활단층이냐 아니냐 논란이 있었는데요,, 활단층일 가능성이 많은 것 같습니다. 만약 활성 단층이라면 이 부근에 있는 원전이 참으로 문제가 아닐 수 없네요..



아무쪼록 무탈했으면 좋겠습니다.


여기서 지진에 대한 기초 상식에 대해 가볍게 살펴보도록 하겠습니다.

지진의 크기는 보통 모멘트 규모(Moment Magnitude Scale)라고 불리는 지진으로 인해 발생되는 에너지의 크기로 나타내는 단위로 표시합니다. 모멘트 규모는 그냥 규모라고 부르기도 합니다.


규모는 1에서 시작하는데, 규모의 크기가 1 증가할 때마다 에너지의 크기는 약 32배가 커집니다. 만약 규모가 2차이가 나면 에너지 크기는 약 1000배가 됩니다. 따라서 규모 6 지진은 규모4 지진의 1000배나 되는 에너지를 분출합니다.


이해를 돕기 위해 예를 들어보자면, 규모 8의 지진은 이번 경주 지진의 크기인 규모 6 정도의 지진이 1000번 일어나야 해소되는 에너지를 가지고 있습니다.


규모가 지진의 실제적인 에너지의 크기라면 진도는 발생한 지진으로 인해 사람이 직접적으로 느끼고 땅이 흔들리는 정도를 의미합니다. 따라서 진도 등급이 피해 정도와 직결되는 단위라고 생각하면 됩니다. 미국, 일본, 우리나라에서 사용되는 진도는 수정 메르칼리 진도 등급(Modified Mercalli Intensity Scale)입니다. 수정 메르칼리 진도 등급은 아래의 표와 같이 총 12 등급으로 되어 있습니다.


이번에 서울에서 느낀 진도는 4정도가 되는거 같네요..


 진도

상황 

 1

 미세한 진동. 특수한 조건에서 극히 소수 느낌

 2

 실내에서 극히 소수 느낌

 3

 실내에서 소수 느낌. 매달린 물체가 약하게 움직임

 4

 실내에서 다수 느낌. 실외에서는 감지하지 못함.

 5

 건물 전체가 흔들림. 물체의 파손, 뒤집힘, 추락. 가벼운 물체의 위치 이동

 6

 똑바로 걷기 어려움. 약한 건물의 회벽이 떨어지거나 금이 감. 무거운 물체의 이동 또는 뒤집힘

 7

 서 있기 곤란함. 운전 중에도 지진을 느낌. 회벽이 무너지고 느슨한 적재물과 담장이 무너짐

 8

 차량운전 곤란. 일부 건물 붕괴. 사면이나 지표의 균열. 탑·굴뚝 붕괴

 9

 견고한 건물의 피해가 심하거나 붕괴. 지표의 균열이 발생하고 지하 파이프관 파손

 10

 대다수 견고한 건물과 구조물 파괴. 지표균열, 대규모 사태, 아스팔트 균열

 11

 철로가 심하게 휨. 구조물 거의 파괴. 지하 파이프관 작동 불가능

 12

 지면이 파도 형태로 움직임. 물체가 공중으로 튀어오름

 

 


반응형
반응형

2016년 9월 9일 한반도 북부 북한 지역에 지진이 발생했다고 표시되어 있네요. 뉴스를 보니까 북한에서 핵실험을 한걸로 판명되었군요.




 


참,, 걱정이 이만저만 아닙니다. 국민 모두 일치단결하여 이 난국을 극복해야 할 것 같습니다.


반응형
반응형

지진 지역 지도에 표시하기3 - 발생한 지진 규모에 따라 다르게 표시하기



지진 지역 지도에 표시하기2에서는 USGS에서 제공하는 전세계에서 현재 기준 1주일간 발생한 규모 4.5이상의 지진을 발생한 위치에 빨간색 점으로 표시해봤습니다.


이제 이를 좀 더 응용하여 발생한 지진 규모에 따라 아래의 규칙으로 다른 크기의 원과 색상으로 표시를 해보도록 하겠습니다.


  • 규모 6.0 이상 지진 : 빨간색
  • 규모 5.0 이상 지진 : 노란색
  • 규모 5.0 미만 지진 : 초록색


원의 크기는 발생한 지진 규모에 비례하게 만들겠습니다. 2편의 코드를 좀 수정하여 아래와 같이 구현합니다.




주요 변경 부분만 살펴보겠습니다.


>>> mags.append(float(ret[4]))


발생한 지진 규모를 리스트인 mags에 추가합니다.



>>> get MarkerColor(mag)


지진 규모에 따라 표시할 색상과 마커모양(원)을 리턴합니다.



>>> m.plot(x, y, color, markersize=2.5*mag, alpha=0.7)


지진 규모에 따른 색상과 원 크기를 지정하고 투명도 0.7로 지도에 그려줍니다.



코드를 실행하면 아래와 같은 결과가 나옵니다.


 


지도를 확대해보면 아래와 같습니다.





좀 더 응용을 해서 이탈리아 부분만을 중점적으로 지도에 표시하고 지진 지역을 나타내 보도록 하겠습니다.



변경된 부분은 다음과 같습니다.


>>> m = Basemap(llcrnrlon=6.0,llcrnrlat=36.00,urcrnrlon=21.0,urcrnrlat=48.0, 
                resolution='i',projection='cass',lon_0=18.0,lat_0=42.0)


인자는 다음과 같은 의미를 지닙니다.


  • llcrnrlat : 나타낼 지도의 좌측하단 위도
  • llcrnrlon : 나타낼 지도의 좌측하단 경도
  • urcrnrlat : 나타낼 지도의 우측상단 위도
  • urcrnrlon : 나타낼 지도의 우측상단 경도
  • lat_0, lon_0 : 지도의 중심

이 코드를 실행하면 아래와 같은 결과가 나옵니다.




참고로 우리나라만 살펴보면 지진이 없는 깨끗한 땅임을 알 수 있습니다.


 



이상으로 지진 지역을 지도에 표시하는 포스팅은 마무리 하도록 하겠습니다. 


반응형
반응형

지진 지역 지도에 표시하기2 - 지진 데이터를 인터넷에서 가져와 지도에 표시하기



이제 인터넷에 공개된 지진 데이터를 가져와 우리의 지도에 표시를 해보도록 하겠습니다.

미국 지질조사국 USGS는 다양한 지진 데이터를 제공하고 있는데, 이 포스팅에서 사용할 데이터는 프로그램을 구동하는 시간 기준으로 1주일간 전 세계적으로 발생한 규모 4.5 이상 지진입니다.


URL은 다음과 같습니다.

http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_week.csv


아래의 코드로 이 데이터가 어떤 형태로 되어 있는지 확인해봅니다.



위 코드에서 주석 처리한 부분은 나중에 실제로 사용할 코드입니다. 코드를 실행하면 다음과 같은 내용이 화면에 출력됩니다.


time,latitude,longitude,depth,mag,magType,nst,gap,dmin,rms,net,id,updated,place,type,horizontalError,depthError,magError,magNst,status,locationSource,magSource

2016-08-27T08:59:13.780Z,-29.0991,60.9897,10,4.8,mb,,51,9.213,0.51,us,us20006ui0,2016-08-27T09:17:32.040Z,"Southwest Indian Ridge",earthquake,9.6,1.9,0.09,38,reviewed,us,us

2016-08-27T08:24:09.990Z,53.1043,-166.7081,39.28,4.5,mb,,167,0.752,1.04,us,us20006uhu,2016-08-27T08:53:36.040Z,"86km S of Unalaska, Alaska",earthquake,8.1,6.8,0.076,51,reviewed,us,us

2016-08-27T04:51:06.190Z,-56.2823,-26.9039,66.12,5.4,mb,,83,5.831,0.83,us,us20006ugf,2016-08-27T05:09:29.040Z,"49km NNE of Visokoi Island, South Georgia and the South Sandwich Islands",earthquake,7.9,6.8,0.053,122,reviewed,us,us

2016-08-27T02:34:41.440Z,13.4315,57.8638,10,4.9,mb,,49,11.56,1.19,us,us20006ufv,2016-08-27T02:53:11.040Z,"Owen Fracture Zone region",earthquake,9.8,1.9,0.053,114,reviewed,us,us

2016-08-27T01:14:33.850Z,31.5284,77.7042,31.67,4.6,mb,,153,4.3,0.78,us,us20006ufk,2016-08-27T09:07:01.643Z,"9km W of Sarahan, India",earthquake,9.2,6.2,0.088,38,reviewed,us,us

...

...



출력된 내용에서 첫번째 줄을 보면 어떤 데이터가 있는지 알 수 있습니다. 모든 데이터는 콤마로 구분되어 있고 주요 내용은 다음과 같습니다.


  • 1번째: 지진 발생 시간
  • 2번째: 지진 발생 위도
  • 3번째: 지진 발생 경도
  • 4번째: 진원 깊이
  • 5번째: 지진 규모


나머지 부분은 이 포스팅에서는 사용하지 않을 내용이므로 패스하고, 이 포스팅에서 사용할 데이터는 3번째, 4번째, 5번째 데이터입니다.


이제 코드를 구현해보도록 합니다. 지진 지역 지도에 표시하기1의 'robin' 지도를 나타내는 코드에서 style.use('seaborn-talk') 다음 줄에 아래의 코드를 추가합니다.



그리고, plt.show() 앞 부분에 아래의 코드를 추가합니다.



이제 코드를 실행해보면 아래 그림과 같이 세계 지도에 최근 1주일간 전세계에서 발생한 규모 4.5 이상 지진 발생 위치를 빨간색 점으로 표시됩니다.



위 결과를 보면 아직도 구조 활동을 하고 있는 이탈리아 지진이 표시되어 있음을 알 수 있습니다. 윈도우에서 이 코드를 실행하고 있으면 Matplotlib 출력 화면에 있는 아이콘을 이용해 지도를 축소하고 확대할 수 있습니다. 아래 그림은 이탈리아 지진 지역을 자세히 보기 위해 지도를 확대한 것입니다.




이번 포스팅에서는 현재 기준으로 과거 1주일간 전세계에서 발생한 지진 지역을 빨간색 점으로 표시하는 방법을 다루었습니다. 다음 포스팅에서는 발생한 지진 규모에 따라 색상과 점의 크기를 다르게 표현하는 방법을 다루겠습니다.


반응형
반응형

지진 지역 지도에 표시하기1 - Basemap 설치하기



요즘 지진이 전세계적으로 자주 일어나고 있습니다. 제가 원래 지구물리학을 전공해서 지진에 대해서는 조금 아는 편입니다. 지진은 지구의 맨틀위에 둥둥 떠다니는 판이라 불리는 지각판들의 경계부분에서 대부분 일어나지만, 판경계가 아닌 판내부에서도 일어납니다. 일본은 판경계에 위치한 섬이라서 하루에도 몇번씩 지진이 발생하는 나라죠.


지진의 세기는 규모와 진도라는 용어를 사용하는데, 규모는 실제 지진 에너지의 크기이고, 진도는 땅이 흔들리는 정도를 의미합니다. 지진 규모는 5이지만 발생한 곳의 지질에 따라 진도가 작을 수도 있고 클 수도 있습니다. 따라서 실제 피해와 직결되는 것은 규모보다는 진도가 더  맞다고 볼 수 있습니다.


지진 이야기는 이쯤에서 마무리하고, 이번에 해볼 것은 전세계에서 지진이 일어나는 곳을 세계 지도에 표시해보는 것입니다. 지진 데이터는 미국 USGS(US Geological Survey)에서 제공하는 자료를 이용할 예정입니다.


일단 지진 지역을 세계 지도에 표시하려면 지도를 화면에 그려야겠지요. 이를 위해 다음과 같은 일들을 먼저 해야 합니다.


  • Matplotlib 설치하기
  • Basemap 설치하기


Matplotlib은 이미 설치되었으리라 생각하고, Basemap을 설치하는 방법에 대해 살펴보겠습니다.

Basemap은 GEOS에 기반하여 2D 데이터를 지도에 플로팅할 수 있는 Matplotlib 툴킷입니다. Basemap의 설치는 윈도우 환경과 리눅스 환경에서 각각 다른 방법으로 수행해야 합니다. 윈도우에 Basemap을 설치하려면 Basemap 라이브러리를 다운로드 받아 PIP를 이용해 간단하게 설치할 수 있지만 리눅스의 경우, 리눅스에 OpenCV를 설치하는 것처럼 관련 소스를 다운로드 받고 make 파일을 만들고 빌드를 해야합니다. 저 같은 경우는 리눅스 기반의 Jupyter에서 개발을 하기 때문에 리눅스에 Basemap을 설치해서 사용하지만 이 포스팅에서는 윈도우에 설치하는 것으로 설명하도록 하겠습니다.


아래 링크에서 파이썬3.5용 Basemap 라이브러리인 Basemap1.0.8-cp35-none-win32.whl을 다운로드 받습니다. 


☞ Basemap for Python 3.5 다운로드 받기 


PIP를 이용해 다운로드 받은 파일을 설치합니다. 설치가 종료되면 윈도 커맨드창을 열고 파이썬을 실행한 후 아래와 같이 Basemap 을 import 해봅니다.


>>> from mpl_toolkits.basemap import Basemap


아무런 오류없이 import가 제대로 되면 준비가 끝났습니다. 자 이제 기본적인 지도를 화면에 그려보겠습니다.


 


윈도우 환경에서는 위 코드의 맨 윗줄은 삭제해야 합니다.

이 코드는 기본적인 세계 지도에 나라 경계만 구분하여 화면에 출력합니다.  


 


그러면 위 코드를 조금 수정하여 지도 모양을 바꾸어 보겠습니다. 



이 코드는 지도 형태를 'robin'으로 변경했고, lat_0=0, lon_0=130은 지도의 중심을 동경 130도로 설정한다는 의미입니다.


>>> m.fillcontinents(color='gray')


지도에서 대륙부분을 회색으로 채웁니다.



>>> m.drawmeridians(np.arange(0, 360, 30))

>>> m.drawparallels(np.arange(-90, 90, 30))


위도선과 경도선을 30도 간격으로 그려줍니다.


이 코드를 실행하면 다음과 같은 지도가 화면에 나타납니다.


 




다음 포스팅에서는 지진 데이터를 인터넷에서 받아와 이 지도 위에 표시하는 방법을 다루도록 하겠습니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍20 - 3D 플로팅4



이번 포스팅은 데이터 가시화 프로그래밍 마지막편으로 아래와 같은 3D 플로팅에 대해 살펴보고 마무리하겠습니다.


  • 3D다각형 그래프
  • 3D 막대그래프
  • 3D화살표(quiver) 그래프
  • 3D평면에 2D 그래프 그리기
  • 3D평면에 텍스트 추가하기
  • 3D평면에서 서브플롯 지정하기


3D 다각형 그래프 그리기


3D 막대그래프 그리기

 


 3D Quiver





3D 평면에 2D 그래프 그리기





3D 평면에 텍스트 삽입하기





3D 평면에서 서브플롯 구성하기





이상으로 Matplotlib을 이용해 데이터 시각화하는 방법에 대해 가볍게 살펴보았습니다.

실제 Matplotlib의 다양한 기능들은 이번 포스팅에서 다룬 것보다 훨씬 방대하고 다양한 기능들을 제공하므로 관심 있는 분들은 관련 서적을 참고하는 등으로 심화 학습을 하시면 되겠네요.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍19 - 3D 플로팅3



이번에는 3차원 좌표에서 그려진 surface에서 같은 값들을 연결한 등가선(Contour)을 표현하는 방법에 대해 알아보겠습니다. Contour에는 같은 높이를 이어서 만든 등고선, 같은 압력을 이어서 만든 등압선, 같은 온도를 이어서 만든 등온선 등 다양한 종류가 있습니다.


Matplotlib은 다양한 형태로 Contour를 아래와 같은 다양한 방법으로 그려주는 기능을 제공합니다.


  • 3차원 좌표에 단순히 Contour를 그려줌
  • Contour를 3차원 형태의 띠로 표현해줌
  • Contour를 3차원 형태의 면으로 표현해줌
  • xy, yz, zx 평면에서 바라볼 때의 Contour를 각 평면에 투사하여 표현해줌


자 그러면 실제 코드를 보고, 이해를 해보시면 됩니다. 아래 제시된 코드는 모두 Matplotlib 예제에서 가져온 것입니다.



Contour 플로팅







Filled Contour 플로팅




반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍18 - 3D 플로팅2



Matplotlib을 이용한 3D 플로팅 예는 대부분 알려진 복잡한 수학식을 이용한 것입니다. 실제 데이터를 3D 플로팅으로 분석하는 경우 이런 복잡한 수학식이 아니라 데이터를 어떻게 표현하고 나타낼지에 관한 아이디어가 중요한 것이 되겠죠.


이번 포스팅에서는 아래와 같은 것들이 어떻게 표현되는지에 대해 소개합니다.


  • Surface 플로팅
  • Try-Surface 플로팅


아래 예제들은 Matplotlib 문서에 제시되어 있는 것들이며, 대부분이 3차원 좌표를 설정한 후 3D 플로팅을 위한 수학방정식을 파이썬으로 구현하고, 이 방정식으로 구한 x, y, z값들을 3차원 좌표상에 그리되 표면을 특정한 색상으로 칠하거나 삼각형으로 채워서 나타내는 방법을 보여줍니다.


코드가 수학식이라 해석이 까다롭기 때문에 그냥 이런식으로 3D 플로팅을 하는구나 하고 넘어가시기 바랍니다. 다만 Suface 플로팅과 Tri-Surface 플로팅을 위해 활용되는 함수들은 눈여겨 보시기 바라구요..



Surface 플로팅










Tri-Surface 플로팅






반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍17 - 3D 플로팅1



Matplotlib은 3차원 좌표에 플로팅 해주는 다양한 기능들을 제공하고 있습니다. 이번 포스팅에서는 다음과 같은 내용에 대해 살펴봅니다.


  • 3D 라인 그리기
  • 3D 산점도 그리기
  • 3D 와이어 프레임 그리기


3D 곡선 그리기

3D 플로팅을 하려면 3차원 좌표를 설정하는 것이 제일 먼저 해야할 일입니다. 아래 코드는 3차원 좌표에 Parametric 곡선을 그리는 예입니다.



코드의 주요부분만 살펴보면,


>>> mpl.rcParams['legend.fontsize'] = 10


레전드의 폰트 크기를 10으로 설정해줍니다.



>>> ax = fig.gca(projection='3d')


플로팅 하려는 좌표를 3D로 지정합니다. 이제 ax는 3D 좌표가 기준이 됩니다.



>>> ax.plot(x, y, z, label='parametric curve')


x, y, z 를 3차원 좌표에 플로팅합니다.


이상을 보면 2차원 좌표에서 플로팅하는 것과 비교하면 z값이 하나 더 늘었을 뿐입니다. 결과는 아래와 같습니다.






3D 산점도 그리기

3차원 좌표에 산점도를 그리는 것 역시 제일 먼저 해야할 일은 3차원 좌표계를 설정하는 것입니다.



>>> ax = fig.add_subplot(111, projection='3d')


3D 곡선 그리기에서 3차원 좌료를 설정하기 위해 fig.gca(projection='3d')를 이용했지만, 여기서는 3차원 서브플롯을 추가하여 설정했습니다.


결과는 아래와 같습니다.




3D 와이어 프레임 그리기



>>> X, Y, Z = axes3d.get_test_data(0.05)


mpl_toolkits.mplot3d.get_test_data()는 테스트용 3차원 좌표 샘플을 만들어 줍니다.



>>> ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5, lw=1)


3차원 좌표에 와이어 프레임을 그립니다. 와이어의 간격은 row 방향으로 5(rstride=5), column 방향으로 5(cstride=5)이며 선두께는 1로 설정했습니다. 이 값들을 적절하게 변경하면 와이어 프레임의 모양이 달라집니다. 만약 rstride나 cstride의 값이 0으로 설정되면 해당 방향의 와이어는 사라집니다.


결과는 아래와 같습니다.





반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍16 - Matplotlib 애니메이션으로 라이브 그래프 그리기




Matplotlib은 애니메이션 기능을 제공하여 라이브 그래프를 그릴 수 있게 해줍니다. 아래의 코드를 보시죠~




이 코드는 삼각함수 사인그래프를 오른쪽 방향으로 움직이게 합니다. 자, 아래의 수학 함수를 생각해봅니다.




이 함수는 주기가 1인 사인 곡선을 양수 t의 값을 연속적으로 증가시키면 사인 곡선 전체를 오른쪽으로 움직이게 하는 효과를 발휘합니다. 이는 고등학교 수학을 충실히 학습한 분들은 모두 알 수 있을 겁니다.


위 코드는 이 함수를 Matplotlib 애니메이션으로 시각화하는 코드입니다. Matplotlib에서 애니메이션을 수행하는 함수는 FuncAnimation()입니다. 이 함수의 주요 인자를 살펴보면


  • fig: 애니메이션을 수행할 루트 플롯
  • func: 반복적으로 호출하여 애니메이션을 위한 그래프를 그리는 함수
  • init_func: 초기화 함수로써 프레임이 리셋될 때 호출됨. 보통 아무것도 그리지 않은 상태를 만드는 함수가 쓰임
  • frames: 초당 프레임수
  • interval: 애니메이션의 리셋 간격. 단위는 밀리초(ms)이며 이 값이 커지면 애니메이션이 느려지고, 이 값이 작아지면 애니메이션이 빨라짐
  • blit: 이 값이 True이면 func와 init_func는 프레임 클리어를 위해 그려질 대상값을 리턴해야 함


아래는 interval의 값이 20, 30, 10일 때 결과입니다.


interval = 20

 


interval = 30



interval = 10

 



만약 Jupyter Notebook을 활용하고, Jupyter Notebook 내에 애니메이션 결과를 나타내고자 하면 아래의 코드와 같이 작성하면 됩니다.


Jupyter에서 Matplotlib 애니메이션이 가능하게 하려면

  • from IPython.display import HTML
  • FuncAnimation() 호출 후 HTML(ani.to_html5_video()) 호출





아래는 Matplotlib 애니메이션으로 표현할 수 있는 다양한 애니메이션 예입니다. 각 애니메이션에 대한 소스코드를 설명하기에는 수학적인 지식이 필요하고, 포스팅에 많은 시간이 필요할 것 같아서 실제 소스코드의 링크만 걸어둡니다. 필요하신 분들은 소스코드를 참고하시어 응용하시면 되겠네요~



Decay  - 소스코드 바로가기



Basic - 소스코드 바로가기





Dynamic Image - 소스코드 바로가기



Unchained - 소스코드 바로가기 



Subplots - 소스코드 바로가기

 



Strip Chart - 소스코드 바로가기

 



Bayes_update - 소스코드 바로가기



Double_pendulum - 소스코드 바로가기



Histogram - 소스코드 바로가기



Rain - 소스코드 바로가기



Random 3D animation - 소스코드 바로가기




이와 같이 Matplotlib으로 표현할 수 있는 애니메이션은 매우 다양합니다. 데이터를 분석하고 이를 어떻게 사용자에게 보여줄 것인지 잘 기획한 다음 최적의 효과를 낼 수 있도록 해보세요~


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍15 - 서브플롯 활용하기



이번에는 서브플롯을 활용하여 한 화면에 여러가지 그래프를 보는 방법에 대해 살펴봅니다.

여태까지 다룬 소스코드는 주가트렌드, 주가캔들 그리고 미국 출생아수에 대한 그래프를 출력하는 것이었죠.

이들 세 가지 그래프를 서브플롯을 이용해 그려봅니다.


서브플롯은 아래의 코드로 3개로 구분합니다.


>>> ax1 = plt.subplot2grid((2, 2), (0, 0))

>>> ax2 = plt.subplot2grid((2, 2), (0, 1))

>>> ax3 = plt.subplot2gird((2, 2), (1, 0), colspan=2)


ax1에는 주가트렌드 그래프를, ax2에는 주가캔들 그래프를, ax3에는 미국 출생아수 그래프를 출력하도록 이전 코드를 활용해서 그려봅니다.


14편까지 충실하게 따라왔다면 아래 코드는 별로 설명할 것이 없습니다.





결과는 아래와 같습니다.




이 예에서는 미국 출생아수 그래프는 나머지 2개와 관련이 없는 것이지만, 이런 유형의 데이터 시각화는 서로 상관이 있는 것들을 다른 각도에서 살펴보기 위해 많이 활용됩니다.


자, 그러면 연관성이 있는 주가트렌드와 주가캔들을 서브플롯을 활용하여 한눈에 보이도록 해봅니다.

x축의 값은 날짜로 동일하며, y축의 값은 주가이므로 동일한 스케일로 그려주면 될 것 같습니다.

이를 위해서 x축을 공유하여 서브플롯을 정의합니다. ax1에는 주가트렌드를, ax2에는 주가캔들을 그릴 겁니다.

>>> ax1 = plt.subplot2grid((2,1), (0,0))

>>> ax2 = plt.subplot2grid((2,1), (1,0), sharex=ax1)



그리고 y축의 스케일을 같게 두기 위해 주가트렌드 그래프 및 주가캔들을 그린 후 아래의 코드를 추가합니다.


주가트렌드 그래프를 그린 후 추가할 코드


>>> ax1.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='lower'))



주가캔들을 그린 후 추가할 코드


>>> ax2.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='upper'))


마지막으로 plt.show()를 호출하기 전에 아래 코드를 삽입하여 ax1의 x축에 표시되는 눈금 라벨을 보이지 않게 합니다.


>>> plt.setp(ax1.get_xticklabels(), visible=False)



수정된 drawStockTrend() 함수 부분은 아래와 같습니다.




코드 실행 결과는 아래와 같습니다.





반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍14 - 그래프 또는 차트에 주석 달기



데이터를 분석하여 그래프나 차트로 보여줄 때 중요한 이벤트나 이슈 등이 있다면 이를 텍스트나 화살표로 표시하면 사용자에게 보다 친절함을 제공해줄 수 있습니다.


13편에서 활용한 데이터는 1880년 이후로 미국에서 태어난 남자아이, 여자아이 출생수를 그래프로 나타낸 것입니다. 그래프를 보면 1958년 정도에 피크를 보인 후 점차 출생자수가 줄어드는 것을 알 수 있습니다.


1958년에 즈음에 태어난 세대들을 우리나라에서는 베이비붐 세대라고 하는데 미국에서도 마찬가지네요. 차트에 이 부분을 '베이비붐'이라고 표시를 해보도록 하겠습니다.



13편의 코드와 달라진 부분은 하나입니다.


>>> ax.annotate('베이비붐', (1958, y2[1958-1881]), xytext=(0.7, 0.95),

        textcoords='axes fraction', arrowprops=dict(color='g', alpha=0.5))


annotate()는 플롯에 텍스트를 표시하며 옵션으로 화살표도 표시할 수 있습니다. annotate()에 사용된 인자를 살펴보면,

  • '베이비붐': 플롯에 표시할 텍스트
  • (1958, y2[1958-1881]): 화살표를 그리는 경우 화살표 끝이 지시할 위치. 좌표값으로 표시함
  • xytext=(0.7, 0.95): 텍스트가 위치할 지점. textcoords 인자가 'axes fraction'인 경우 0.7과 0.95는 플롯의 가로, 세로방향으로 70%와 95%위치임을 의미함
  • textcoords='axes fraction': xytext의 인자는 가로방향, 세로방향의 비율로 지정
  • arrowprops=dict(color='g', alpha=0.5): 화살표의 속성을 사전 자료로 지정. 색상은 green, 투명도는 0.5로 설정함. 여기에 사용될 수 있는 인자는 여기를 참고


여기서 텍스트 위치를 지정하는 xytext는 textcoords 인자에 따라 인자의 값이 의미하는 바가 다릅니다. textcoords를 지정하지 않으면 xytext로 지정되는 값은 디폴트로 좌표값이 됩니다.


이 코드를 실행하면 아래와 같습니다.




이제, 베이비붐 시기에 태어난 남자아이 여자아이 출생수를 차트에 삽입해보겠습니다.

이 역시 annotate()를 사용할 것인데, 위 코드의 plt.legend(loc=4) 앞부분에 아래의 코드를 삽입합니다.




>>> bbox_props_f = dict(boxstyle='round', fc='w', ec='r', lw=2)

>>> bbox_props_m = dict(boxstyle='round', fc='w', ec='b', lw=2)


주석을 둥근 모서리 사각형으로 둘러싸기 위해 박스 속성을 위해 사전자료를 정의합니다. 주요 인자는 다음과 같습니다.


  • boxstyle='round': 박스스타일을 둥근 모서리 사각형으로 지정 
  • fc = 'w': 사각형을 흰색으로 채움
  • ec='r': 외곽선을 빨간색 선으로 함
  • lw=2: 선두께를 2로 설정


annotate()에 사용되는 화살표 및 박스 속성 인자에 대해 보다 많은 정보는 여기를 참고하세요~


annotate()의 인자로 bbox= 가 있음을 알 수 있습니다. 코드를 실행하면 아래와 같은 결과가 나옵니다.



반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍13 - Matplotlib 스타일 적용하기



Matplotlib은 그래프를 다양한 스타일로 출력할 수 있게 해줍니다. 윈도우 커맨드 창을 열고 파이썬을 실행한 후 아래의 코드를 입력하고 돌려봅니다.


>>> from matplotlib import style

>>> print(style.available)


화면에 출력되는 것은 Matplotlib에서 사용 가능한 스타일입니다.


  • seaborn-dark-palette
  • seaborn-darkgrid
  • seaborn-whitegrid
  • seaborn-colorbline
  • seaborn-poster
  • seaborn-paper
  • seaborn-ticks
  • seaborn-notebook
  • seaborn-pastel
  • seaborn-deep
  • seaborn-white
  • seaborn-dark
  • seaborn-muted
  • seaborn-talk
  • seaborn-bright
  • bmh
  • dark_background
  • classic
  • fivethirtyeight
  • ggplot
  • grayscale


스타일을 적용하려면 여태까지 여러분이 작성한 코드에 matplotlib.style을 import하고 아래 한줄을 추가하면 됩니다.,


>>> style.use(스타일)


예를 들어 dark_background를 적용하려면


>>> style.use('dark_backgroud')

로 하면 됩니다.


단, 몇몇 스타일에서는 한글이 제대로 동작하지 않는 경우도 있네요. 이 부분은 아직 제가 해결하지 못했습니다. 뭐 언젠가는 해결되겠죠~


아래는 7편에서 다루었던 코드에 몇몇 스타일을 적용한 결과입니다.



seaborn-talk


ggplot


dark_background



이것 말고 다른 스타일은 각자가 한번씩 사용해보기 바랍니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍12 - 주가 캔들 그리기




이왕 Matplotlib을 응용하는 예로 주식 가격을 예로 들었으므로, 주가 캔들을 그리는 방법에 대해 알아겠습니다. 주식에 전혀 관심 없는 분들도 있겠지만 주식을 조금이라도 해본 분들은 주가 캔들에 대해 많이 알고 있을거라 생각합니다.


흔히 주가 캔들을 양봉, 음봉으로 부르기도 하는데, 우리나라 주식 시장에서 빨간색은 좋은 것이고, 파란색은 별로 안좋은 것이죠. 무슨 말인고 하면 빨간색은 주가가 전날에 비해 올라갔다는 말이고, 파란색은 전날에 비해 내려갔다는 의미입니다.


먼저, 11편에서 다루었던 코드를 약간 수정하여 삼성전자 주가의 1달치를 가져와서 주가 캔들을 그려보는 코드를 작성합니다.




코드의 주요 부분만 살펴봅니다.


>>> import matplotlib.finance import candlestick_ohlc


주가 캔들을 그려주기 위해 matplotlib의 필요한 모듈을 import 합니다.



>>>  ohlc = []

     for i in range(len(date)):

         stock_data = date[i], openp[i], high[i], low[i], closep[i], volume[i]

         ohlc.append(stock_data)


주가를 뽑아낸 기간 동안 날짜, 시작가, 고가, 저가, 종가, 거래량 순으로 묶어 ohlc의 요소로 추가합니다.



>>> candlestick_ohlc(ax, ohlc, width=0.5, colorup='r', colordown='b')


주가 캔들을 그립니다. 그릴 공간은 서브플롯 ax, 데이터는 ohlc, 주가 캔들의 폭은 0.5, 양봉은 빨간색으로, 음봉은 파란색으로 그려라는 의미입니다.



>>> ax.xaxis.set_major_formatter(mdates,DateFormatter(%Y-%m-$d))

>>> ax.xaxis.set_major_locator(mticker.MaxNLocator(10))


그래프 좌표의 x축을 설정합니다. 눈금에 표시할 라벨을 날짜 형식으로 지정하고, 눈금의 개수를 10개 정도로 합니다.

이 값을 변경해보면 그래프의 모양이 바뀌는 것을 알 수 있습니다.


코드 실행 결과는 아래와 같습니다.




반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍11 - Spine과 임의의 수평선을 기준으로 상하 부분 색칠하기



Spine은 영어로 척추를 의미합니다. 척추란 동물이나 사람의 몸을 지탱하는 중요한 역할을 하죠. 플로팅에서 Spine이란 좌표의 테두리를 굵게 표시하는 것으로 생각하면 됩니다. 이번 포스팅에서는 Matplotlib으로 Spine을 표시하는 방법을 살펴보겠습니다.


그리고 또 살펴볼 것은 다음과 같습니다.

주가 그래프를 볼 때 어떤 가격을 기준으로 윗부분과 아랫부분의 영역을 다른 색상으로 칠하면 보기에 매우 직관적일 것입니다. 예를 들어 삼성전자 주가 그래프에서 125만원 아랫쪽은 파란색, 윗쪽은 빨간색으로 칠하게 되면 120만원보다 주가가 낮았을 때와 높았을 때를 구분하여 보기 쉬울 것입니다.



10편의 코드와 다른 부분만 살펴보겠습니다.


>>> ref_price = 1250000


삼성전자 주가 그래프에서 ref_price를 기준으로 위쪽과 아래쪽의 색상을 다르게 할 것입니다.



>>> ax.fill_between(date, closep, ref_price, where=(closep > ref_price), \

                     facecolor='r', alpha=0.5)

>>> ax.fill_between(date, closep, ref_price, where=(closep < ref_price), \

                     facecolor='b', alpha=0.5)


10편에서 다루었던 fill_between()에서 인자 where= 가 추가되었습니다. where= 다음에는 조건을 입력합니다. where=(closep > ref_price)는 closep의 값이 ref_price보다 클 경우에만 색으로 채우는데, 그 색은 'r'로써 빨간색이며, 투명도는 0.5로 합니다. 마찬가지로 아래의 fill_between()은 closep의 값이 ref_price 보다 작을 경우에만 파란색으로 칠하고 투명도는 0.5로 합니다.



>>> ax.spines['left'].set_color('c')

>>> ax.spines['left'].set_linewidth(5)

>>> ax.spines['right'].set_visible(False)

>>> ax.spines['top'].set_visible(False)


Spine을 설정합니다. 좌측 Spine은 색상은 cyan, 두께는 5로 지정하였고 오른쪽과 위쪽은 Spine을 보이지 않게 했습니다.

 

 

>>> ax.tick_params(axis='x', color='r')

>>> ax.tick_params(axis='y', color='#225588')

 

x축의 값을 빨간색으로 표시하고, y축의 값을 225588 값에 해당하는 색으로 나타냅니다.


 

이 코드의 실행 결과는 다음과 같습니다.



반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍10 - 격자 표시 및 x축과 그래프로 둘러싸인 부분 색으로 채우기




8편의 코드에서 야후의 Open API를 이용해 주식정보를 받아오는 코드를 별도의 파일 stockreader.py로 만들어서 다른 코드에서 재사용할 수 있도록 했습니다. 첨부로 파일을 올려 두었으니 필요하신 분은 사용하세요~


stockreader.py의 getStockData() 함수를 재사용하게 될 것이며, 이 함수의 인자는 2개로 하나는 종목코드, 나머지 하나는 주식 데이터를 뽑을 기간입니다. 뽑을 기간은 현재 기준으로 삼성전자 주가 데이터을 1년, 3년, 1달, 3달치를 각각 얻고 싶으면 아래와 같이 호출하면 됩니다.


# 현재기준 1년치, 3년치 삼성전자 주가 데이터를 가져와 data1, data2에 할당함  

>>> import stockreader

>>> data1 = stockreader.getStockData('005930', '1y')

>>> data2 = stockreader.getStockData('005930', '3y')


# 현재기준 1달치, 3달치 삼성전자 주가 데이터를 가져와 data3, data4에 할당함  

>>> import stockreader

>>> data3 = stockreader.getStockData('005930', '1m')

>>> data4 = stockreader.getStockData('005930', '3m')



getStockData의 두 번째 인자를 지정하지 않으면 디폴트로 10년치 주가 데이터를 가져옵니다.


Matplotlib 강좌를 하면서 각종 그래프를 그릴 때 아무것도 없는 백지에다 그렸습니다. 하지만 1년치 주가정보와 같이 값을 확인해야 할 필요가 있는 경우, 모눈종이처럼 격자가 있으면 확인하기가 편리할 겁니다.


자, 다음의 코드를 보시죠~




전편 코드와 비교해서 달라진 부분만 살펴봅니다.


>>> krfont = {'family': 'NanumGothic', 'weight':'bold', 'size':10}

>>> matplotlib.rc('font', **krfont)


Matplotlib에 한글을 표시할 수 있도록 matplotlib에 한글 폰트를 지정해줍니다. 'family'의 값으로 폰트 파일의 이름을 써주시면 됩니다. 우분투의 경우 폰트 디렉토리 위치는 아래와 같으니 폰트파일(.ttf)을 이곳에 복사하면 됩니다.


/usr/share/fonts/trutype/



>>> date, closep, high, low, openp, volume = stockreader.getStockData(compcode, 1)


compcode에 해당하는 주가 데이터의 1년치를 가져옵니다.



>>> ax = plt.subplot2grid((1,1), (0,0))


루트 플롯을 1 x 1로 구분한 서브 플롯을 생성하고 루트 플롯의 (0, 0)에 위치킵니다. 즉, 서브 플롯은 루트 플롯과 그 크기가 동일합니다. 우리는 여태 matplotlib의 루트 플롯에 그래프나 차트를 그리고 화면에 출력했습니다. subplot2grid()는 루트 플롯에 서브 플롯을 지정해줍니다. 루트 플롯은 하나밖에 안되지만 서브 플롯은 여러개가 될 수 있습니다. 이는 UI 프로그래밍을 할 때 루트 프레임을 여러 개의 서브 프레임으로 나누고 서브 프레임에 다양한 위젯을 위치시키는 원리와 비슷합니다. 이해를 돕기 위해 아래의 코드를 봅니다.


>>> ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)

>>> ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)

>>> ax3 = plt.subplot2grid((3,3), (1,2), rowspan=2)

>>> ax4 = plt.subplot2gird((3,3), (2,0))

>>> ax5 = plt.subplot2grid((3,3), (2,1))


위 코드는 루트 플롯을 3 x 3, 9개의 영역으로 구분하고 ax1~ax5에 해당하는 서브 플롯을 정의해주는 코드입니다. 이 코드를 실행하면 matplotlib의 루트 플롯은 아래의 그림과 같이 5개의 서브 플롯으로 구분됩니다.



ax1~ax5는 플로팅을 위한 독립적인 공간이 됩니다. 따라서 무엇을 어떻게 어떤 배치로 나타낼 것이다라는 것을 미리 스케치한 후 matplotlib의 서브 플롯을 적절하게 구성하여 그에 맞는 차트나 그래프를 그려주면 됩니다.


우리의 코드에서는 루트 플롯과 같은 크기의 서브 플롯을 생성했습니다.



>>> ax.plot_date(date, closep, '-')


서브 플롯 ax에 시간별 주식 종가를 선으로 그려줍니다.



>>> for label in ax.xaxis.get_ticklabels():

            label.set_rotation(45)


서브 플롯 ax의 x축의 라벨을 45도 각도로 틀어줍니다.



>>> ax.grid(True)


서브 플롯 ax에 격자를 보이게 합니다.



>>> plt.subplots_adjust(left=0.1, bottom=0.2, right=0.95, top=0.9, wspace=0.2, hspace=0)


서브 플롯간의 간격을 조정해줍니다. 이번 코드는 서브 플롯이 하나이므로 루트 플롯과의 간격이 됩니다. 이 값을 조정해보면 어떤 내용인지 이해할 수 있습니다.



이제 주가 그래프의 아랫 부분을 색으로 채워 보겠습니다.




처음 코드에서 한 줄이 추가되었습니다.


>>> ax.fill_between(date, 1000000, closep)


fill_between(date, 1000000, closep)는 x값은 date이고, 1000000 이상 closep 이하 부분을 디폴트 색상인 파란색으로 채웁니다. 만약 1000000을 500000으로 줄여서 다시 그려보면 아래의 그림과 같이 나옵니다.




이는 y값의 범위가 달라져서 원래의 스케일과는 좀 다르게 나타납니다. 경계부분의 트렌드는 비슷한데 상대적인 차이가 줄어든 것입니다.


채우는 색상을 변경하고자 하면 아래와 같이 하면 됩니다. 아래는 cyan으로 채우고 그리는 색을 변경합니다.


>>> ax.fill_between(date, 1000000, closep, color='c')

>>> ax.plot_date(date, closep, '-', color='c')


결과는 아래와 같이 출력됩니다.





아래 코드는 부분을 칠하는 방법입니다. 물론 이는 정상적인 방법이 아닐 수 있습니다. 코드에 대한 설명은 생략합니다.





반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍9 - pandas를 이용해 주식 차트 그리기



pandas는 파이썬을 위한 데이터 구조 및 분석을 위한 매우 편리하고 고성능의 오픈소스 라이브러리 입니다. BSD 라이선스라서 pandas를 누구나 수정하여 사용할 수 있고, 재배포의 의무가 없으며 심지어 상용 소프트웨어에서도 제한없이 사용할 수 있습니다.


8편에서 주식 차트를 그리기위해 야후의 Open API URL주소를 이용해서 데이터를 가져오고 그것을 numpy.loadtxt()라는 함수로 주가 데이터를 파싱하여 matplotlib으로 차트를 그리는 알고리즘이었습니다.


자, 이제는 pandas를 이용해 8편과 동일한 프로그램을 만들어 보겠습니다. pandas의 위력을 조금이나마 알 수 있습니다. 먼저 pandas를 사용하기 위해서는 pandas를 우리의 컴퓨터에 설치를 해야겠지요..

PIP를 이용해 pandas를 설치합니다.


D:\> pip install pandas


그리고 pandas로부터 독립을 선언(?)한 pandas_datareader 모듈을 PIP로 설치합니다.


D:\> pip install pandas_datareader


무사히 잘 설치되었다면 파이썬을 구동해서 pandas를 import 해봅니다. 오류없다면 설치끝~


이제 아래의 코드를 보시죠~




8편의 코드에 비해 많이 단순하게 되었습니다. 살포시 코드로 가보죠..


>>> import pandas_datareader.data as web


pandas의 독립적인 모듈인 pandas_datareader.data를 web이라는 별명으로 import 합니다.



>>> def viewStockTrend(compcode)


인자로 입력된 compcode에 해당되는 주가 정보를 가져와서 matploitlib으로 화면에 그래프를 그려주는 함수입니다.



>>> start = datetime.datetime(2015, 2, 2)

>>> end = datetime.datetime(2016, 7, 13)


datetime.datetime(2015, 2, 2)는 2015-02-02 00:00:00 형식으로 변환해줍니다.


start와 end는 살펴볼 기간입니다.



>>> stock = web.DataReader(compcode, 'yahoo', start, end)


이 부분은 야후로부터 종목코드 compcode에 해당하는 주가 정보를 start, end로 지정된 기간만큼 가져와서 stock 변수에 담습니다.

만약 start와 end가 생략되면 2010-01-01 부터 프로그램을 구동한 현재까지의 주가정보를 가져오고, start만 인자로 입력하면 start부터 현재까지의 주가정보를 가져옵니다.


삼성전자의 2015년 2월 2일부터 2016년 7월 13일까지의 주가 그래프를 결과로 그려줍니다.

이와 같이 pandas를 이용하면 복잡한 작업을 매우 편리하게 해주는 기능들을 활용할 수 있어 프로그래밍이 매우 단순해집니다.


pandas에 대해서는 시간이 나는대로 별도로 포스팅할 예정입니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍8 - Open API를 이용해 주식 차트 그리기




이번에는 인터넷에 공개된 API를 이용해 주식 정보를 받아오고 이에 대한 차트를 Matplotlib으로 그려보도록 하겠습니다. 불행히도 주식 정보를 API로 제공하는 국내 사이트는 없습니다.


증권사에서 자체적인 API를 제공해주고 있긴 한데, 그냥 가져다 쓰기에는 무척이나 번거로운 작업이고 절차도 까다롭습니다. 하지만 걱정은 여기까지~


우리나라 주가 정보를 편리하게 제공해주는 사이트가 하나 있는데, 바로 미국의 야후입니다.

주가 정보를 제공하는 주소는 다음과 같습니다.


http://chartapi.finance.yahoo.com/instrument/1.0/{종목코드}/chartdata:type=quote;range=10y/csv

 

예를 들어 삼성전자의 종목코드는 005930입니다. 야후는 전세계 주식 정보를 제공해주고 있어서 이 종목코드가 어느 나라의 것인지 구분하기 위해 종목코드 뒤에 식별자를 부여해줘야 하는데, 우리나라는 KS가 식별자입니다. 따라서 005930.KS가 유효한 삼성전자 종목코드가 됩니다.


인터넷 브라우저를 열고 아래의 주소를 입력한 후 엔터를 쳐보세요~


http://chartapi.finance.yahoo.com/instrument/1.0/005930.KS/chartdata;type=quote;range=10y/csv


그러면 아래와 같이 브라우저에 삼성전자에 대한 주가 정보가 텍스트로 나타납니다.



브라우저에 나타난 데이터에서 우리가 관심이 있는 것은 주가입니다. 바로 요부분입니다.

20060717,594000.0000,598000.0000,576000.0000,584000.0000,224900
....
....

이 부분은 모두 콤마로 6개 부분으로 구분되어 있습니다. 
순서대로 날짜, 종가, 고가, 저가, 시작가, 거래량입니다.

우리는 이 데이터를 받아와서 Matplotlib으로 주식 차트를 그려볼 겁니다. 일반적인 주식 차트는 그날의 종가를 기준으로 그려줍니다. 자 그러면 아래의 코드를 보시죠~

stockreader.py

stockreader.py의 주요 부분만 살펴보겠습니다.

>>> bytesdate2num(fmt, encoding='utf-8')
이 함수는 8자리로 된 날짜 데이터를 Matplotlib이 인식하는 숫자로 변경합니다. 

이제 실제로 주식 차트를 그려주는 아래의 코드를 작성합니다.

 

>>> viewStockTrend(compcode):

종목코드 compcode를 인자로 받고, 이 인자에 .KS를 추가하여 야후 주식 Open API의 {종목코드} 부분에 대입하고 urlopen() 함수를 이용해 호출합니다.
데이터를 한줄씩 읽은 후 콤마로 구분하고 그 크기가 6인 경우에, 'values'와 'labels'라는 문자가 데이터에 없으면 바로 주식 정보이므로 이것만 읽습니다. Matplotlib으로 해당 데이터를 읽어 차트를 그립니다.

삼성전자의 종목코드인 005930에 대해 위 코드를 실행하면 아래와 같은 주가 트렌드 차트가 화면에 출력됩니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍7 - 파일로부터 데이터를 읽어서 그래프 그리기




첨부한 파일(births.txt)은 1880년부터 2011년까지 미국에서 태어난 남녀 출생아 수를 정리한 데이터입니다.

이 파일은 아래와 같은 형식으로 되어 있습니다.


1880, 90993, 110491
1881, 91954, 100745
1882, 107850, 113688

....

....


각 숫자는 콤마로 구분되어 있고 첫번째 데이터는 년도, 두번째 데이터는 여자 아기 출생수, 세번째 데이터는 남자 아기 출생수입니다.

우리가 해볼 것은 이 데이터를 읽어서 여자 아기와 남자 아기의 출생수 추이를 그래프로 나타내 보고자 합니다.


자, 코드를 바로 보실까요..




>>> import csv


파일로부터 데이터를 편리하게 읽어 들이기 위해 csv 모듈이 제공하는 reader()를 사용할 예정입니다.



>>> years = range(1880, 2012)


년도의 범위는 1880년에서 2011년 까지로 합니다.



>>> with open(datafile, 'rb') as f:

          data = csv.reader(f, delimiter = ',')

          for d in data:

               pieces.append(d)


births.txt 파일을 바이너리 읽기 모드로 열고 그 핸들을 f로 합니다. csv.reader(f, delimiter = ',')은 구분자를 콤마로 해서 파일 f의 데이터를 읽고 구분하여 변수 data에 할당합니다.

data는 [['1880', '90993', '110491'], ['1881', '91954', '100745'], ['1882', '107850', '113688'],....] 와 같은 형식이 됩니다.


x, y1, y2에 각각 data의 첫번째 데이터인 년도, 두번째 데이터인 여자 아기 출생수, 세번째 데이터인 남자 아기 출생수만 따로 모아서 구성합니다.



>>> p1 = plt.plot(x, y1, 'r^--', label='female')

>>> p2 = plt.plot(x, y2, 'bs-', label='male')


데이터를 그래프로 그립니다. plot의 세번째 인자인 'r^--'은 점선으로 연결된 빨간색 삼각형,  'bs-'은 선으로 연결된 파란색 사각형을 의미합니다. 그래프를 그릴 때 마커에 대한 내용은 4편에서 이미 살펴보았습니다.  


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍6 - Matplotlib으로 파이 차트 그리기




파이 차트는 전체를 이루는 각 구성 요소가 전체 중 얼마만큼의 비중으로 되어 있는지 파악하기 매우 좋은 그래프 유형입니다. 바로 코드를 보실까요..




파이 차트를 그리기 위한 데이터는 누적 영역 그래프에서 사용된 어느 사람의 한달 동안 하루 일과 데이터입니다.


>>> activities = ['sleeping', 'working', 'eating', playing']


파이 차트의 라벨을 정의합니다. 이는 데이터 순서와 동일해야 합니다.



>>> n = 11

>>> title = 'Pie Chart for %d day' %(n+1)

>>> plt.title(title)


한 사람의 한달 동안 하루 일과에서 12일 부분을 선택하여 파이 차트를 그릴 예정입니다. 타이틀을 그에 맞게 구성합니다.



>>> slice = [sleeping[n], working[n], earing[n], playing[n]]


파이 차트를 구성하는 슬라이스 데이터를 정의합니다. 한달 데이터에서 12번째 데이터를 각각 취해서 하나의 리스트로 구성합니다.



>>> plt.pie(slice, labels=activities, startangle=90, shadow=True,

                explode=(0, 0, 0.1, 0), autopct='%1.1f%%')


파이 차트를 그려주는 Matplotlib 함수는 plt.pie()입니다. 인자는 다음과 같습니다.


  • slice: 파이 차트를 구성할 데이터
  • labels: 파이 조각의 라벨
  • startangle: 그려지는 파이 조각 시작 위치. 90이면 12시 방향임. 파이 조각은 이 각도를 기준을 반시계 방향으로 그려짐
  • shadow: 파이 차트의 그림자 효과 유무
  • explode: 파이 조각이 돌출되는 크기. 0이면 돌출되지 않음
  • autopct: 파이 조각의 전체 대비 백분율.


코드에서 explode는 3번째 파이 조각을 돌출하게 했습니다. 그리고 autopct에서 파이 조각 백분율은 소수점 1자리까지 %로 표기하도록 했습니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍5 - Matplotlib으로 누적 영역 그래프 그리기



누적 영역 그래프(Stacked Area Graph)는 전체에서 부분이 차지하는 것을 쉽게 보이게 하는 그래프의 한 종류입니다. 이런 목적을 가진 다른 유형의 그래프는 파이 차트입니다. 누적 그래프는 시간의 경과에 따라 각 부분들이 어떻게 변해가는지 살펴보기에 좋은 유형의 그래프인 반면, 파이 차트는 특정 기간 동안 각 부분이 얼만큼 비중을 차지하는가를 살펴보기에 좋은 그래프입니다.


일단 누적 영역 그래프를 그려보겠습니다.




이 코드는 1에서 180도까지 사인 그래프 4개를 누적시킨 그래프를 그립니다.

Matplotlib의 누적 영역 그래프를 그리는 함수는 plt.stackplot() 입니다.


>>> plt.stackplot(days, y1, y2, y3, y4, colors=colors)


x축 방향으로는 days를 위치시키고 y1, y2, y3, y4를 누적하여 그래프를 그립니다. 각 그래프 영역의 색상은 colors로 정의합니다.



보다 실제적인 누적 영역 그래프를 그려보도록 하겠습니다.


어느 한 사람의 하루 일과중 소비하는 시간 추이를 보여주는 그래프를 그리는 코드입니다.




어느 사람의 한달동안 생활 패턴을 분석한 결과를 누적 영역 그래프로 표시하는 코드입니다.

사용한 Matplotlib 함수는 동일하지만, 그래프를 그리기 위한 데이터가 달라졌습니다. sleeping, working, eating, playing의 동일한 위치의 요소들의 합은 모두 24가 됩니다. 하루는 24시간이므로 이 값은 변함이 없어야 겠지요.


playing의 색상은 'k'로 지정했는데, 이는 검정색을 나타냅니다. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍4 - Matplotlib으로 산점도 그리기




산점도(Scatter plot)는 2차원 또는 3차원 좌표에 도형으로 표시를 하여 데이터의 상관관계 등을 파악하기 위해 주로 사용됩니다.


아래의 코드는 1에서 100까지 수를 마구 섞어 x좌표, y좌표를 만들고 산점도 결과를 출력하는 코드입니다.




산점도를 그려주는 Matplotlib 함수는 plt.scatter() 입니다. scatter() 함수의 인자는 다양한데, 이 코드에서는 x, y좌표와 라벨, 표시할 도형 종류, 그리고 색상만 인자로 정의했습니다.


산점도에서 표시할 수 있는 도형은 marker= 로 지정하면 되는데, Matplotlib에서 제공하는 마커의 종류는 여기를 참고하세요. 


산점도 그리기를 좀 더 응용해 보겠습니다.




위 코드는 Numpy 배열을 활용하여 50개의 좌표를 무작위로 만들고, 산점도를 원 모양으로 그리되 원의 크기를 무작위로, 원의 색상도 무작위로 해서 그려줍니다.


>>> x = np.random.rand(N)

>>> y = np.random.rand(N)


0에서 1사이의 N개의 수를 무작위로 생성하여 numpy 배열로 구성합니다. 마찬가지로 colors와 area를 50개의 요소를 무작위로 만들어 numpy 배열로 구성합니다. area는 0~15 포인트 사이의 값을 가집니다.



>>> plt.scatter(x, y, label='samples', s=area, c=colors, alpha=0.5)


scatter()의 인자 s는 도형의 크기, c는 도형의 색상, alpha는 색상의 투명도를 지정합니다. alpha의 값이 0이면 완전 투명이고, 1이면 완전 불투명입니다. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍3 - Matplotlib으로 막대그래프, 히스토그램 그리기




막대 그래프(Bar Chart)나 히스토그램은 특정 그룹의 데이터의 추세와 정량적인 분포를 파악하는데 매우 유용합니다. 



Matplotlib으로 막대 그래프 그리기

다음과 같은 두 개의 데이터 세트가 있다고 가정합니다.


세트1: (1, 5), (3, 3), (5, 9), (7, 2), (9, 8) 

세트2: (2, 8), (4, 7), (6, 2), (8, 11), (10, 4)


이를 막대 래프로 그리기 위한 코드는 아래와 같습니다.




>>> plt.bar(data_x1, data_y1, label='Set 1', color='b')


Matplotlib에서 막대 그래프를 그리는 함수는 plt.bar() 입니다. 막대의 폭을 지정하지 않으면 막대의 폭이 0.8로 정해집니다. data_x1으로 지정된 좌표에서 폭이 0.8이고 높이가 data_y1, color로 지정된 색상의 막대를 그립니다. Matplotlib에서 색상은 'r'이 Red, 'g'는 Green, 'b'는 Blue를 뜻합니다.


color값으로 #AA2848 처럼 RGB의 색상값으로 표현해도 됩니다.


위 코드에서 Set 2의 막대 그래프 색상을 #AA2848로 저정하여 실행하면 아래와 같은 결과가 나옵니다.




막대의 폭 0.5로 조정하고 싶다면 plt.bar()의 인자로 width = 0.5를 지정하면 됩니다. 아래는 Set 2의 막대그래프 폭을 0.5로 지정하여 출력한 결과입니다.





Matplotlib으로 히스토그램 그리기

히스토그램은 막대그래프와 모양은 비슷하나, 데이터가 있을 때 특정 범위의 값들을 그룹화하여 막대그래프 모양으로 표시하는 것입니다. 예를 들어 아래와 같은 30개의 데이터가 있다고 가정합니다.


22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48,16,11


이 데이터를 10단위의 간격으로 히스토그램을 그리는 코드는 아래와 같습니다. 


 



Matplotlib에서 히스토그램을 그리는 함수는 plt.hist() 입니다. 위 코드에서 변수 bins는 데이터 분류 기준이 되는 간격을 정의합니다. 여기서는 0~10, 11~20, 21~30,, 과 같이 간격을 10으로 정의했습니다. 히스토그램에서 BIN은 분류하고자 하는 범위라고 생각하면 됩니다. data에 있는 값들을 헤아려서 0~10, 11~20,,, 범위에 있는 개수를 히스토그램으로 나타냅니다. 


결과를 보면 data에 있는 값들 중 0~10 사이에 있는 값은 1개, 60~70사이에 있는 값은 2개임을 알 수 있습니다.


만약, 데이터를 분류하는 범위를 수동으로 지정하지 않고 BIN의 크기로 정해줄 수도 있습니다. data에 있는 값들을 분류하여 BIN의 크기대로 범위를 자동으로 정하고 결과를 화면에 출력하는 것이죠.


위 코드에서 bins = 8로 수정하고 실행하면 아래와 같은 결과가 출력됩니다.




BIN의 크기에 따라 data를 분류하는 값의 범위가 자동적으로 조정되었음을 알 수 있습니다.


이미치 처리를 위해 히스토그램을 응용하기도 하는데, 여기를 눌러 살펴보세요~ 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍2 - Matplotlib에 제목, 라벨, 레전드 삽입하기




데이터를 분석하고 그 결과만 화면에 출력한다면 이게 무슨 데이터를 분석하여 나온 결과인지 전혀 모를 수 있습니다.

따라서 결과 화면에 제목과 라벨, 레전드 등을 삽입하여 결과를 보는 사용자에게 친절함을 베풀어주는 것이 중요하겠죠.


이번 포스팅에서는 Matplotlib을 이용해 결과를 화면에 출력하되 제목과 라벨, 레전드를 삽입하는 방법에 대해 알아봅니다. 아래는 Jupyter Notebook으로 코딩을 하고 실행한 후 결과를 보인 것입니다.




이 코드는 0도에서 360도 범위에서 삼각함수의 사인함수와 코사인함수의 그래프를 화면에 출력합니다.

plt.plot()에 대해서는 이전 포스팅에서 배웠으므로, 우리의 주제인 제목과 라벨, 레전드 삽입 코드만 살펴보겠습니다.



>>> plt.plot(xs, ys1, label='SIN Curve')

>>> plt.plot(xs, ys2, label='COS Curve')


사인곡선과 코사인곡선을 계산하여 그리되 라벨링을 포함합니다.



>>> plt.xlim([0, 360])


출력할 때 x 값의 범위를 0에서 360도로 제한합니다.



>>> plt.xlabel('X value')

>>> plt.ylabel('Y value')


plt.xlabel()과 plt.ylabel()은 각각 Matplotlib이 출력한 그래프의 x축과 y축에 라벨링하는 함수입니다. 



>>> plt.title('Trigonometric Function')


plt.title()은 Matplotlib이 출력한 결과 화면에 제목을 표시합니다.



>>> plt.legend()


각 곡선에 라벨링한 것을 레전드로 표시합니다.



>>> plt.show()


결과를 화면에 출력합니다.


이제 Matplotlib을 이용한 결과가 좀 풍성해진 것 같네요.. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍1 - Matplotlib 시작하기



요즘 IT업계에서 유행하는 용어가 '빅데이터' 입니다.

빅데이터는 말그대로 용량이 매우 큰 데이터라는 말인데, 좀 더 세밀하게 정의하면 이 의미 의외에 몇가지가 더 있습니다.




아무튼 데이터든 빅데이터든 이들을 분석해서 의미있는 자료로 가공하는 것이 중요한 일이고, 가공된 데이터는 사람이 알아보기 쉽게 시각화(비주얼라이제이션; Visualization) 해주는 것이 중요합니다.


빅데이터 분석을 위한 강좌를 하기 전에 먼저 데이터를 시각화 하는 방법에 대해 살펴보도록 하겠습니다.


먼저 환경은 윈도우 10, 파이썬 3.5.2 입니다. 파이썬 2.7.x 버전을 사용하시는 분들은 일부 코드가 호환되지 않을 수 있으니 참고하세요.


파이썬 라이브러리 Matplotlib은 데이터 분석 결과를 시각화 하는데 필요한 막대 그래프, 선 그래프, 파이 차트, 바 차트 등 다양한 그래프와 차트를 생성하는 함수들을 제공합니다. 일단 Matplotlib을 설치해야 겠네요. 윈도 커맨드창에서 PIP를 이용해 다음과 같이 Matplotlib을 설치하면 필요한 모듈을 모두 알아서 설치해줍니다.


pip install matplotlib


만약 PIP로 matplotlib이 제대로 설치되지 않으면 여기로 가서 차근차근 읽어보고 matplotlib을 설치해보기 바랍니다.


Matplotlib이 제대로 설치되었는지 윈도 명령 프롬프트창에서 파이썬을 실행하고 matplotlib을 import 해봅니다.


>>> import matplotlib


아무 오류없이 import가 되면 성공적으로 설치가 된 것입니다.


자, 그러면 파이썬을 실행하거나 에디터를 이용해 다음과 같이 간단한 코드를 한번 작성해봅니다.


>>> import matplotlib.pyplot as plt

>>> xs = [x for x in range(10)]

>>> ys = [y*y for y in range(10)]

>>> plt.plot(xs, ys)

>>> plt.show()


이 코드는 matplotlib.pyplot을 import 하는데 이 녀석의 별명을 plt로 정의합니다.


plt.plot(xs, ys)는 리스트인 xs와 ys를 이용해 그려야 할 좌표를 정의하고 이 좌표들을 선으로 연결합니다.

xs와 ys는 수가 멤버인 크기가 동일한 리스트여야 합니다.


plt.show()는 결과를 화면에 그려줍니다.


이 코드를 실행하면 아래와 같이 matplotlib 윈도우가 생성되고 결과를 화면에 그려줍니다.




matplotlib 윈도우 아랫부분에는 결과를 다양하게 탐색할 수 있는 버튼들이 있습니다. 마치 인터넷 브라우저의 버튼과 비슷해 보입니다. 맨 왼쪽 집모양은 홈버튼입니다. 결과를 확대하고 축소하고 옮겨다니다가 맨 처음 모양으로 되돌리는 버튼입니다.


화살표 모양의 버튼은 뒤로 가기와 앞으로 가기 버튼입니다. 결과들을 이리저리 보다가 인터넷 브라우저 처럼 이전의 결과를 보고 싶으면 왼쪽 화살표 버튼을, 이후의 결과를 보고 싶으면 오른쪽 화살표 버튼을 이용합니다.


십자가 모양의 화살표는 결과를 이리저리 옮길 수 있다는 것을 표시해주는 아이콘입니다. 결과 화면에 마우스 왼쪽  버튼을 누른 채로 이동하면 결과를 아래 위나 왼쪽 오른쪽으로 이동할 수 있습니다.




결과 화면에 마우스 오른쪽 버튼을 누른채로 움직이면 결과를 확대하거나 축소할 수 있습니다. 아래 그림은 결과를 임의로 축소해본 것입니다.




다섯번째 아이콘을 클릭하면 결과 화면의 특정 부분을 사각형 영역으로 지정하여 확대해 볼 수 있습니다. 아래 그림은 사각형 영역으로 지정한 후 확대한 것입니다.




여섯번째 아이콘을 클릭하면 아래 그림과 같이 그림판의 여백을 조절할 수 있는 게이지가 나타납니다.



아래 그림은 right 여백을 조정한 결과입니다. 게이지 조정에 따른 결과 화면입니다.




이번 포스팅에서는 matplotlib의 기본적인 사항에 대해 가볍게 살펴보았습니다.


참고로 데이터 시각화 프로그래밍2에서는 데이터 분석을 위한 프로그래밍 도구로 많이 활용되는 Jupyter Notebook을 이용할 예정입니다. Jupyter Notebook에 대한 자세한 내용은 아래의 링크를 참조하세요.


Jupyter Notebook 개요 및 설치 


반응형

+ Recent posts

반응형