Histogramme 3D à partir de données discrètes

Jai des données (discrètes) du type $ \ {x_i, y_i, z_i \} $

data={{4, 4, 0.6570}, {6, 4, 0.8240}, {8, 4, 0.8930}, {10, 4, 0.9330},{4,6, 0.2780}, {6,6,0.5660}, {8, 6, 0.7460}, {10, 6, 0.8320}, {4, 8,0}, {6, 8, 0.2620}, {8, 8, 0.5100}, {10, 8, 0.6100}, {4,10, 0}, {6,10, 0.04900}, {8, 10, 0.2370}, {10, 10, 0.3940}} 

et je « cherche à en faire un histogramme 3D, avec des rectangles de hauteur $ z_i $ et une base carrée située dans le plan à la position $ x_i, y_i $ . Cela était possible en utilisant` `GeneralizedBarChart3D " mais cela a été remplacé par RectangleChart3D et je ne peux pas le faire fonctionner.

Le mieux que je puisse faire pour le moment est

ListPointPlot3D[data, Filling -> Bottom] 

qui produit quelque chose comme

entrez la description de limage ici

où les points sont correctement situés et à la bonne hauteur, mais je veux avoir un rectangle (avec une base carrée de largeur 1) de la bonne hauteur plutôt quun point.

Toute aide serait appréciée.

Commentaires

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Vous pouvez utiliser ListPlot3D avec un ordre dinterpolation 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Pour tenir compte du point de données {4, 4, 0,6570}, jajoute le point {4,4} 0,6570 * 10000 = 6570 fois (dans un tableau temporaire). Répétez cette opération pour tous les points, puis tracez lhistogramme (3D) de ce tableau temporaire (contenant {4,4} répété 6570 fois).
  • Construire sur @Carl ' s comment ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Merci … Dune manière ou dune autre, la fonctionnalité " GeneralizedBarChart3D " na pas vraiment été remplacé.

Réponse

Transformer data dans un objet WeightedData et utilisez-le avec Histogram3D :

wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"] 

entrez la description de limage ici

Remplacez la spécification du bac par {2}:

Histogram3D[wd, {2}, ColorFunction -> "Rainbow"] 

entrez la description de limage ici

Pour afficher les éléments de données avec un poids nul, remplacez s dans la troisième colonne de données avec un petit nombre (par exemple, 10^-6):

wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"] 

entrez la description de limage ici

Réponse

Vous navez pas dhistogramme mais vraiment un histogramme 3D car les hauteurs ne sont pas égales à 1 ou à une taille déchantillon totale. Mais avec votre jeu de données particulier où toutes les combinaisons de valeurs pour chaque dimension (allant de 4 à 10 par étapes de 2) sont disponibles, on peut facilement utiliser DiscretePlot3D:

DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]] 

Graphique à barres 3D

Une approche alternative qui évite la " gymnastique " que vous mentionnez est dutiliser un tableau fragmenté:

data = {{4, 4, 0.6570}, {6, 4, 0.8240}, {8, 4, 0.8930}, {10, 4, 0.9330}, {4, 6, 0.2780}, {6, 6, 0.5660}, {8, 6, 0.7460}, {10, 6, 0.8320}, {4, 8, 0}, {6, 8, 0.2620}, {8, 8, 0.5100}, {10, 8, 0.6100}, {4, 10, 0}, {6, 10, 0.04900}, {8, 10, 0.2370}, {10, 10, 0.3940}} sa = SparseArray[{#[[1]], #[[2]]} -> #[[3]] & /@ data] DiscretePlot3D[sa[[i, j]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]] 

Approche alternative de graphique à barres 3D avec un tableau épars

Commentaires

  • Sympa. Vous devez faire un peu de gymnastique pour générer le format approprié pour lintrigue …
  • Peut-être avez-vous besoin de plus dexercice. 😉

Laisser un commentaire

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