Histograma 3D de dados discretos

Eu tenho alguns dados (discretos) do tipo $ \ {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}} 

e estou procurando fazer um histograma 3D disso, com retângulos de altura $ z_i $ e base quadrada localizada no plano na posição $ x_i, y_i $ . Isso costumava ser possível usando` `GeneralizedBarChart3D " mas foi substituído por RectangleChart3D e não consigo fazer funcionar.

O melhor que posso fazer agora é

ListPointPlot3D[data, Filling -> Bottom] 

que produz algo como

insira a descrição da imagem aqui

onde os pontos estão localizados corretamente e na altura correta, mas eu quero ter um retângulo (com uma base quadrada de largura 1) da altura correta em vez de um ponto.

Qualquer ajuda seria apreciada.

Comentários

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Você pode usar ListPlot3D com uma ordem de interpolação 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Para contabilizar o ponto de dados {4, 4, 0,6570}, adiciono o ponto {4,4} 0,6570 * 10000 = 6570 vezes (em uma matriz temporária). Repita isso para todos os pontos e, a seguir, plote o histograma (3D) desta matriz temporária (contendo {4,4} repetido 6570 vezes).
  • Criando em @Carl ' s comentário ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Obrigado … De alguma forma, a funcionalidade " GeneralizedBarChart3D " não foi realmente substituído.

Resposta

Transformação data em um objeto WeightedData e use-o com Histogram3D :

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

insira a descrição da imagem aqui

Altere a especificação do compartimento para {2}:

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

insira a descrição da imagem aqui

Para mostrar os elementos de dados com peso zero, substitua s na terceira coluna de dados com um número pequeno (digamos, 10^-6):

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

insira a descrição da imagem aqui

Resposta

Você não tem um histograma, mas na verdade um gráfico de barras 3D, pois as alturas não somam 1 ou o tamanho total da amostra. Mas com seu conjunto de dados específico onde todas as combinações de valores para cada dimensão (indo de 4 a 10 em etapas de 2) estão disponíveis, pode-se facilmente usar DiscretePlot3D:

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

Gráfico de barras 3D

Uma abordagem alternativa que evita a " ginástica " que você mencionou é usar uma matriz esparsa:

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

Abordagem alternativa do gráfico de barra 3D com uma matriz esparsa

Comentários

  • Legal. Você tem que fazer um pouco de ginástica para gerar o formato adequado para o enredo …
  • Talvez você precise de mais exercícios. 😉

Deixe uma resposta

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