DateHistogram com layout empilhado / percentil

Nov 11 2020

Requisitos

  • As barras de cada caixa são empilhadas em 1.
  • Rótulos de eixos de Nice Date e suporte máximo para recursos / opções de DateHistogram.

Exemplo

data = Table[RandomDate[], {3}, {10}]

Trama como este, mas com base na data: 233507

Respostas

4 kglr Nov 11 2020 at 17:12
SeedRandom[1]
data1 = RandomChoice[DateRange[{2010, 1, 1}, {2010, 12, 31}, "Day"], 2000];
data2 = RandomChoice[DateRange[{2010, 3, 1}, {2010, 11, 30}, "Day"], 2000];
data3 = RandomChoice[DateRange[{2010, 2, 1}, {2010, 10, 30}, "Day"], 1000];

dh = DateHistogram[{data1, data2, data3}, 
    ChartLayout -> "Stacked", ImageSize -> Medium]

1. Podemos extrair as alturas das barras, modificá-las e usar as alturas modificadas como especificação de altura personalizada no terceiro argumento de DateHistogram:

heights = Reap[DateHistogram[{data1, data2, data3}, Automatic, Sow[#2] &]][[2, 1]];

hl = Transpose[ Normalize[#, Total] & /@ Transpose[heights]];

DateHistogram[{data1, data2, data3}, 
  Automatic, (Last[hl = RotateLeft[hl]] &), ChartLayout -> "Stacked"]

2. Podemos usar um custom ChartElementFunctionque modifica as coordenadas dos retângulos:

ClearAll[assoc, box, cEF]

assoc = Association[Join @@ Values[
     GroupBy[Reap[DateHistogram[#, ChartLayout -> "Stacked",
      ChartElementFunction -> (ChartElementData["Rectangle"][Sow[#]; ##] &)]][[2, 1]],
      First, Thread[# -> (# /. Thread[#[[All, 2, 2]] -> 
         Normalize[#[[All, 2, 2]], Max]])] &]]] &;

box = assoc[{data1, data2, data3}]; 

cEF = ChartElementData["Rectangle"][box @ #, ##2] &; 
        
DateHistogram[{data1, data2, data3}, 
   ChartLayout -> "Stacked",  ChartElementFunction -> cEF] 

3. Podemos pós-processar a DateHistogramsaída produzida com a opção ChartLayout -> "Stacked"de redimensionar as coordenadas verticais dos retângulos:

ClearAll[reScaleRecs, postProcess]

reScaleRecs = Thread[# -> Rectangle @@@
  SubsetMap[Rescale, List @@@ #[[All, ;; 2]], {All, All, 2}]] &;

postProcess = # /. Flatten[reScaleRecs /@ 
  GatherBy[Cases[#, _Rectangle, All], #[[1, 1]] &]] &;

postProcess @ dh

Observação: o terceiro método funciona apenas para a função de elemento de gráfico padrão "Rectangle".