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
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
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"]
Altere a especificação do compartimento para {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
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"]
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]]
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]]
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. 😉
Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]