Graphique de densité de la carte thermique 3D

Jai un ensemble de données qui ressemble à {{x1, y1, z1}, {x2, y2, z2}, ...} donc il décrit des points dans lespace 3D . Je veux créer une carte thermique à partir de ces données. Pour que les points à haute densité soient représentés sous forme de nuage et marqués de différentes couleurs en fonction de la densité.

En fait, je veux le résultat de ce script uniquement pour la 3D:

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

entrez la description de limage ici

Commentaires

  • Bienvenue sur Mathematica.SE!
  • Avez-vous la version 9? Alors jetez un œil à Image3D
  • Merci pour la réponse mais non je utilisez Mathematica 8
  • Cest un excellent exemple !! pour moi, jai utilisé la fonction Image3D de Mathematica 9 mais mon problème est de savoir comment je peux changer les dimensions de chaque voxel en utilisant la fonction Image3D [].
  • Vous devriez poser une question différente, ne pas poster votre question comme réponse .

Réponse

Si vous voulez tracer une distribution en trois dimensions, vous devez dabord la former ! SmoothDensityHistogram trace un histogramme de noyau lisse des valeurs $ \ {x_i, y_i \} $ mais comme nous avons ici des données en trois dimensions, nous avons besoin de la fonction appelée SmoothKernelDistribution!

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

Vous avez maintenant la distribution de probabilité avec trois variables. Nous pouvons donc simplement tracer le PDF comme un tracé de contour 3D en utilisant ContourPlot3D. Gardez à lesprit que cette fonction est réputée peu lente.

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}] 

entrez la description de limage ici

Pour découper les contours jai utilisé loption!

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

Afin de vérifier que la densité des points de données est responsable de la forme du contours que nous pouvons utiliser Graphics3D

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

entrez la description de limage ici

BR

EDIT

À suivre sur lexemple 2D et obtenez des couleurs chaudes pour des densités plus élevées

 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]] 

Graphiques Mathematica

Commentaires

  • Pouvez ' t vous utilisez ListContourPlot3D, edit tant pis, le résultat est horrible.
  • Grand merci, ce script avec lédition fait exactement le travail! Une chose si je combine limage Point avec le tracé de contour, jobtiens ce qui suit: oi47.tinypic.com/34g7otd.jpg Jai marqué la zone exclue de le tracé de contour mais contient quelques points …
  • @ user1936577 veuillez envisager dutiliser un nom dutilisateur plus simple;) Vous devez maintenant également utiliser la même exclusion sur vos points afin que tous les points ne soient pas affichés. Vous pouvez utiliser Cases ou Select pour choisir les points pertinents.
  • vient de changer le nom;) Mais je veux pour prendre en compte tous les points de mon ContourPlot et maintenant je ' minterroge sur cette zone que jai marquée dans le lien ci-dessus

Réponse

Le code ci-dessous (adapté de ici ) produit une sortie similaire à la fonction Image3D qui nest malheureusement disponible que pour Mathematica version 9.

Quelques données 3D aléatoires:

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

Ici, nous spécifions le domaine à bin (-3, 3) et la résolution de binning:

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

Le code réel à produire la figure:

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

Commentaires

  • votez pour vous 🙂
  • +1 pour être beaucoup, beaucoup plus rapide que la réponse 1.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *