Gráfico de densidade de mapa de calor 3D

Tenho um conjunto de dados que se parece com {{x1, y1, z1}, {x2, y2, z2}, ...}, então descreve pontos no espaço 3D . Quero fazer um mapa de calor com esses dados. Assim, pontos com alta densidade são mostrados como uma nuvem e marcados com cores diferentes dependendo da densidade.

Na verdade, eu quero o resultado desse script apenas para 3D:

data = RandomReal[1, {100, 2}]; SmoothDensityHistogram[data, 0.02, "PDF", ColorFunction -> "Rainbow", Mesh -> 0] 

insira a descrição da imagem aqui

Comentários

  • Bem-vindo ao Mathematica.SE!
  • Você tem a versão 9? Então dê uma olhada em Image3D
  • Obrigado pela resposta, mas não eu use o Mathematica 8
  • É um ótimo exemplo !! para mim, usei a função Image3D do mathematica 9, mas meu problema é como posso alterar as dimensões de cada voxel usando a função Image3D [].
  • Você deve fazer uma pergunta diferente, não postar sua pergunta como resposta .

Resposta

Se você deseja representar graficamente uma distribuição tridimensional, primeiro você precisa formá-la ! SmoothDensityHistogram representa um histograma de kernel suave dos valores $ \ {x_i, y_i \} $, mas como temos dados tridimensionais aqui, precisamos da função chamada SmoothKernelDistribution!

data = RandomReal[1, {1000, 3}]; dist = SmoothKernelDistribution[data]; 

Agora você tem a distribuição de probabilidade com três variáveis. Portanto, podemos simplesmente plotar o PDF como um gráfico de contorno 3D usando ContourPlot3D. Lembre-se de que essa função é considerada um pouco lenta.

ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2}, PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 160, ContourStyle -> Opacity[0.45], Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][z]], AxesLabel -> {x, y, z}] 

insira a descrição da imagem aqui

Para cortar os contornos, usei a opção!

RegionFunction -> Function[{x, y, z}, x < z || z > y] 

Para verificar se a densidade dos pontos de dados é responsável pela forma do contornos que podemos usar Graphics3D

pic = Graphics3D[{ColorData["DarkRainbow"][#[[3]]], PointSize -> Large, Point[#]} & /@ data, Boxed -> False]; Show[con, pic] 

insira a descrição da imagem aqui

BR

EDITAR

Para seguir no exemplo 2D e obtenha cores quentes para densidades mais altas

 data = RandomReal[1, {500, 3}]; dist = SmoothKernelDistribution[data]; ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2},PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 150, ContourStyle -> Opacity[0.45], Contours -> 5, Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][f/Max[data]]], AxesLabel -> {x, y, z}, RegionFunction -> Function[{x, y, z}, x < z || z > y]] 

Gráficos Mathematica

Comentários

  • Você pode ' usar ListContourPlot3D, editar deixa pra lá, o resultado é horrível.
  • Ótimo, obrigado, aquele script com a edição faz exatamente o trabalho! Uma coisa se eu combinar a imagem de ponto com o gráfico de contorno eu obtenho o seguinte: oi47.tinypic.com/34g7otd.jpg Eu marquei a área que está excluída de o gráfico de contorno, mas contém alguns pontos …
  • @ user1936577 considere usar um nome de usuário mais simples;) Agora você também precisa usar a mesma exclusão em seus pontos para que todos os pontos não sejam mostrados. Você pode usar Cases ou Select para escolher os pontos relevantes.
  • acabei de alterar o nome;) Mas eu quero considerar todos os pontos em meu ContourPlot e agora ' estou pensando sobre esta área que marquei no link acima

Resposta

O código abaixo (adaptado aqui ) produz uma saída que é semelhante à função Image3D que infelizmente está disponível apenas para Mathematica versão 9.

Alguns dados 3D aleatórios:

data = RandomReal[{-3, 3}, {5000, 3}]; 

Aqui especificamos o domínio para bin (-3, 3) e a resolução de binning:

binning = {-3, 3, .5}; 

O código real a produzir a figura:

binned = BinCounts[data, binning, binning, binning]; dims = Dimensions@binned; normbinned = N[binned/Max[binned]]; coordswithdataAll = Table[{normbinned[[x, y, z]], {x, y, z}}, {x, 1, dims[[1]]}, {y, 1, dims[[2]]}, {z, 1, dims[[3]]}]; coordswithdata = Table[Select[coordswithdataAll[[j, i]], #[[1]] != 0 &], {j, dims[[1]]}, {i, dims[[1]]}]; cubes = {ColorData["Rainbow"][#1], Opacity@#1, EdgeForm[], Cuboid@#2} &; output = ParallelMap[cubes @@ # &, coordswithdata, {3}]; Graphics3D[output, PlotRange -> Transpose[{ConstantArray[1, 3], dims + 1}], Lighting -> "Neutral"] 

voxels

Comentários

  • voto positivo para você 🙂
  • +1 por ser muito, muito mais rápido do que a resposta 1.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *