diff --git a/components/StackedBarGraph.module.css b/components/StackedBarGraph.module.css index 40646db..ad6d198 100644 --- a/components/StackedBarGraph.module.css +++ b/components/StackedBarGraph.module.css @@ -8,10 +8,17 @@ .legend { display: flex; + justify-content: center; font-size: calc(16rem / 16); top: 0; } +.tickLabel { + font-family: "Inconsolata", monospace; + font-weight: 800; + fill: var(--label); +} + .key { font-weight: bold; } \ No newline at end of file diff --git a/components/StackedBarGraph.tsx b/components/StackedBarGraph.tsx index c9f77fd..455f524 100644 --- a/components/StackedBarGraph.tsx +++ b/components/StackedBarGraph.tsx @@ -43,17 +43,14 @@ export type StackedBarProps = { /** Colours for each key */ colorRange: string[]; /** Distance between the edge of the graph and the area where the bars are drawn, in pixels. */ - margin: { top: number; left: number }; + margin: { + top: number; + left: number; + bottom: number; + right: number; + }; /** Number of ticks for the value axis */ numTicksValueAxis?: number; - /** Distance between the left axis labels and the start of the lines of the graph, in px. */ - axisLeftOffset?: number; - /** Distance between the bottom axis and the bottom of the container of the graph, in px. */ - axisBottomOffset?: number; - /** Distance between the right side of the graph and the legend, in px. */ - legendLeftOffset?: number; - /** Distance between the top of the graph and the legend, in px. */ - legendTopOffset?: number; /** Width of the lines in the graph, in px. */ strokeWidth?: number; /** Length of the dashes and the gaps in the graph, in px. */ @@ -62,9 +59,6 @@ export type StackedBarProps = { scalePadding?: number; /** Margin for each item in the legend */ itemMargin?: string; - /** Factor multiplied with an offset to center the labels of the category-axis depending on the width/height of the graph. - * >1 for width/height <600 and <1 for width/height >600 (vertical=width/horizontal=height) */ - categoryAxisLeftFactor?: number; }; let tooltipTimeout: number; @@ -82,14 +76,9 @@ export const StackedBarGraphVertical = withTooltip< margin, scalePadding = 0.3, numTicksValueAxis = 6, - axisLeftOffset = 40, - axisBottomOffset = 40, strokeWidth = 2.5, strokeDashArray = "10,4", - legendLeftOffset = 40, - legendTopOffset = 40, itemMargin = "0 0 0 15px", - categoryAxisLeftFactor = 1, tooltipOpen, tooltipLeft, tooltipTop, @@ -126,18 +115,15 @@ export const StackedBarGraphVertical = withTooltip< }); // bounds - const xMax = width; - const yMax = height - margin.top - axisBottomOffset; + const xMax = width - margin.left - margin.right; + const yMax = height - margin.top - margin.bottom; - categoryScale.rangeRound([0, xMax - axisLeftOffset]); + categoryScale.rangeRound([0, xMax]); valueScale.range([yMax, 0]); return width < 10 ? null : (
-
+
- - - data={data} - keys={keys} - x={getCategory} - xScale={categoryScale} - yScale={valueScale} - color={colorScale} - > - {(barStacks) => - barStacks.map((barStack) => - barStack.bars.map((bar) => ( - { - tooltipTimeout = window.setTimeout(() => { - hideTooltip(); - }, 300); - }} - onMouseMove={(event) => { - if (tooltipTimeout) clearTimeout(tooltipTimeout); - const eventSvgCoords = localPoint(event); - const left = bar.x + bar.width / 2; - showTooltip({ - tooltipData: bar, - tooltipTop: eventSvgCoords?.y, - tooltipLeft: left, - }); - }} - /> - )) - ) - } - - + + data={data} + keys={keys} + x={getCategory} + xScale={categoryScale} + yScale={valueScale} + color={colorScale} + > + {(barStacks) => + barStacks.map((barStack) => + barStack.bars.map((bar) => ( + { + tooltipTimeout = window.setTimeout(() => { + hideTooltip(); + }, 300); + }} + onMouseMove={(event) => { + if (tooltipTimeout) clearTimeout(tooltipTimeout); + const eventSvgCoords = localPoint(event); + const left = bar.x + bar.width / 2; + showTooltip({ + tooltipData: bar, + tooltipTop: eventSvgCoords?.y, + tooltipLeft: left, + }); + }} + /> + )) + ) + } + - ({ + + ({ + className: styles.tickLabel, + fill: Color.label, + fontWeight: TICK_LABEL_FONT_WEIGHT, + width: categoryScale.bandwidth(), + verticalAnchor: "start", + })} + /> + { + return { fill: Color.label, fontWeight: TICK_LABEL_FONT_WEIGHT, - })} - /> - { - return { - fill: Color.label, - fontWeight: TICK_LABEL_FONT_WEIGHT, - }; - }} - /> - + }; + }} + /> {tooltipOpen && tooltipData ? ( @@ -279,14 +259,9 @@ export const StackedBarGraphHorizontal = withTooltip< margin, scalePadding = 0.3, numTicksValueAxis = 6, - axisLeftOffset = 40, - axisBottomOffset = 40, strokeWidth = 2.5, strokeDashArray = "10,4", - legendLeftOffset = 40, - legendTopOffset = 40, itemMargin = "0 0 0 15px", - categoryAxisLeftFactor = 1, tooltipOpen, tooltipLeft, tooltipTop, @@ -323,18 +298,15 @@ export const StackedBarGraphHorizontal = withTooltip< }); // bounds - const xMax = width; - const yMax = height - margin.top - axisBottomOffset; + const xMax = width - margin.left - margin.right; + const yMax = height - margin.top - margin.bottom; categoryScale.rangeRound([yMax, 0]); - valueScale.range([0, xMax - axisLeftOffset]); + valueScale.range([0, xMax]); return width < 10 ? null : (
-
+
- - - data={data} - keys={keys} - y={getCategory} - xScale={valueScale} - yScale={categoryScale} - color={colorScale} - > - {(barStacks) => - barStacks.map((barStack) => - barStack.bars.map((bar) => ( - { - tooltipTimeout = window.setTimeout(() => { - hideTooltip(); - }, 300); - }} - onMouseMove={(event) => { - if (tooltipTimeout) clearTimeout(tooltipTimeout); - const eventSvgCoords = localPoint(event); - const left = bar.x + bar.width / 2; - showTooltip({ - tooltipData: bar, - tooltipTop: eventSvgCoords?.y, - tooltipLeft: left, - }); - }} - /> - )) - ) - } - - + + data={data} + keys={keys} + y={getCategory} + xScale={valueScale} + yScale={categoryScale} + color={colorScale} + > + {(barStacks) => + barStacks.map((barStack) => + barStack.bars.map((bar) => ( + { + tooltipTimeout = window.setTimeout(() => { + hideTooltip(); + }, 300); + }} + onMouseMove={(event) => { + if (tooltipTimeout) clearTimeout(tooltipTimeout); + const eventSvgCoords = localPoint(event); + const left = bar.x + bar.width / 2; + showTooltip({ + tooltipData: bar, + tooltipTop: eventSvgCoords?.y, + tooltipLeft: left, + }); + }} + /> + )) + ) + } + @@ -273,8 +274,8 @@ export default function Academics() { noBackground > diff --git a/pages/coop.tsx b/pages/coop.tsx index 978233b..cb6e6eb 100644 --- a/pages/coop.tsx +++ b/pages/coop.tsx @@ -226,6 +226,8 @@ export default function CoopPage() { margin={{ top: 20, left: 20, + bottom: 0, + right: 0, }} />
@@ -254,6 +256,8 @@ export default function CoopPage() { margin={{ top: 20, left: 20, + bottom: 0, + right: 0, }} />
@@ -297,6 +301,8 @@ export default function CoopPage() { margin={{ top: 20, left: 20, + bottom: 0, + right: 0, }} />
diff --git a/pages/playground.tsx b/pages/playground.tsx index 0959f8f..69a9df2 100644 --- a/pages/playground.tsx +++ b/pages/playground.tsx @@ -126,6 +126,8 @@ export default function Home() { margin={{ top: 20, left: 20, + bottom: 0, + right: 0, }} /> @@ -149,6 +151,8 @@ export default function Home() { margin={{ top: 20, left: 20, + bottom: 0, + right: 0, }} />