4

主な質問:

私は小さなレイトレーシングコードを書きました。これはフォワードレイトレーシングと呼ばれるため、光線は実際に光源で作成され、唯一のミラーに移動して反射されます。続いて、各光線と選択した平面との交点を計算します。これを検出器と呼びます。そして、私が検出器に乗って、各ヒットをピクセルとして印刷するのは、(x、y)の散布図です。このように:

import matplotlib.pyplot as plt
import numpy as np
import random

x = np.zeros(1000)
y = np.zeros(1000)
for i in range(len(x)):
    x[i] = random.random()
    y[i] = random.random()

plt.plot(x,y,'k,')
plt.show()

今、私はヒットの密度分布(強度)をこのような滑らかな画像として表現する方法を探しています。

したがって、各ピクセルのグレースケールは、周囲のパッチの密度に対応している必要があります。しかし、私が必要としているように見えるものはすべて、z = f(x、y)のような3d配列用です。

hexbin()も試しましたが、十分にスムーズではなく、非常に小さいビンの場合は遅くなりすぎて、とにかく私が持っているものに似ているだけです。

だから私が使用できるものはありますか?

二次質問:

入射光線の平行度に興味があるので、どういうわけか別の次元を追加する必要があります。1つのオプションは、次のように定義することです。

  1. a + a * bを計算します。ここで、

a=入射光線と検出器の法線の間の角度

b =入射光線とyz平面の間の角度(光線はこの平面にほぼ平行に移動します)

  1. この量の平均値

  2. 各ヒットの平均値からの偏差

グレースケールに色を追加することで、これらの情報の両方を1つのプロットに組み込むことを考えました。これは実行可能ですか?

私はプログラミングに不慣れです。ヒント、説明、または代替案をいただければ幸いです。

4

2 に答える 2

1

あなたが述べたように、2D画像を作成することで逃げることはできないと思います...(x、y)での信号の強度を記述するには3次元が必要です。これは、簡単で汚い例です。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np


# just creating random data with a bunch of 2d gaussians

def gauss2d(x, y, a, x0, y0, sx, sy):
    return a * (np.exp(-((x - x0) / sx)**2 / 2.)
                * np.exp(-((y - y0) / sy)**2 / 2.))

imsize = 1000
im = np.zeros((imsize, imsize), dtype=float)

ng = 50
x0s = imsize * np.random.random(ng)
y0s = imsize * np.random.random(ng)
sxs = 100. * np.random.random(ng)
sys = sxs #100. * np.random.random(ng)
amps = 100 + 100 * np.random.random(ng)

for x0, y0, sx, sy, amp in zip(x0s, y0s, sxs, sys, amps):
    nsig = 5.
    xlo, xhi = int(x0 - nsig * sx), int(x0 + nsig * sx)
    ylo, yhi = int(y0 - nsig * sy), int(y0 + nsig * sy)

    xlo = xlo if xlo >= 0 else 0
    xhi = xhi if xhi <= imsize else imsize
    ylo = ylo if ylo >= 0 else 0
    yhi = yhi if yhi <= imsize else imsize

    nx = xhi - xlo
    ny = yhi - ylo

    imx = np.tile(np.arange(xlo, xhi, 1), ny).reshape((ny, nx))
    imy = np.tile(np.arange(ylo, yhi, 1), nx).reshape((nx, ny)).transpose()

    im[ylo:yhi, xlo:xhi] += gauss2d(imx, imy, amp, x0, y0, sx, sy)


plt.imshow(im, cmap=cm.gray)

plt.show()

基本的に、CCD からの 2D 画像のようにデータを扱い、各ピクセルに信号強度が含まれます。

(実際には、強調表示しようとしているデータに応じて、散布図を使用したいかもしれませんが、ポイントのサイズ/不透明度を変更して情報を表示することを追加します...それは実際に何を達成しようとしているかによって異なります。)

光線強度から何をプロットしたいのか実際には正確にはわかりませんが、光線が画像に斜めに当たる場合は、平面に投影された光線の強度を計算する必要があります。これは、Matplotlib でプロットする方法とは別の問題です。

于 2012-09-05T03:27:04.287 に答える
1

あなたの主な質問には、2 つの主な手順が含まれていると思います。まず、散布点の密度関数を計算し、次に実際にプロットします。したがって、関数 z = f(x,y) がある場合、z は点 (x,y) での推定密度であり、既に調査した matplotlib メソッドを使用できます。

最初のステップとして、 scipy.stats.kdeのカーネル密度推定ルーチンを確認することをお勧めします。基本的にあなたはそうします

density = scipy.stats.gaussian_kde(scatterpoints)

から各点の密度を評価できます。

z = density([x,y])
于 2012-09-05T12:52:45.870 に答える