3

Matplotlib を使用して、レース イベントからの速度/距離データをプロットしています。たとえば、距離と時間です。時間は横軸、距離は縦軸です。

私の入力は 2 つのベクトルで、1 つは「イベント開始からの秒数」の時間値を含み、もう 1 つは「これまでの移動距離」を含みます。同じプロットに多くのアスリートがいる可能性があるため、それらを比較できます。

問題は、純粋な時間をプロットすると、X 軸が秒数で表示されることです。これは読むのが自然ではありません。

ここに画像の説明を入力

実際の日付と時刻に従ってデータをプロットでき、読み取り可能な結果が得られますが、それは絶対時間であり、イベント開始からの経過時間ではありません (これは午前 6:00 頃に開始されました)。

ここに画像の説明を入力

私が望むのは、経過時間をHMS形式(2番目のグラフィックと同じですが、イベント開始に関連する時間)で取得する方法であり、おそらくズームレベルの「認識」(時間:分に切り替え、次に日:スケールに関係のないデータでラベルが近づきすぎないように、ズームレベルが変更される時間)。

助けてくれてありがとう!

4

2 に答える 2

3

最も簡単な方法は、HMS への変換を行う独自のFormatter( doc ) を作成することだと思います。

import matplotlib

class myFormatter(matplotlib.ticker.Formatter):
    def __call__(self,in_value_in_seconds,pos=None):
        hours = int(in_value_in_seconds//(3600))
        in_value_in_seconds -= hours * 3600
        mins = int(in_value_in_seconds//(60))
        in_value_in_seconds -= mins * 60
        secs = int(in_value_in_seconds)

        return str(hours) + ":" + str(mins) + ":" + str(secs)

これは (私が思うに) 最も単純なケースで、ズームはサポートしていません。このロジックの一部をオブジェクトに押し込むdatetime.deltatime(またはそれらを引数として受け取る) 方がよい場合があります。

MultipleLocator( doc )と組み合わせると、目盛りの場所を細かく制御できます。

于 2012-09-25T16:10:45.523 に答える
1

私は次のことを理解しました。それが私が使用しているものです。まだ完全ではありません (主要なティックとして 60 の倍数を使用しません) が、フォーマット自体は私が望むものです:

def HMS(seconds, pos):
    seconds = int(seconds)
    hours = seconds / 3600
    seconds -= 3600 * hours
    minutes = seconds / 60
    seconds -= 60 * minutes
    if hours == 0:
        if minutes == 0:
            return "%ds" % (seconds)
        return "%dm%02ds" % (minutes, seconds)
    return "%dh%02dm" % (hours, minutes)

ax = plt.gca()
ax.xaxis.set_major_formatter(plt.FuncFormatter(HMS))
于 2012-09-25T16:22:50.577 に答える