/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . base . stat Ċ Ċ import Ġjet brains . datal ore . base . g common . base . Preconditions . check State Ċ import Ġjet brains . datal ore . base . g common . collect . Closed Range Ċ import Ġjet brains . datal ore . plot . base . Aes Ċ import Ġjet brains . datal ore . plot . base . DataFrame Ċ import Ġjet brains . datal ore . plot . base . Stat Context Ċ import Ġjet brains . datal ore . plot . base . data . Transform Var Ċ import Ġjet brains . datal ore . plot . common . data . Series Util Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠDefault Ġstat Ġfor Ġgeom _ histogram Ċ Ġ* Ċ Ġ* Ġ@ param Ġbin Count ĠNumber Ġof Ġbins Ġ( over ridden Ġby Ġbin Width ) Ċ Ġ* Ġ@ param Ġbin Width ĠUsed Ġto Ġcompute Ġbin Count Ġsuch Ġthat Ġbins Ġcovers Ġthe Ġrange Ġof Ġthe Ġdata Ċ Ġ* Ġ@ param Ġx Pos Kind ĠSpecifies Ġa Ġway Ġin Ġwhich Ġbin Ġx - position Ġis Ġinterpreted Ġ( center , Ġboundary ) Ċ Ġ* Ġ@ param Ġx Pos ĠBin Ġx - position . Ċ Ġ* Ċ Ġ* ĠComp uted Ġvalues : Ċ Ġ* Ċ Ġ* Ġcount Ġ- Ġnumber Ġof Ġpoints Ġin Ġbin Ċ Ġ* Ġdensity Ġ- Ġdensity Ġof Ġpoints Ġin Ġbin , Ġscaled Ġto Ġintegrate Ġto Ġ 1 Ċ Ġ* Ġn count Ġ- Ġcount , Ġscaled Ġto Ġmaximum Ġof Ġ 1 Ċ Ġ* Ġnd ensity Ġ- Ġdensity , Ġscaled Ġto Ġmaximum Ġof Ġ 1 Ċ Ġ*/ Ċ internal Ġclass ĠBin Stat ( ĊĠĠĠ Ġbin Count : ĠInt , ĊĠĠĠ Ġbin Width : ĠDouble ?, ĊĠĠĠ Ġprivate Ġval Ġx Pos Kind : ĠX Pos Kind , ĊĠĠĠ Ġprivate Ġval Ġx Pos : ĠDouble Ċ ) Ġ: ĠBase Stat ( DEF _ MAPPING ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbin Options Ġ= ĠBin Stat Util . Bin Options ( bin Count , Ġbin Width ) ĊĊĠĠĠ Ġoverride Ġfun Ġconsume s (): ĠList < Aes <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Aes . X , ĠA es . WEIGHT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( data : ĠDataFrame , Ġstat Ctx : ĠStat Context , Ġmessage Consumer : Ġ( s : ĠString ) Ġ-> ĠUnit ): ĠDataFrame Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Required Values ( data , ĠA es . X )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Empty Stat Values () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstat X Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Count Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Density Ġ= ĠArrayList < Double >() ĊĊĠĠĠĠĠĠĠ Ġval Ġrange X Ġ= Ġstat Ctx . overall X Range () ĊĠĠĠĠĠĠĠ Ġif Ġ( range X Ġ!= Ġnull ) Ġ{ Ġ// Ġnull Ġmeans Ġall Ġinput Ġvalues Ġare Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbins Data Ġ= Ġcompute Stat Series ( data , Ġrange X , Ġdata . get Numeric ( Transform Var . X )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat X . addAll ( bins Data . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Count . addAll ( bins Data . count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Density . addAll ( bins Data . density ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDataFrame . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Numeric ( Stats . X , Ġstat X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Numeric ( Stats . COUNT , Ġstat Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Numeric ( Stats . D ENS ITY , Ġstat Density ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Stat Series ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġrange X : ĠClosed Range < Double >, ĊĠĠĠĠĠĠĠ Ġvalues X : ĠList < Double ?> ĊĠĠĠ Ġ): ĠBin Stat Util . Bins Data Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstart X : ĠDouble ? Ġ= Ġrange X . lower End ĊĠĠĠĠĠĠĠ Ġvar Ġspan X Ġ= Ġrange X . upper End Ġ- Ġstart X !! ĊĊĠĠĠĠĠĠĠ Ġ// Ġinitial Ġbin Ġcount / width ĊĠĠĠĠĠĠĠ Ġvar Ġb : ĠBin Stat Util . Count And Width Ġ= ĠBin Stat Util . bin Count And Width ( span X , Ġbin Options ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadjusted Ġbin Ġcount / width ĊĠĠĠĠĠĠĠ Ġ// Ġextend Ġthe Ġdata Ġrange Ġby Ġ 0 . 7 Ġof Ġbin Width Ġon Ġeach Ġends Ġ( to Ġallow Ġlimited Ġhorizontal Ġadjust ments ) ĊĠĠĠĠĠĠĠ Ġstart X Ġ-= Ġb . width Ġ* Ġ 0 . 7 ĊĠĠĠĠĠĠĠ Ġspan X Ġ+= Ġb . width Ġ* Ġ 1 . 4 ĊĠĠĠĠĠĠĠ Ġb Ġ= ĠBin Stat Util . bin Count And Width ( span X , Ġbin Options ) ĊĠĠĠĠĠĠĠ Ġval Ġbin Count Ġ= Ġb . count ĊĠĠĠĠĠĠĠ Ġval Ġbin Width Ġ= Ġb . width ĊĊĠĠĠĠĠĠĠ Ġ// Ġoptional Ġhorizontal Ġadjustment Ġ(+ /- 0 . 5 Ġbin Ġwidth Ġmax ) ĊĠĠĠĠĠĠĠ Ġif Ġ( x Pos Kind Ġ!= ĠX Pos Kind . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Delta Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġx Pos ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbin Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Left Ġ= Ġstart X Ġ+ Ġi Ġ* Ġbin Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Pos Kind Ġ== ĠX Pos Kind . CENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġx Ġ- Ġ( bin Left Ġ+ Ġbin Width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĠĠĠĠĠĠ Ġ// ĠBO UND ARY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Delta Ġ= Ġx Ġ- Ġstart X Ġ// Ġinit Ġstill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġx Ġ- Ġ( bin Left Ġ+ Ġbin Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( delta ) Ġ< Ġabs ( min Delta )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Delta Ġ= Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmax Ġoffset : Ġ+ /- 0 . 5 Ġbin Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmin Delta Ġ% Ġ( bin Width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ+= Ġoffset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdensity Ġplot Ġarea Ġshould Ġbe Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġnormal Bin Width Ġ= ĠSeries Util . span ( range X ) Ġ/ Ġbin Count ĊĠĠĠĠĠĠĠ Ġval Ġdensity Normal izing Factor Ġ= Ġif Ġ( normal Bin Width Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 Ġ/ Ġnormal Bin Width ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĊĠĠĠĠĠĠĠ Ġ// Ġcompute Ġbins ĊĊĠĠĠĠĠĠĠ Ġval Ġbins Data Ġ= ĠBin Stat Util . compute Bins ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues X , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart X , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbin Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbin Width , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBin Stat Util . weight AtIndex ( data ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdensity Normal izing Factor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcheck State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbins Data . x . size Ġ== Ġbin Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Internal : Ġstat Ġdata Ġsize =" Ġ+ Ġbins Data . x . size Ġ+ Ġ" Ġexpected Ġbin Ġcount =" Ġ+ Ġbin Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbins Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠX Pos Kind Ġ{ ĊĠĠĠĠĠĠĠ ĠNONE , ĠC ENTER , ĠBO UND ARY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEF _ MAPPING : ĠMap < Aes <* >, ĠDataFrame . Variable > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es . X Ġto ĠStats . X , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es . Y Ġto ĠStats . COUNT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ