DateHistogram mit gestapeltem / Perzentil-Layout

Nov 11 2020

Bedarf

  • Die Balken jedes Behälters sind auf 1 gestapelt.
  • Schöne Datumsachsenbeschriftungen und maximale Unterstützung für DateHistogram-Funktionen / -Optionen.

Beispiel

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

Handlung wie diese, aber datumsbasiert : 233507

Antworten

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. Wir können die Balkenhöhen extrahieren, ändern und die geänderten Höhen als benutzerdefinierte Höhenspezifikation im dritten Argument von verwenden 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. Wir können einen Benutzer verwenden ChartElementFunction, der die Koordinaten von Rechtecken ändert:

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. Wir können die DateHistogramAusgabe ChartLayout -> "Stacked"nachbearbeiten, die mit der Option erstellt wurde , die vertikalen Koordinaten von Rechtecken neu zu skalieren:

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

Hinweis: Die dritte Methode funktioniert nur für die Standardfunktion für Diagrammelemente "Rectangle".