matplotlib объединяет данные в полярной и декартовой сетке

Как объединить полярные и декартовы данные с координатной сеткой на графике?

Важно отметить, что начало осей и масштабы должны совпадать.

В моем приложении я хочу объединить данные метеорадара (полярные) с данными о высоте (декартовы).

Это отправная точка:

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


person Community    schedule 13.09.2013    source источник
comment
Я согласен с tcaswell: чего именно вы хотите достичь? Можете скинуть ссылку на пример рисунка?   -  person Schorsch    schedule 13.09.2013
comment
Вопрос обновлен. Я думаю, stackoverflow.com/users/325565/joe-kington может понять (и, надеюсь, ответить) вопрос.   -  person egouden    schedule 16.09.2013
comment
Я думаю, что вы должны использовать две отдельные оси. (через твинкс или твини)   -  person tacaswell    schedule 16.09.2013
comment
Кроме того, можете ли вы включить код, который вы использовали для создания этой фигуры?   -  person tacaswell    schedule 16.09.2013
comment
возможный дубликат matplotlib: добавление вторых осей() с прозрачным фоном?   -  person Schorsch    schedule 16.09.2013
comment
Да, я напечатал, прежде чем я полностью подумал. twin* — это простой способ получить должным образом прозрачные перекрывающиеся оси, но совместное использование оси — ваша главная проблема.   -  person tacaswell    schedule 17.09.2013
comment
а можно тогда ссылку на источник рисунка?   -  person tacaswell    schedule 17.09.2013
comment
Почему вы удалили пример изображения?   -  person tacaswell    schedule 18.09.2013


Ответы (2)


Если подумать об этом некоторое время, ответ заключается в том, что вам нужно перевести радиальные данные в декартово пространство:

import copy
# fake....err, simulated... data

# elevation
X, Y = np.meshgrid(np.linspace(-50, 50, 1024), np.linspace(-50, 50, 1024))
elv = np.sin(np.pi * X / 50) * np.cos(2*np.pi * Y / 50)

# radar
R, theta = np.meshgrid(np.linspace(0, 35, 512), np.linspace(0, 2*np.pi, 512))
rad = np.sin(3*theta) ** 2 * np.cos(R / 10) ** 2

Rt_x = R * np.sin(theta)  # turn radial grid points into (x, y)
Rt_y = R * np.cos(theta)

fig, ax = plt.subplots(1, 1)
ax.set_aspect('equal')
# plot contour
ax.contour(X, Y, elv, cmap='gray')

# tweak color map so values below a threshold are transparent
my_cmap = copy.copy(cm.get_cmap('jet'))
my_cmap.set_under(alpha=0)
# plot the radar data
ax.pcolormesh(Rt_x, Rt_y, rad, zorder=5, edgecolor='face', cmap=my_cmap, vmin=.5, shading='flat')

output

person Community    schedule 19.09.2013
comment
Это хороший ответ. Я до сих пор не понимаю, как pcolormesh знает, где быстро раскрасить. Однако вам удается получить правильный векторный вывод? Для меня сохранение в pdf занимает слишком много времени, а использование pcolorfast с полярными осями дает пустое изображение. Тогда рендеринг практически невозможен. - person egouden; 23.09.2013
comment
@egouden В вашем исходном сообщении не упоминался векторный вывод, и в моем ответе нет ни pcolorfast, ни полярных исполнителей. Пожалуйста, задайте новый вопрос с новыми проблемами. Рендеринг в png происходит очень быстро. - person tacaswell; 23.09.2013
comment
Справедливо. Давайте сделаем это шаг за шагом. - person egouden; 23.09.2013

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

import numpy as np
import matplotlib.pyplot as plt

# setting up data
line = np.random.rand(5)
r = np.arange(0, 3.0, 0.01)
theta = 2 * np.pi * r

# initializing the figure
fig = plt.figure()
# setting the axis limits in [left, bottom, width, height]
rect = [0.1, 0.1, 0.8, 0.8]

# the carthesian axis:
ax_carthesian  = fig.add_axes(rect)
# the polar axis:
ax_polar = fig.add_axes(rect, polar=True, frameon=False)

# plotting the line on the carthesian axis
ax_carthesian.plot(line,'b')

# the polar plot
ax_polar.plot(theta, r, color='r', linewidth=3)
ax_polar.set_rmax(2.0)
ax_polar.grid(True)

plt.show()

Хитрость заключается в том, чтобы обе оси находились в одном месте, а для второй нужно было выбрать frameon=false. Ваша фигура будет выглядеть так:

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

person Schorsch    schedule 16.09.2013
comment
Это хорошая отправная точка, но происхождение и масштабы должны совпадать. - person egouden; 17.09.2013
comment
@egouden Теперь вы видите, как в вашем вопросе не хватает жизненно важной информации? Я доберусь до этого в редактировании, когда у меня будет время. - person Schorsch; 17.09.2013
comment
Текущая версия моего вопроса в порядке. Я занимаюсь физикой. Очевидно, я хочу сравнить два набора данных с соответствующим местоположением. Тем не менее, я открыт для обсуждения: пожалуйста, дайте любое другое приложение, где вы не хотите этого результата. - person egouden; 17.09.2013
comment
@egouden Что-то, что может быть очевидно для вас, может быть не так для других. Ось произвольный выбор. Конечно, некоторые из них более полезны, чем другие, но полярную сетку и декартову сетку можно согласовывать разными способами. И - не обязательно бы весы совпадали. Это очень сильно зависит от ваших данных или от того, что вы пытаетесь показать. - person Schorsch; 17.09.2013
comment
Отлично. Как вы думаете, мой вопрос в порядке сейчас? Если это так, пожалуйста, удалите свой голос -1 и ссылку на вопрос, на который ранее был дан ответ (это не то же самое и гораздо менее интересное, ИМО). Тогда гуру может быть интересно решить настоящую проблему. - person egouden; 17.09.2013
comment
Шумную дискуссию о качестве вопроса предлагаю убрать потом. Однако это обсуждение было очень полезным для будущих вопросов. Спасибо вам всем. - person egouden; 17.09.2013
comment
Это помогло мне, иногда нам просто нужно сосредоточиться на вопросе. Я проголосовал за ваш вопрос @egouden :) - person Nicholas TJ; 08.10.2014
comment
@Schorsch Есть ли способ полностью охватить полярную сетку внутри прямоугольной рамки, сохранив то же происхождение? Спасибо - person AshlinJP; 01.07.2020