主要问题:
我写了一个小的光线跟踪代码。它被称为前向光线跟踪,因此光线实际上是在光源处创建的,然后传播到唯一的镜像并被反射。随后我计算每条射线与我选择的平面的交点,我称之为探测器。而我在探测器上得到的,将每个命中打印为像素,是(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()
现在我正在寻找一种方法来将命中的密度分布(强度)表示为平滑图像,如this一个。
因此每个像素的灰度应与周围色块中的密度相对应。但是看起来像我需要的一切都是像z = f(x,y)这样的3d数组。
还尝试了hexbin(),但它不够平滑,对于非常小的垃圾箱,它变得太慢而且只是类似于我所拥有的。
那么有什么我可以使用的吗?
次要问题:
我不知何故需要添加另一个维度,因为我对入射光线的并行性感兴趣。一种选择是按如下方式定义:
a =入射光线与探测器法线之间的角度
b =入射光线与y-z平面之间的角度(光线大致平行于该平面)
此数量的平均值
偏离每次点击的平均值
我想通过在灰度级中添加颜色将这两种信息合并到一个图中。这可行吗?
我是编程新手,任何暗示,解释或其他想法都会受到高度赞赏。
答案 0 :(得分:1)
我认为你不能像制作一张二维图像一样,就像你提到的那样...你需要第三维来描述(x,y)处的信号强度。这只是一个快速而又肮脏的例子:
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进行绘图是一个不同的问题。
答案 1 :(得分:1)
我猜您的主要问题涉及两个主要步骤:首先,计算散点的密度函数,然后实际绘制它。因此,如果你有一个函数z = f(x,y),其中z是点(x,y)处的估计密度,你可以使用你已经研究过的matplotlib方法。
至于第一步,我建议查看scipy.stats.kde中的内核密度估算程序。基本上你做了
density = scipy.stats.gaussian_kde(scatterpoints)
然后可以从
评估每个点的密度z = density([x,y])