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]
Commentaires
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}]
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]
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]]
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
ouSelect
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"]
Commentaires
- votez pour vous 🙂
- +1 pour être beaucoup, beaucoup plus rapide que la réponse 1.
Image3D
…