python - 使用 Python 中的 Count-in-Cells 在 3D 星场中进行聚类

标签 python matplotlib statistics astronomy

第一次发帖,找不到任何可以完全解决我的问题的内容。

我正在为我的硕士项目进行银河殖民模拟。我想做的一件事是观察模拟结束后留下的未殖民恒星的空隙,看看是否存在超过统计波动的聚类行为。由于这是一个蒙特卡罗数值问题,相关函数并不真正合适,因此我使用通常用于观察星系团的细胞计数方法。

所以我正在研究笛卡尔

data = np.genfromtxt('counts.csv') # positions of uncolonsed stars
x = data[:,0]
y = data[:,1]
z = data[:,2]

我想做的是使用不同大小的盒子来计算盒子内星星的数量,并与平均值进行比较,并对结果进行统计。

我的方向是查看某种 3D 直方图,例如气泡图 here 。我尝试了这个,它似乎没有对我的所有数据进行分箱,我不确定为什么,即立方体的“地板”有“气泡”,但大部分“屋顶”什么都没有:

3D Bubble Histogram

当您查看绘制的原始星场时,这显然是错误的:

Plotted star field

看起来 z 值较高的 bin 没有保存任何数据。这可能是一个非常简单的问题,但我需要一些比我更擅长 Python 的新视角和思维。

有人能想到如何解决这个问题吗?我还想找到一种方法来计算每个框(即每个箱)的点数。

如果我有点迟钝,我很抱歉,但我感谢你们中的任何一位好人可以为我提供的帮助。

谢谢各位 friend !

最佳答案

在评论中,您有一些替代方案来解决您的问题,并且在没有看到代码的情况下很难说出您的代码出了什么问题。无论如何,这种问题通常是通过计算规则网格内的数据来解决的(尽管如此,这是制作直方图的通用方法)。

构建自己的网格的优点是您可以立即知道每个“扇区”的位置、起点和终点。因此,如果您想尝试的话,我建议您使用以下方法作为替代方法。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# Generating some random data.
data = np.random.randint(0, 100, (1000,3))
x, y, z = data[:, 0], data[:, 1], data[:, 2]

# Generating raw view
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, marker='+', s=25, c='r')
plt.show()

# Generating some grid with origin, cell size, and number of cells 10 10 10
numx, numy, numz = 5, 5, 5
origx, origy, origz = 0, 0, 0
sizex, sizey, sizez = 20, 20, 20
grid = np.vstack(np.meshgrid(range(numx), range(numy), range(numz))).reshape(3, -1).T
gx, gy, gz = grid[:, 0]*sizex + origx, grid[:, 1]*sizey + origy, grid[:, 2]*sizez + origz

# Calculating the number of stars in each cell:
ix = ((x - origx)/sizex).astype(int)
iy = ((y - origy)/sizey).astype(int)
iz = ((z - origz)/sizez).astype(int)
s = np.zeros((numx, numy, numz))
for i in range(ix.shape[0]):
    s[ix[i], iy[i], iz[i]] = s[ix[i], iy[i], iz[i]] + 1
s = s.flatten()
mask = s > 0

# Plotting the result
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(gx[mask], gy[mask], gz[mask], marker='o', s=s[mask]*100, c='b', edgecolor ="r")
plt.show()

随机数据的结果是这样的:

bubble histogram in matplotlib

关于python - 使用 Python 中的 Count-in-Cells 在 3D 星场中进行聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058782/

相关文章:

python - 使用 Python 获取 OS X 中所有可用的打印机

python - 将 Spacy 文档的一部分提取为新文档

python - Pandas : create plot

statistics - 逻辑语言——Prolog 或 Lisp/Smalltalk 或其他?

d3.js - d3.quantile 似乎错误地计算了 Q1

python - 为什么一个可以和自身相加的类不能求和? (a+a 有效,sum([a,a]) 失败)

boolean - 将 boolean 值用作整数是 Pythonic 吗?

python - 如何设置 `matplotlib.pyplot`绘制的所有绘图的默认图形大小和DPI

python - 一张图呈现多个不同大小的饼图

r - 在R中使用apply时如何打印当前行的名称?