2

X 軸に時間を、Y 軸に方​​向を指定して、デカルト プロットに風向測定値をプロットしたいと考えています。359 度から 0 度に移動すると方向がラップするため、359 度と 0 度を結ぶ線を引くのは不適切です。

短いジャンプがラップしない場合、条件付きで接続線を引くことは可能ですか? つまり、必要に応じて接続線を使用した一連の値を次に示します。

10—15—30—90—150—290—350 40—50—20 310—250—150

AとBの間に線があるかどうかを判断するには、次の式のようなものを使用すると思います。

max(A,B) - min(A,B) <= 180
4

2 に答える 2

3

質問を書いているときに、私は実用的なアプローチを思いつきました: 単純にNone値を追加すると、データが連続しておらず、線が途切れていることを示します。

完璧にするために、範囲外にポイントを追加して、たとえば線がプロットの上部から出て下部から出てくるようにしました。

これは、関連するデータ ポイントを追加する単純なジェネレーターを使用して行われました。

def break_degree_wrap(values):
    values1, values2 = itertools.tee(values)

    # Yield the first value
    yield next(values2)

    for (prev_datetime, prev_val), (datetime, val) in itertools.izip(values1, values2):

        # If the data wraps over the top
        if val > prev_val and val - prev_val > 180:
            yield (datetime, val - 360)
            yield (datetime, None)
            yield (prev_datetime, prev_val + 360)

        # If the data wraps under the bottom
        elif val < prev_val and prev_val - val > 180:
            yield (datetime, val + 360)
            yield (datetime, None)
            yield (prev_datetime, prev_val - 360)

        # Add each original value
        yield (datetime, val)

これは、ハードコーディングされた (0, 360) の代わりに、有効な範囲を受け入れるように簡単に一般化できます。

これがどのように見えるかです(悪い軸を許してください:-) 風向き

于 2013-04-17T10:51:57.240 に答える
3

私は常に np.diff() 関数を使用して、変化が 180 度より大きいポイントを取得し、マスクされた要素を挿入します。主な欠点は、プロットのために「インデックス」も保持する必要があることです。

そう:

a = np.array([10,15,30,90,150,290,350,40,50,20,310,250,150])
idx = np.arange(len(a))

b = np.diff(a)
mask = np.where(np.abs(b) >= 180)[0]+1

c = np.ma.masked_equal(np.insert(a, mask, -1), -1)
idx = np.ma.masked_equal(np.insert(idx, mask, -1), -1)

fig, ax = plt.subplots(figsize=(10,3))

ax.plot(idx, c)
ax.set_xticks(idx)
ax.set_ylim(0,360)

ここに画像の説明を入力

これは範囲外の値を挿入しませんが、追加できると思います。マスクされた 1 つの要素の代わりに、2 つの要素を挿入して、グラフの「外」と「内」に再び挿入することができます。

また、180 度というしきい値は単なる仮定に過ぎないことに注意してください。実際に測定しない限り、風が後退しているのか方向転換しているのかはわかりません。

于 2013-04-17T12:21:36.660 に答える