Полярная гистограмма в Python для заданных значений r, theta и z - PullRequest
1 голос
/ 08 марта 2019

У меня есть кадр данных, состоящий из измерений с определенной магнитометрической станции с течением времени, с столбцами, соответствующими:

  • его широта (которую я считаю радиусом)
  • его азимутальный угол
  • измеренное количество в это конкретное время

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

Shi et al, 2018, doi:10.1029/2017JA025033

Я посмотрел на специальную гистограмму в physt, но это позволяет мне вводить только значения x, y, и все это меня смущает.

Может ли кто-нибудь помочь?

Ответы [ 3 ]

2 голосов
/ 08 марта 2019

Похоже, это то, что вы ищете: https://physt.readthedocs.io/en/latest/special_histograms.html#Polar-histogram

from physt import histogram, binnings, special
import numpy as np
import matplotlib.pyplot as plt

# Generate some points in the Cartesian coordinates
np.random.seed(42)

x = np.random.rand(1000)
y = np.random.rand(1000)
z = np.random.rand(1000)

# Create a polar histogram with default parameters
hist = special.polar_histogram(x, y)
ax = hist.plot.polar_map()

Polar histogram created with physt

Связанные документы включают больше примеров с цветами,размер бина и т. д.

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

import random
import numpy as np
import matplotlib.pyplot as plt
from physt import special

# Generate some points in the Cartesian coordinates
np.random.seed(42)

gen = lambda l, h, s = 3000: np.asarray([random.random() * (h - l) + l for _ in range(s)])

X = gen(-100, 100)
Y = gen(-1000, 1000)
Z = gen(0, 1400)

hist = special.polar_histogram(X, Y, weights=Z, radial_bins=40)
# ax = hist.plot.polar_map()

hist.plot.polar_map(density=True, show_zero=False, cmap="inferno", lw=0.5, figsize=(5, 5))
plt.show()

Example with color & custom coordinates

1 голос
/ 08 марта 2019

Расчет гистограммы легко выполнить с помощью numpy.histogram2d.Построение результирующего 2D-массива может быть выполнено с помощью pcolormesh.

import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt

# two input arrays
azimut = np.random.rand(3000)*2*np.pi
radius = np.random.rayleigh(29, size=3000)

# define binning
rbins = np.linspace(0,radius.max(), 30)
abins = np.linspace(0,2*np.pi, 60)

#calculate histogram
hist, _, _ = np.histogram2d(azimut, radius, bins=(abins, rbins))
A, R = np.meshgrid(abins, rbins)

# plot
fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))

pc = ax.pcolormesh(A, R, hist.T, cmap="magma_r")
fig.colorbar(pc)

plt.show()

enter image description here

в matplotlib
0 голосов
/ 08 марта 2019

Это не полный ответ, но вы можете услышать некоторые идеи: https://github.com/TronSkywalker/Visuals/blob/master/Circular_bar_charts.py

дайте мне знать, как далеко вы продвинулись! :) 1004 *

...