From 794fffec6a2b49cedd69b3044ecdd3f209276f30 Mon Sep 17 00:00:00 2001 From: Marshall Polaris Date: Sun, 2 Oct 2022 15:20:17 -0700 Subject: [PATCH] Make curve configurable on generic charts --- web/components/charts/contract/binary.tsx | 2 ++ web/components/charts/contract/choice.tsx | 2 ++ .../charts/contract/pseudo-numeric.tsx | 2 ++ web/components/charts/generic-charts.tsx | 19 +++++++++++-------- web/components/charts/helpers.tsx | 12 ++++++------ 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/web/components/charts/contract/binary.tsx b/web/components/charts/contract/binary.tsx index 7e192767..c9b3bb0b 100644 --- a/web/components/charts/contract/binary.tsx +++ b/web/components/charts/contract/binary.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react' import { last, sortBy } from 'lodash' import { scaleTime, scaleLinear } from 'd3-scale' +import { curveStepAfter } from 'd3-shape' import { Bet } from 'common/bet' import { getProbability, getInitialProbability } from 'common/calculate' @@ -76,6 +77,7 @@ export const BinaryContractChart = (props: { yScale={yScale} data={data} color="#11b981" + curve={curveStepAfter} onMouseOver={onMouseOver} Tooltip={BinaryChartTooltip} pct diff --git a/web/components/charts/contract/choice.tsx b/web/components/charts/contract/choice.tsx index 65279b70..99e02fa8 100644 --- a/web/components/charts/contract/choice.tsx +++ b/web/components/charts/contract/choice.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react' import { last, sum, sortBy, groupBy } from 'lodash' import { scaleTime, scaleLinear } from 'd3-scale' +import { curveStepAfter } from 'd3-shape' import { Bet } from 'common/bet' import { Answer } from 'common/answer' @@ -214,6 +215,7 @@ export const ChoiceContractChart = (props: { yScale={yScale} data={data} colors={CATEGORY_COLORS} + curve={curveStepAfter} onMouseOver={onMouseOver} Tooltip={ChoiceTooltip} pct diff --git a/web/components/charts/contract/pseudo-numeric.tsx b/web/components/charts/contract/pseudo-numeric.tsx index e03d4ad9..9e06b368 100644 --- a/web/components/charts/contract/pseudo-numeric.tsx +++ b/web/components/charts/contract/pseudo-numeric.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react' import { last, sortBy } from 'lodash' import { scaleTime, scaleLog, scaleLinear } from 'd3-scale' +import { curveStepAfter } from 'd3-shape' import { Bet } from 'common/bet' import { DAY_MS } from 'common/util/time' @@ -97,6 +98,7 @@ export const PseudoNumericContractChart = (props: { xScale={xScale} yScale={yScale} data={data} + curve={curveStepAfter} onMouseOver={onMouseOver} Tooltip={PseudoNumericChartTooltip} color={NUMERIC_GRAPH_COLOR} diff --git a/web/components/charts/generic-charts.tsx b/web/components/charts/generic-charts.tsx index 152b264c..cb930484 100644 --- a/web/components/charts/generic-charts.tsx +++ b/web/components/charts/generic-charts.tsx @@ -4,11 +4,11 @@ import { axisBottom, axisLeft } from 'd3-axis' import { D3BrushEvent } from 'd3-brush' import { ScaleTime, ScaleContinuousNumeric } from 'd3-scale' import { + CurveFactory, + SeriesPoint, curveLinear, - curveStepAfter, stack, stackOrderReverse, - SeriesPoint, } from 'd3-shape' import { range } from 'lodash' @@ -52,10 +52,11 @@ export const DistributionChart =

(props: { color: string xScale: ScaleContinuousNumeric yScale: ScaleContinuousNumeric + curve?: CurveFactory onMouseOver?: (p: P | undefined) => void Tooltip?: TooltipComponent }) => { - const { color, data, yScale, w, h, Tooltip } = props + const { color, data, yScale, w, h, curve, Tooltip } = props const [viewXScale, setViewXScale] = useState>() @@ -100,7 +101,7 @@ export const DistributionChart =

(props: { px={px} py0={py0} py1={py1} - curve={curveLinear} + curve={curve ?? curveLinear} /> ) @@ -113,11 +114,12 @@ export const MultiValueHistoryChart =

(props: { colors: readonly string[] xScale: ScaleTime yScale: ScaleContinuousNumeric + curve?: CurveFactory onMouseOver?: (p: P | undefined) => void Tooltip?: TooltipComponent pct?: boolean }) => { - const { colors, data, yScale, w, h, Tooltip, pct } = props + const { colors, data, yScale, w, h, curve, Tooltip, pct } = props const [viewXScale, setViewXScale] = useState>() const xScale = viewXScale ?? props.xScale @@ -177,7 +179,7 @@ export const MultiValueHistoryChart =

(props: { px={px} py0={py0} py1={py1} - curve={curveStepAfter} + curve={curve ?? curveLinear} fill={colors[i]} /> ))} @@ -192,11 +194,12 @@ export const SingleValueHistoryChart =

(props: { color: string xScale: ScaleTime yScale: ScaleContinuousNumeric + curve?: CurveFactory onMouseOver?: (p: P | undefined) => void Tooltip?: TooltipComponent pct?: boolean }) => { - const { color, data, yScale, w, h, Tooltip, pct } = props + const { color, data, yScale, w, h, curve, Tooltip, pct } = props const [viewXScale, setViewXScale] = useState>() const xScale = viewXScale ?? props.xScale @@ -246,7 +249,7 @@ export const SingleValueHistoryChart =

(props: { px={px} py0={py0} py1={py1} - curve={curveStepAfter} + curve={curve ?? curveLinear} /> ) diff --git a/web/components/charts/helpers.tsx b/web/components/charts/helpers.tsx index 96115dc0..b40ab7db 100644 --- a/web/components/charts/helpers.tsx +++ b/web/components/charts/helpers.tsx @@ -10,7 +10,7 @@ import { import { pointer, select } from 'd3-selection' import { Axis, AxisScale } from 'd3-axis' import { brushX, D3BrushEvent } from 'd3-brush' -import { area, line, curveStepAfter, CurveFactory } from 'd3-shape' +import { area, line, CurveFactory } from 'd3-shape' import { nanoid } from 'nanoid' import dayjs from 'dayjs' import clsx from 'clsx' @@ -73,11 +73,11 @@ const LinePathInternal = ( data: P[] px: number | ((p: P) => number) py: number | ((p: P) => number) - curve?: CurveFactory + curve: CurveFactory } & SVGProps ) => { const { data, px, py, curve, ...rest } = props - const d3Line = line

(px, py).curve(curve ?? curveStepAfter) + const d3Line = line

(px, py).curve(curve) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return } @@ -89,11 +89,11 @@ const AreaPathInternal = ( px: number | ((p: P) => number) py0: number | ((p: P) => number) py1: number | ((p: P) => number) - curve?: CurveFactory + curve: CurveFactory } & SVGProps ) => { const { data, px, py0, py1, curve, ...rest } = props - const d3Area = area

(px, py0, py1).curve(curve ?? curveStepAfter) + const d3Area = area

(px, py0, py1).curve(curve) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return } @@ -105,7 +105,7 @@ export const AreaWithTopStroke = (props: { px: number | ((p: P) => number) py0: number | ((p: P) => number) py1: number | ((p: P) => number) - curve?: CurveFactory + curve: CurveFactory }) => { const { color, data, px, py0, py1, curve } = props return (