построение угловых данных в декартовом пространстве с помощью matplotlib - PullRequest
3 голосов
/ 24 ноября 2011

Возможно, я сделал название более сложным, чем вопрос, но здесь идет ...!

У меня есть некоторые угловые данные, смежные в плоскости xy, которые охватывают линию 360 => 0 градусов- т. е. 358 359,0,1,2 ....

Если бы я планировал их и установил:

 plt.xlim(0,360)

Я бы, конечно, имел три точки в крайнем левом углусюжет, и два в крайнем правом.Вы можете увидеть это на (более сложном и актуальном) графике здесь (предельные значения по оси X намеренно изменены):

the angularly-wrapped dataset

Что я действительно хотел бы, так это иметь все точкистроится вокруг той же позиции в окне графика, возможно, к центру графика.Согласно этой схеме, ось x уменьшается слева от границы 360-0 градусов и увеличивается вправо.

Я не хочу делать какие-либо переводы / сдвиги для самих данных (это большой набор данных и т. Д.), Поэтому я бы хотел сделать это с помощью некоторых хитростей matplotlib.

Я планирую нанести точки данных на шестнадцатеричное число, если это что-то изменит.

Спасибо за внимание и заранее благодарю за помощь,

Дейв

1 Ответ

4 голосов
/ 24 ноября 2011

Честно говоря, я думаю, что преобразование ваших данных будет намного быстрее x[x>180] -= 360 довольно быстро. Если размер вашего набора данных составляет несколько ГБ, время, необходимое для преобразования ваших данных, составит всего несколько миллисекунд.

Итак, вот простой способ (преобразование ваших данных):

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()

enter image description here

Однако, если вы хотите избежать преобразования ваших данных, вы можете сделать что-то вроде этого ... Хотя это на 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()

enter image description here

...