3

タイトルを質問よりややこしくしてしまったかもしれませんが…!

360 => 0 度の線、つまり 358,359,0,1,2.... にまたがる、xy 平面で連続した角度データがあります。

これらをプロットして設定した場合:

 plt.xlim(0,360)

もちろん、プロットの左端に 3 つの点、右端に 2 つの点があります。これは、こちらの (より複雑で実際の) プロットで確認できます (x 軸の範囲は意図的に反転されています)。

角度的にラップされたデータセット

私が本当に望むのは、すべてのドットをプロット ウィンドウの同じ位置に、おそらくプロットの中心に向かってプロットすることです。このスキームでは、x 軸は 360-0 度の境界線の左に向かって減少し、右に向かって増加します。

データ自体 (大規模なデータセットなど) への変換やシフトを行いたくないので、いくつかの matplotlib-trickery を使用してこれを行うことを検討しています。

違いがあれば、データポイントをhexbinでプロットする予定です。

ご覧いただきありがとうございます。ご協力いただきありがとうございます。

デイブ

4

1 に答える 1

4

正直なところ、データを変換するだけではるかに高速になると思います。x[x>180] -= 360はかなり速いです。データセットのサイズが数 GB でない限り、データの変換にかかる時間はわずか数ミリ秒です。

したがって、簡単な方法は次のとおりです(データを変換します):

import matplotlib.pyplot as plt
import numpy as np

# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360

# Transform the data back to a -180 to 180 range...
x[x > 180] -= 360

# Plot the data
fig, ax = plt.subplots()
ax.plot(x, y, 'b.')

# Set the ticks so that negative ticks represent >180 numbers
ticks = ax.get_xticks()
ticks[ticks < 0] += 360
ax.set_xticklabels([int(tick) for tick in ticks])

plt.show()

ここに画像の説明を入力

ただし、データの変換を避けたい場合は、次のようなことができます...ただし、これは、データを変換するよりも遅くなることが100%保証されています。(おそらく無視できるほど遅くなりますが、速くなるわけではありません。)

import matplotlib.pyplot as plt
import numpy as np

# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360

fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
fig.subplots_adjust(wspace=0)

ax1.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax1.tick_params(right=False)
ax2.tick_params(left=False)
for label in ax2.get_yticklabels():
    label.set_visible(False)

ax1.plot(x[x > 180], y[x > 180], 'b.')
ax2.plot(x[x <= 180], y[x <= 180], 'b.')

ax2.set_xticks(ax2.get_xticks()[1:])

plt.show()

ここに画像の説明を入力

于 2011-11-23T22:28:20.943 に答える