squiggle/src/components/charts/DistPlusPlot.re

210 lines
6.5 KiB
ReasonML
Raw Normal View History

let adjustBoth = discreteProbabilityMass => {
let yMaxDiscreteDomainFactor = discreteProbabilityMass;
let yMaxContinuousDomainFactor = 1.0 -. discreteProbabilityMass;
let yMax =
yMaxDiscreteDomainFactor > yMaxContinuousDomainFactor
? yMaxDiscreteDomainFactor : yMaxContinuousDomainFactor;
(
1.0 /. (yMaxDiscreteDomainFactor /. yMax),
1.0 /. (yMaxContinuousDomainFactor /. yMax),
);
};
module DistPlusChart = {
[@react.component]
2020-02-23 13:27:52 +00:00
let make = (~distPlus: DistTypes.distPlus, ~onHover) => {
2020-02-23 13:14:14 +00:00
open Distributions.DistPlus;
let discrete = distPlus |> T.toScaledDiscrete;
let continuous =
2020-02-23 13:14:14 +00:00
distPlus
|> T.toScaledContinuous
2020-02-23 13:14:14 +00:00
|> E.O.fmap(Distributions.Continuous.getShape);
2020-02-25 19:55:01 +00:00
let range = T.xTotalRange(distPlus);
let minX =
switch (T.minX(distPlus), range) {
| (Some(min), Some(range)) => Some(min -. range *. 0.001)
| _ => None
};
let maxX = T.maxX(distPlus);
2020-02-23 13:27:52 +00:00
let timeScale = distPlus.unit |> DistTypes.DistributionUnit.toJson;
let toDiscreteProbabilityMass =
distPlus |> Distributions.DistPlus.T.toDiscreteProbabilityMass;
let (yMaxDiscreteDomainFactor, yMaxContinuousDomainFactor) =
adjustBoth(toDiscreteProbabilityMass);
2020-02-23 18:34:34 +00:00
<DistributionPlot
minX
maxX
yMaxDiscreteDomainFactor
yMaxContinuousDomainFactor
2020-02-26 09:16:10 +00:00
height=120
?discrete
?continuous
color={`hex("333")}
onHover
timeScale
/>;
};
};
module IntegralChart = {
[@react.component]
2020-02-23 13:27:52 +00:00
let make = (~distPlus: DistTypes.distPlus, ~onHover) => {
2020-02-23 13:14:14 +00:00
open Distributions.DistPlus;
let integral =
2020-02-24 22:04:39 +00:00
Distributions.DistPlus.T.toShape(distPlus)
|> Distributions.Shape.T.Integral.get(~cache=None);
let continuous =
integral
2020-02-24 22:04:39 +00:00
|> Distributions.Continuous.toLinear
2020-02-23 13:14:14 +00:00
|> E.O.fmap(Distributions.Continuous.getShape);
2020-02-25 20:08:53 +00:00
let range = T.xTotalRange(distPlus);
let minX =
switch (T.minX(distPlus), range) {
| (Some(min), Some(range)) => Some(min -. range *. 0.001)
| _ => None
};
2020-02-24 22:04:39 +00:00
let maxX = integral |> Distributions.Continuous.T.maxX;
2020-02-23 13:27:52 +00:00
let timeScale = distPlus.unit |> DistTypes.DistributionUnit.toJson;
2020-02-23 18:34:34 +00:00
<DistributionPlot
minX
maxX
2020-02-26 09:16:10 +00:00
height=80
?continuous
color={`hex("333")}
timeScale
onHover
/>;
};
};
[@react.component]
2020-02-23 13:27:52 +00:00
let make = (~distPlus: DistTypes.distPlus) => {
let (x, setX) = React.useState(() => 0.);
let chart =
React.useMemo1(
() => {<DistPlusChart distPlus onHover={r => {setX(_ => r)}} />},
[|distPlus|],
);
let chart2 =
React.useMemo1(
() => {<IntegralChart distPlus onHover={r => {setX(_ => r)}} />},
[|distPlus|],
);
<div>
chart
chart2
<table className="table-auto">
<thead>
<tr>
<th className="px-4 py-2"> {"X Point" |> ReasonReact.string} </th>
<th className="px-4 py-2">
{"Discrete Value" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Continuous Value" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Y Integral to Point" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Y Integral Total" |> ReasonReact.string}
</th>
</tr>
</thead>
<tbody>
<tr>
<th className="px-4 py-2 border ">
{x |> E.Float.toString |> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.xToY(x)
|> DistTypes.MixedPoint.toDiscreteValue
2020-02-24 16:39:55 +00:00
|> Js.Float.toPrecisionWithPrecision(_, ~digits=7)
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.xToY(x)
|> DistTypes.MixedPoint.toContinuousValue
2020-02-24 16:39:55 +00:00
|> Js.Float.toPrecisionWithPrecision(_, ~digits=7)
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
2020-02-23 13:14:14 +00:00
|> Distributions.DistPlus.T.Integral.xToY(~cache=None, x)
|> E.Float.with2DigitsPrecision
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.Integral.sum(~cache=None)
|> E.Float.with2DigitsPrecision
|> ReasonReact.string}
</th>
</tr>
</tbody>
</table>
<table className="table-auto">
<thead>
<tr>
<th className="px-4 py-2">
{"Continuous Total" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Scaled Continuous Total" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Discrete Total" |> ReasonReact.string}
</th>
<th className="px-4 py-2">
{"Scaled Discrete Total" |> ReasonReact.string}
</th>
</tr>
</thead>
<tbody>
<tr>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.toContinuous
|> E.O.fmap(
Distributions.Continuous.T.Integral.sum(~cache=None),
)
|> E.O.fmap(E.Float.with2DigitsPrecision)
|> E.O.default("")
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.toScaledContinuous
|> E.O.fmap(
Distributions.Continuous.T.Integral.sum(~cache=None),
)
|> E.O.fmap(E.Float.with2DigitsPrecision)
|> E.O.default("")
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.toDiscrete
|> E.O.fmap(Distributions.Discrete.T.Integral.sum(~cache=None))
|> E.O.fmap(E.Float.with2DigitsPrecision)
|> E.O.default("")
|> ReasonReact.string}
</th>
<th className="px-4 py-2 border ">
{distPlus
|> Distributions.DistPlus.T.toScaledDiscrete
|> E.O.fmap(Distributions.Discrete.T.Integral.sum(~cache=None))
|> E.O.fmap(E.Float.with2DigitsPrecision)
|> E.O.default("")
|> ReasonReact.string}
</th>
</tr>
</tbody>
</table>
<div />
</div>;
// chart
};