私はこれに対して別の答えを出しましたが、あなたの特定の質問に正確に答えていないだけで、まだ良いと信じているので元のままにします。
また、少なくとも私の側では、問題をもう少し意味のあるものにするために、さらにいくつかのデータ行を生成しました。
これを解決したのは、特定の時刻に対応する分数である 5 番目の列 (csv ではなくコード) を生成することでした。つまり、11:59 は 719 分にマップされます。パンダを使用して、この新しい列をデータフレームに挿入しました。次に、60 分ごとに 1 時間ごと (「0:00」、「1:00」など) の文字列 ticklabels を配置できます。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv('Workbook2.csv', header=None)
print data
私の偽造されたデータを印刷します:
0 1 2 3 4
0 ML INT 0.10 534.15 0:00
1 ML EXT 0.25 654.23 3:00
2 ML INT 0.30 743.12 6:30
3 ML EXT 0.35 744.20 4:30
4 ML INT 0.45 811.47 7:00
5 ML EXT 0.55 777.90 5:45
6 ML INT 0.66 854.70 7:54
7 ML EXT 0.74 798.40 6:55
8 ML INT 0.87 947.30 11:59
次に、時を分に変換する関数を作成します。
def convert_to_min(o_clock):
h, m = o_clock.split(':')
return int(h) * 60 + int(m)
# using this function create a list times in minutes for each time in col 4
min_col = [convert_to_min(t) for t in data[4]]
data[5] = min_col # inserts this list as a new column '5'
print data
新しいデータ:
0 1 2 3 4 5
0 ML INT 0.10 534.15 0:00 0
1 ML EXT 0.25 654.23 3:00 180
2 ML INT 0.30 743.12 6:30 390
3 ML EXT 0.35 744.20 4:30 270
4 ML INT 0.45 811.47 7:00 420
5 ML EXT 0.55 777.90 5:45 345
6 ML INT 0.66 854.70 7:54 474
7 ML EXT 0.74 798.40 6:55 415
8 ML INT 0.87 947.30 11:59 719
次に、x 軸と y 軸のデータ、目盛りラベル、目盛りの位置を作成します。
INTs = data[data[1]=='INT']
EXTs = data[data[1]=='EXT']
int_dist = INTs[3] # x-axis data for INT
ext_dist = EXTs[3]
# plotting time as minutes in range [0 720]
int_time = INTs[5] # y-axis data for INT
ext_time = EXTs[5]
time = ['0:00', '1:00', '2:00', '3:00', '4:00', '5:00',
'6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00']
# this will place the strings above at every 60 min
tick_location = [t*60 for t in range(13)]
今プロット:
fig, ax = plt.subplots()
ax.scatter(int_dist, int_time, c='orange', s=150)
ax.scatter(ext_dist, ext_time, c='black', s=150)
ax.set_yticks(tick_location)
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.title('Seems to work...')
plt.show()
