Python Bokeh를 통한 마라톤 데이터 시각화

개요


Python의 Bokeh를 사용하여 좋아하는 마라톤 데이터를 시각화합니다.

Bokeh


웹 브라우저를 대상으로 하는 상호 작용 파이톤의 시각 형상 라이브러리입니다.
https://bokeh.pydata.org/en/latest/

특징.


• 결과는 이미지가 아닌 HTML 파일 생성
・상호작용 가능
그림% 1개의 캡션을 편집했습니다.
단추와 슬라이더 등의 표시
・파이썬 외에도 스칼라, R, 줄리아 등에서 사용 가능
· Jupter Notebook의 디스플레이도 지원

시각 형상 데이터


나는 2014년부터 마라톤을 시작해 매년 풀코스에 참가한다.
지난해 연간 목표치인 회 3.5(3시간 반 만에 종점)에 도달했다.
2016년부터 런타스틱이라는 달리기 기록 애플리케이션을 사용해 2016년 이후 마라톤 데이터가 저장됐다.Bokeh를 사용하여 이 데이터를 시각화합니다.
(공식 시간과 약간의 오차가 있음)
・Runtastic
https://www.runtastic.com/ja
일자
타임
2016/10/30
3시간 52분 14초.
2017/10/29
3시간 56분 18초.
2018/10/28
3시간 59분 00초.
2018/11/25
3시간 28분 09초

마라톤 데이터의 가시화


먼저 그려보세요.
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import DatetimeTickFormatter
from datetime import datetime as dt
import math

xlist=['2016-10-30', '2017-10-29', '2018-10-28', '2018-11-25']
ylist=['03:52:14', '03:56:18', '03:59:00', '03:28:09']

# xlist,ylistを datetime型に変換
xlist = [dt.strptime(d, '%Y-%m-%d') for d in xlist]
ylist = [dt.strptime(d, '%H:%M:%S') for d in ylist]

# データをプロット
p = figure(
            title="マラソンリザルト2016-2018",
            x_axis_type='datetime',
            y_axis_type='datetime',
            x_range=(dt.strptime('2016-07-01','%Y-%m-%d'),
                   dt.strptime('2019-01-01', '%Y-%m-%d')),
            y_range=(dt.strptime('03:00:00','%H:%M:%S'),
                    dt.strptime('04:30:00','%H:%M:%S')),
            x_axis_label='日付',
            y_axis_label='タイム'
            )

p.circle(xlist, ylist)

# X軸の設定
x_format = "%Y/%m/%d"
p.xaxis.formatter = DatetimeTickFormatter(
    days=[x_format],
    months=[x_format],
    years=[x_format]
)
p.xaxis.major_label_orientation = math.radians(90)

# Y軸の設定
y_format = "%H:%M:%S"
p.yaxis.formatter = DatetimeTickFormatter(
    seconds=[y_format],
    minutes=[y_format],
    hours=[y_format]
    )
show(p)

상기 코드p.circle(xlist, ylist)의 부분을 p.line(xlist, ylist, legend="Temp.", line_width=2)로 변경하면 다음과 같은 도표를 그릴 수 있다.

조금씩 느려지던 시간이 갑자기 빨라졌다는 말은 이해하기 쉬운 방식으로 표현했다.
2018년 10월 요코하마 마라톤, 11월 마라톤에 참가했다.
요코하마 마라톤은 연습으로 참가했는데 마라톤에 참가했다면 3.5점을 열심히 완주했다.

축파 마라톤의 속도 가시화


축파마라톤은 1km마다 남아있기 때문에 가시화해 보세요.
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import DatetimeTickFormatter
from datetime import datetime as dt
import math
xlist = []
for i in range(1, 44):
    xlist.append(i)

ylist=['4:49', '5:02', '4:59', '4:44', '4:58', '4:55', '4:59', '4:50', '4:53', '4:49',
       '4:51', '4:49', '4:49', '4:44', '4:59', '4:48', '4:44', '4:52', '4:47', '4:48',
       '4:48', '4:45', '4:43', '4:50', '4:42', '4:43', '4:48', '4:44', '5:10', '4:43',
       '4:38', '5:01', '5:12', '4:50', '4:56', '4:54', '4:57', '5:00', '4:42', '4:44',
       '4:50', '4:56', '5:00']

# xlist,ylistを datetime型に変換
xlist = [d for d in xlist]
ylist = [dt.strptime(d, '%M:%S') for d in ylist]

# データをプロット
p = figure(
            title="つくばマラソンリザルト 2018/11/25",
            y_axis_type='datetime',
            y_range=(dt.strptime('4:00','%M:%S'),
                    dt.strptime('6:00','%M:%S')),
            x_axis_label='距離(km)',
            y_axis_label='タイム(分)'
            )
p.line(xlist, ylist, legend="ペース", line_width=2)
p.xaxis.major_label_orientation = math.radians(90)
# Y軸の設定
y_format = "%M:%S"
p.yaxis.formatter = DatetimeTickFormatter(
    seconds=[y_format],
    minutes=[y_format]
    )
show(p)

일정한 속도로 달릴 수 있었지만 후반부에는 조금 흩어졌다.
역시 30kg 넘으면 피곤할 텐데...
늦어진 부분을 되찾기 위해 발걸음이 빨라졌고, 이후 또 떨어졌다.
출력된 도표는 상호작용을 할 수 있습니다:.

끝말


Pythn의 Bokeh로 시각화를 시도했습니다.
간단하게 느낄 수 있는 도표를 끌어당기고 확대하고 축소하며 직관적으로 조작했다.
마라톤과 관련해서는 다년간 목표했던 3.5점을 달성한 뒤 소진돼 최근 잘 뛰지 못하고 있다.
올가을에도 풀코스를 뛸 예정이니 더운 시기를 넘기고 뛰자.
매년 마라톤 할 때마다 스키를 타고 싶다

참고 문헌


설치
  https://bokeh.pydata.org/en/latest/docs/installation.html
· 빠른 시작 안내
  https://bokeh.pydata.org/en/latest/docs/user_guide/quickstart.html
· Bokeh에 관한 기사
  https://qiita.com/yuji38kwmt/items/4edf1d87568a860fc3b8#bokeh

좋은 웹페이지 즐겨찾기