DateHistogram avec disposition empilée / centile

Nov 11 2020

Conditions

  • Les barres de chaque bac s'empilent à 1.
  • Belles étiquettes d'axes de date et prise en charge maximale des fonctionnalités / options de DateHistogram.

Exemple

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

Terrain comme celui-ci mais basé sur la date: 233507

Réponses

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. Nous pouvons extraire les hauteurs des barres, les modifier et utiliser les hauteurs modifiées comme spécification de hauteur personnalisée dans le troisième argument 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. Nous pouvons utiliser une coutume ChartElementFunctionqui modifie les coordonnées des rectangles:

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. Nous pouvons post-traiter la DateHistogramsortie produite avec l'option ChartLayout -> "Stacked"de redimensionner les coordonnées verticales des rectangles:

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

Remarque: la troisième méthode ne fonctionne que pour la fonction d'élément de graphique par défaut "Rectangle".