極座標系の位置の関数値を表す2次元配列があります。例えば:
import numpy as np
radius = np.linspace(0, 1, 50)
angle = np.linspace(0, 2*np.pi, radius.size)
r_grid, a_grid = np.meshgrid(radius, angle)
data = np.sqrt((r_grid/radius.max())**2
+ (a_grid/angle.max())**2)
ここでdata
は、極座標に対応する長方形のグリッドに配置されます。軸が対応するデカルト座標系を表すように、配列内のデータを再配置したいと思います。古いレイアウトと新しいレイアウトは、次のように視覚化できます。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=plt.figaspect(0.5))
ax1.set(title='Polar coordinates', xlabel='Radius', ylabel='Angle')
ax1.pcolormesh(r_grid, a_grid, data)
ax2.set(title='Cartesian coordinates', xlabel='X', ylabel='Y')
x_grid = r_grid * np.cos(a_grid)
y_grid = r_grid * np.sin(a_grid)
ax2.pcolormesh(x_grid, y_grid, data)
ここでは座標が明示的に与えられ、それに応じてプロットが調整されます。代わりに、データをデータ配列自体に再配置したいのですが。これにはすべての値が含まれている必要があり、形状に合わせてゼロで埋めることもできます(と同様scipy.ndimage.rotate(..., reshape=True)
)。
極座標配列を手動でループしてデカルト座標を計算すると、結果には空の領域が含まれ、理想的にはこの領域も塗りつぶす必要があります。
new = np.zeros_like(data)
visits = np.zeros_like(new)
for r, a, d in np.nditer((r_grid, a_grid, data)):
i = 0.5 * (1 + r * np.sin(a)) * new.shape[0]
j = 0.5 * (1 + r * np.cos(a)) * new.shape[1]
i = min(int(i), new.shape[0] - 1)
j = min(int(j), new.shape[1] - 1)
new[i, j] += d
visits[i, j] += 1
new /= np.maximum(visits, 1)
ax2.imshow(new, origin='lower')
結果のデータ配列の空の領域を回避しながら変換を実現する方法はありますか?
1/r
直交座標への変換が計算される前に、比例する密度で各半径の角度データが補間されるアプローチを試しました。結果は有望に見え、周りにいくつかのアーティファクトがy = 0
残っているだけなので、まだ調査中です。