Pythonでグラフを描く
東京マラソンの記録をPythonを使ってグラフにしてみました。
その内容をメモに残しておきます。
■やりたいこと
東京マラソンの5kmごとのラップタイムをグラフにしたい。
■環境
Windows7にAnacondaをインストールして使っています。
Anaconda:
Python本体と科学技術計算、可視化のライブラリを含んだディストリビューションパケージ
https://store.continuum.io/cshop/anaconda/
■表示する記録
東京マラソンの記録をTime.csvというCSVファイルにします。
こんな感じ。
KM,TIME 5,0:36:54 10,1:04:20 15,1:32:02 20,1:59:29 25,2:26:48 30,2:54:24 35,3:24:01 40,3:51:53 42.195,4:03:56
これを適当なディレクトリに置きます。
C:\Anaconda\work
■やり方
CSVファイルを取り込みます。
import pandas as pd
tm = pd.read_csv("C:\Anaconda\work\Time.csv", skiprows=1, names=['km', 'time'], encoding='Shift_JIS')
In [60]: tm
Out[60]:
km time
0 5.000 0:36:54
1 10.000 1:04:20
2 15.000 1:32:02
3 20.000 1:59:29
4 25.000 2:26:48
5 30.000 2:54:24
6 35.000 3:24:01
7 40.000 3:51:53
8 42.195 4:03:56
[9 rows x 2 columns]
csvで取り込んだだけではtimeは数値ではないので経過時間の形に変換します。
tmd = pd.to_timedelta('0' + tm['time'])
In [7]: tmd
Out[7]:
0 00:36:54
1 01:04:20
2 01:32:02
3 01:59:29
4 02:26:48
5 02:54:24
6 03:24:01
7 03:51:53
8 04:03:56
Name: time, dtype: timedelta64[ns]
これで経過時間(nanoseconds)になりました。
続いてデータフレームを作ります。
from pandas import DataFrame
data = {'KM':tm['km'], 'TIME':tmd }
frame = DataFrame(data)
In [12]:frame
Out[12]:
KM TIME
0 5.000 00:36:54
1 10.000 01:04:20
2 15.000 01:32:02
3 20.000 01:59:29
4 25.000 02:26:48
5 30.000 02:54:24
6 35.000 03:24:01
7 40.000 03:51:53
8 42.195 04:03:56
[9 rows x 2 columns]
ここでpandasというライブラリを使っています。
pandasというのはPythonにRのデータフレームのような型を持たせるライブラリで
行列計算ができ、Rでやっていたような集計作業がPythonでも楽にできるようになります。
http://pandas.pydata.org/
つづいてラップタイムを算出します。
list = [frame.TIME[0]] n = 0 while (n < 8): list.append( frame.TIME[n + 1] - frame.TIME[n]) n += 1 In [16]: list Out[16]: [numpy.timedelta64(2214000000000,'ns'), numpy.timedelta64(1646000000000,'ns'), numpy.timedelta64(1662000000000,'ns'), numpy.timedelta64(1647000000000,'ns'), numpy.timedelta64(1639000000000,'ns'), numpy.timedelta64(1656000000000,'ns'), numpy.timedelta64(1777000000000,'ns'), numpy.timedelta64(1672000000000,'ns'), numpy.timedelta64(723000000000,'ns')]
これでラップが計算できたので
frameにデータを挿入します。
frame['RAP'] = list
In [18]: frame
Out[18]:
KM TIME RAP
0 5.000 00:36:54 00:36:54
1 10.000 01:04:20 00:27:26
2 15.000 01:32:02 00:27:42
3 20.000 01:59:29 00:27:27
4 25.000 02:26:48 00:27:19
5 30.000 02:54:24 00:27:36
6 35.000 03:24:01 00:29:37
7 40.000 03:51:53 00:27:52
8 42.195 04:03:56 00:12:03
これをグラフにします。
%pylab
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
y = frame.RAP
x = frame.KM
ax.plot(x, y, 'wo')
plt.xlabel('KM')
plt.ylabel('TIME')
plt.grid()
plt.xlim(xmin = 0)
plt.xticks(np.arange(0, 45, 5))
plt.ylim(ymin = 60 * 10 * 10**9)
plt.ylim(ymax = 60 * 10 * 4 * 10**9)
plt.yticks(np.arange(60 * 10 * 10**9, 60 * 10 * 4 * 10**9, 60 * 10 * 10**9 / 4))
グラフが一旦できましたが、これだとY軸がnanosecondになっているので
見やすいようにhh:mm:ssで表示するようにします。
from matplotlib.ticker import FuncFormatter as ff
def m2hm(y, i):
h = int(y/1000000000/3600)
m = int(y/1000000000/60)
s = int(y/1000000000%60)
return '%(h)02d:%(m)02d:%(s)02d' % {'h':h,'m':m,'s':s}
ax.yaxis.set_major_formatter(ff(m2hm))
できました。
もっとうまくできるのかも知れませんが
なんせ素人なのでこんなもんかと。
■その他メモ
線を青色にする。 ax.plot(x, y, color="blue")
以上
関連する投稿:
- 2017-01-21:Yahoo!Japan ファイナンス から株価の取得
- 2016-01-08:みたけ山トレイルランのヒストグラム
- 2017-09-03:influxDBからDataFrameの形にする方法
- 2017-02-11:Python3でビットコインの回帰線を描いてみる
- 2016-11-26:再びの”みたけ山トレイルラン”のヒストグラム

“Pythonでグラフを描く” への1件の返信