繁体   English   中英

平滑地绘制二维点

[英]plot scattered points in 2d smoothly

主要问题:

我写了一个小的光线跟踪代码。 这称为前向光线跟踪,因此实际上是在光源处创建了光线,然后行进到唯一的一面镜子并被反射。 随后,我计算出每条射线与我选择的平面的交点,我将其称为检测器。 我在检测器上得到的,以像素为单位打印的每个命中点都是(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. 计算+ a * b,其中:

a =入射射线与检测器法线之间的角度

b =入射光线与yz平面之间的角度(光线大致平行于该平面传播)

  1. 该数量的平均值

  2. 每次点击均值偏离平均值

我想通过将颜色添加到灰度图中将这两种信息合并到一个图中。 这可行吗?

我是编程的新手,任何提示,解释或其他想法将不胜感激。

正如您提到的那样,我认为您无法摆脱制作2D图像的麻烦……您需要第3维来描述(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进行绘图是一个不同的问题。

我想您的主要问题涉及两个主要步骤:首先,计算散射点的密度函数,然后实际绘制它。 因此,如果您有一个函数z = f(x,y),其中z是在点(x,y)处的估计密度,则可以使用已经研究过的matplotlib方法。

至于第一步,我建议看看scipy.stats.kde中的内核密度估计例程。 基本上你会

density = scipy.stats.gaussian_kde(scatterpoints)

然后可以从中评估每个点的密度

z = density([x,y])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM