首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >平滑地绘制2d中的散点

平滑地绘制2d中的散点
EN

Stack Overflow用户
提问于 2012-09-04 20:48:23
回答 2查看 2.3K关注 0票数 4

主要问题:

我写了一个小射线追踪代码。这就是所谓的前向射线追踪,所以射线实际上是在源头产生的,旅行到唯一的一面镜子并反射出来。随后,我计算出每条射线与我所选择的平面的交集,我称之为探测器。我在探测器上打印的是(x,y)的散点图,就像这样:

代码语言:javascript
运行
复制
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()

现在,我正在寻找一种方法,将点击的密度分布(强度)表示为平滑的图像,如 1。

因此,每个像素的灰度应该对应于周围斑块中的密度。但是我所需要的一切看起来都是像z=f(x,y)这样的3D数组。

也尝试了hexbin(),但是它不够光滑,对于非常小的回收箱,它变得太慢了,而且与我所拥有的非常相似。

有什么我可以用的吗?

次要问题:

我需要添加另一个维度,因为我对入射射线的平行性感兴趣。一种选择是将其定义如下:

  1. 计算a+ a*b,其中:

A=入射射线与探测器法线之间的夹角

B=入射射线与y-z平面之间的夹角(射线大致平行于这一平面)。

  1. 这个量的平均值
  2. 偏离每一击的平均值

我想通过在灰度上添加颜色,把这两种信息结合在一起。这可行吗?

我对编程很陌生,任何提示、解释或其他想法都会很感激。

EN

回答 2

Stack Overflow用户

发布于 2012-09-05 03:27:04

我不认为你能像你提到的那样做个2d图像。你需要第三维空间来描述(x,y)的信号强度。下面是一个快速而肮脏的例子:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-09-05 12:52:45

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

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

代码语言:javascript
运行
复制
density = scipy.stats.gaussian_kde(scatterpoints)

,然后可以计算每个点的密度。

代码语言:javascript
运行
复制
z = density([x,y])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12271140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档