nolual's picture
Upload 55 files
0c20ea8
raw
history blame
2.24 kB
import React from "react";
import { Group } from "@visx/group";
import { AreaClosed } from "@visx/shape";
import { AxisLeft, AxisBottom, AxisScale } from "@visx/axis";
import { LinearGradient } from "@visx/gradient";
import { curveMonotoneX } from "@visx/curve";
import { week_distribution } from "./AreaChart";
const axisColor = "#fff";
const axisBottomTickLabelProps = {
textAnchor: "middle" as const,
fontFamily: "Arial",
fontSize: 10,
fill: axisColor,
};
const axisLeftTickLabelProps = {
dx: "-0.25em",
dy: "0.25em",
fontFamily: "Arial",
fontSize: 10,
textAnchor: "end" as const,
fill: axisColor,
};
export default function AreaChart({
data,
gradientColor,
width,
yMax,
margin,
xScale,
yScale,
hideBottomAxis = false,
hideLeftAxis = false,
top,
left,
children,
}: {
data: week_distribution[];
gradientColor: string;
xScale: AxisScale<number>;
yScale: AxisScale<number>;
width: number;
yMax: number;
margin: { top: number; right: number; bottom: number; left: number };
hideBottomAxis?: boolean;
hideLeftAxis?: boolean;
top?: number;
left?: number;
children?: React.ReactNode;
}) {
if (width < 10) return null;
return (
<Group left={left || margin.left} top={top || margin.top}>
<LinearGradient
id="gradient"
from={gradientColor}
fromOpacity={1}
to={gradientColor}
toOpacity={0.2}
/>
<AreaClosed<week_distribution>
data={data}
x={(d) => xScale(d.week) || 0}
y={(d) => yScale(d.indice_base_100) || 0}
yScale={yScale}
strokeWidth={1}
stroke="url(#gradient)"
fill="url(#gradient)"
curve={curveMonotoneX}
/>
{!hideBottomAxis && (
<AxisBottom
top={yMax}
scale={xScale}
numTicks={width > 520 ? 10 : 5}
stroke={axisColor}
tickStroke={axisColor}
tickLabelProps={axisBottomTickLabelProps}
/>
)}
{!hideLeftAxis && (
<AxisLeft
scale={yScale}
numTicks={5}
stroke={axisColor}
tickStroke={axisColor}
tickLabelProps={axisLeftTickLabelProps}
/>
)}
{children}
</Group>
);
}