построение угловых данных в декартовом пространстве с помощью matplotlib

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

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

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

 plt.xlim(0,360)

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

набор данных с угловой оберткой

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

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

Я планирую построить точки данных с помощью hexbin, если это имеет значение.

Спасибо за внимание, и заранее спасибо за вашу помощь,

Дэйв


person Dave    schedule 23.11.2011    source источник
comment
Самый простой «трюк», который приходит мне на ум, — это дважды отобразить ваши данные, т. е. отобразить один и тот же материал со сдвинутыми значениями x так, чтобы левое второе совпадало с правым от первого (x_new = x_old + 360). Это вариант?   -  person Avaris    schedule 24.11.2011


Ответы (1)


Я искренне думаю, что просто преобразование ваших данных будет намного быстрее. 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()

введите здесь описание изображения

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

введите здесь описание изображения

person Joe Kington    schedule 23.11.2011
comment
+1 x[x < 0] уау! это что? тупой? пожалуйста, не могли бы вы добавить ссылку на соответствующую документацию этой красоты? - person joaquin; 24.11.2011
comment
Это пустая идиома (а также матлаб-изм). scipy.org/ (ссылка на учебник, а не на документы. соответствующий раздел документов предполагает гораздо большее знакомство с numpy.) Логические операции с массивами numpy возвращают логические массивы. Их можно (среди прочего) использовать для индексации массива numpy той же формы. - person Joe Kington; 24.11.2011