From 9c12ca5856c0646ae855c91d7517b94eaf827bb5 Mon Sep 17 00:00:00 2001 From: Holtz Yan Date: Tue, 3 Dec 2024 22:29:42 +0100 Subject: [PATCH] first animated treemap --- pages/example/deplacement-en-france.tsx | 55 ++--- public/excalidraw/dataviz-process.png | Bin 0 -> 43366 bytes viz/TreemapFrenchTravel/Rectangle.tsx | 38 +++ viz/TreemapFrenchTravel/Treemap.tsx | 44 +--- viz/TreemapFrenchTravel/data.ts | 298 ++++++------------------ 5 files changed, 150 insertions(+), 285 deletions(-) create mode 100644 public/excalidraw/dataviz-process.png create mode 100644 viz/TreemapFrenchTravel/Rectangle.tsx diff --git a/pages/example/deplacement-en-france.tsx b/pages/example/deplacement-en-france.tsx index a0fc8075..1d2586c0 100644 --- a/pages/example/deplacement-en-france.tsx +++ b/pages/example/deplacement-en-france.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Layout } from 'component/Layout'; import TitleAndDescription from 'component/TitleAndDescription'; import ChartFamilySection from 'component/ChartFamilySection'; @@ -8,8 +8,10 @@ import Link from 'next/link'; import { SankeyBumpChartDemo } from 'viz/SankeyBumpChart/SankeyBumpChartDemo'; import { LinkAsButton } from 'component/LinkAsButton'; import { Treemap } from '@/viz/TreemapFrenchTravel/Treemap'; -import { data, rawData } from '@/viz/TreemapFrenchTravel/data'; +import { modeDeTransport, Tree } from '@/viz/TreemapFrenchTravel/data'; import { stratify } from 'd3'; +import * as d3 from 'd3'; +import { Tabs, TabsList, TabsTrigger } from '@/component/UI/tabs'; const graphDescription = ( <> @@ -18,30 +20,11 @@ const graphDescription = ( ); export default function Home() { - const groups = ['Etudes', 'Professionnel', 'Vacances']; - const target = 'Temps'; + const [selectedmetric, setSelectedMetric] = useState('Distance'); - const mainDataSelection = rawData['Motifs de déplacement']; - console.log('mainDataSelection', mainDataSelection); - - const selectedData = Object.keys(mainDataSelection).map((key) => { - return { - parent: 'Temps', - name: key, - value: Number(mainDataSelection[key]['Temps'].replace('%', '')), - }; - }); - console.log('selectedData', selectedData); - - const hierarchyBuilder = stratify() - .id((d) => d.name) - .parentId((d) => d.parent); - const hierarchy = hierarchyBuilder([ - { parent: undefined, name: 'Temps' }, - ...selectedData, - ]); - - console.log(hierarchy); + const data = modeDeTransport.children.find( + (node) => node.name === selectedmetric + ); return ( - + + + setSelectedMetric('Temps')}> + Temps + + setSelectedMetric('Distance')} + > + Distance + + setSelectedMetric('Emissions')} + > + Emissions + + + + +
diff --git a/public/excalidraw/dataviz-process.png b/public/excalidraw/dataviz-process.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed7098a767ec761bfa8701dd02c238412877ad0 GIT binary patch literal 43366 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 literal 0 HcmV?d00001 diff --git a/viz/TreemapFrenchTravel/Rectangle.tsx b/viz/TreemapFrenchTravel/Rectangle.tsx new file mode 100644 index 00000000..a37c60a9 --- /dev/null +++ b/viz/TreemapFrenchTravel/Rectangle.tsx @@ -0,0 +1,38 @@ +import { useSpring, animated } from '@react-spring/web'; + +type RectangleProps = { + width: number; + height: number; + x: number; + y: number; +}; + +export const Rectangle = (props: RectangleProps) => { + const { x, y, width, height } = props; + + const springProps = useSpring({ + to: { x, y, width, height }, + config: { + friction: 30, + }, + }); + + if (y === undefined) { + return null; + } + + return ( + + ); +}; diff --git a/viz/TreemapFrenchTravel/Treemap.tsx b/viz/TreemapFrenchTravel/Treemap.tsx index abb116f3..df8980ce 100644 --- a/viz/TreemapFrenchTravel/Treemap.tsx +++ b/viz/TreemapFrenchTravel/Treemap.tsx @@ -1,24 +1,12 @@ -import { useMemo } from 'react'; import * as d3 from 'd3'; import styles from './treemap.module.css'; - -export type TreeNode = { - type: 'node'; - name: string; - children: Tree[]; -}; -export type TreeLeaf = { - parent: string; - name: string; - value: number; -}; - -export type Tree = TreeNode | TreeLeaf; +import { Tree } from '@/viz/TreemapFrenchTravel/data'; +import { Rectangle } from './Rectangle'; type TreemapProps = { width: number; height: number; - data: d3.HierarchyNode; + data: Tree; }; const colors = [ @@ -35,32 +23,20 @@ export const Treemap = ({ width, height, data }: TreemapProps) => { const hierarchy = d3.hierarchy(data).sum((d) => d.value); console.log('hierarchy', hierarchy); - const firstLevelGroups = hierarchy?.children?.map((child) => child.data.name); - console.log('firstLevelGroups', firstLevelGroups); - - var colorScale = d3 - .scaleOrdinal() - .domain(firstLevelGroups || []) - .range(colors); - const treeGenerator = d3.treemap().size([width, height]).padding(4); const root = treeGenerator(hierarchy); - console.log('root', root); - const allShapes = root.leaves().map((leaf, i) => { - console.log('leaf', leaf); + const allShapes = root.leaves().map((leaf) => { return ( - - + - { className="font-light" > {leaf.data.value} - + */} ); }); return (
- + {allShapes}
diff --git a/viz/TreemapFrenchTravel/data.ts b/viz/TreemapFrenchTravel/data.ts index 4e50576e..b8a6805c 100644 --- a/viz/TreemapFrenchTravel/data.ts +++ b/viz/TreemapFrenchTravel/data.ts @@ -1,227 +1,75 @@ -export const rawData = { - "Motifs de déplacement": { - "Etudes": { - "Déplacements": "7.6%", - "Temps": "6.3%", - "Distances": "2.8%", - "Emissions directes": "1.8%", - "Emissions avec Amt/traînées": "1.6%" - }, - "Professionnel": { - "Déplacements": "21%", - "Temps": "25%", - "Distances": "24%", - "Emissions directes": "33%", - "Emissions avec Amt/traînées": "30%" - }, - "Achats": { - "Déplacements": "21%", - "Temps": "14%", - "Distances": "8%", - "Emissions directes": "9.4%", - "Emissions avec Amt/traînées": "8.2%" - }, - "Soin-Admin.": { - "Déplacements": "5.5%", - "Temps": "4.9%", - "Distances": "3.3%", - "Emissions directes": "4.2%", - "Emissions avec Amt/traînées": "3.7%" - }, - "Accompagn.": { - "Déplacements": "10%", - "Temps": "6.3%", - "Distances": "4.9%", - "Emissions directes": "5.1%", - "Emissions avec Amt/traînées": "4.5%" - }, - "Visite": { - "Déplacements": "11%", - "Temps": "14%", - "Distances": "18%", - "Emissions directes": "15%", - "Emissions avec Amt/traînées": "15%" - }, - "Sport": { - "Déplacements": "13%", - "Temps": "14%", - "Distances": "6.7%", - "Emissions directes": "5.8%", - "Emissions avec Amt/traînées": "5.2%" - }, - "Loisirs": { - "Déplacements": "9%", - "Temps": "8.7%", - "Distances": "7.6%", - "Emissions directes": "6.1%", - "Emissions avec Amt/traînées": "5.8%" - }, - "Vacances": { - "Déplacements": "0.5%", - "Temps": "5.9%", - "Distances": "22%", - "Emissions directes": "18%", - "Emissions avec Amt/traînées": "23%" - }, - "Autre": { - "Déplacements": "0.9%", - "Temps": "1.2%", - "Distances": "2.2%", - "Emissions directes": "1.9%", - "Emissions avec Amt/traînées": "2.1%" - } - }, - "Modes de transport": { - "Marche": { - "Déplacements": "23.6%", - "Temps": "15.3%", - "Distances": "1.5%", - "Emissions directes": "0%", - "Emissions avec Amt/traînées": "0%" - }, - "Vélo": { - "Déplacements": "2.5%", - "Temps": "2%", - "Distances": "0.5%", - "Emissions directes": "0%", - "Emissions avec Amt/traînées": "0%" - }, - "2RM": { - "Déplacements": "1%", - "Temps": "1%", - "Distances": "0.8%", - "Emissions directes": "0.7%", - "Emissions avec Amt/traînées": "0.6%" - }, - "Voiture": { - "Déplacements": "64%", - "Temps": "62.2%", - "Distances": "65.2%", - "Emissions directes": "79.4%", - "Emissions avec Amt/traînées": "69.1%" - }, - "Bus et car": { - "Déplacements": "3.6%", - "Temps": "5.8%", - "Distances": "2.7%", - "Emissions directes": "1.6%", - "Emissions avec Amt/traînées": "1.4%" - }, - "Ferroviaire": { - "Déplacements": "4.7%", - "Temps": "10.9%", - "Distances": "8.6%", - "Emissions directes": "0.2%", - "Emissions avec Amt/traînées": "0.5%" - }, - "Avion": { - "Déplacements": "0.1%", - "Temps": "2.2%", - "Distances": "19.5%", - "Emissions directes": "16.8%", - "Emissions avec Amt/traînées": "27.2%" - }, - "Autres": { - "Déplacements": "0.4%", - "Temps": "0.7%", - "Distances": "1.1%", - "Emissions directes": "1.3%", - "Emissions avec Amt/traînées": "1.2%" - } - }, - "Gammes de distances": { - "0-1 km": { - "Déplacements": "17.3%", - "Temps": "5.5%", - "Distances": "0.5%", - "Emissions directes": "0.2%", - "Emissions avec Amt/traînées": "0.1%" - }, - "1-10 km": { - "Déplacements": "53.7%", - "Temps": "36.7%", - "Distances": "12.2%", - "Emissions directes": "14.6%", - "Emissions avec Amt/traînées": "12.8%" - }, - "10-100 km": { - "Déplacements": "27.5%", - "Temps": "42%", - "Distances": "40.6%", - "Emissions directes": "48.4%", - "Emissions avec Amt/traînées": "42.4%" - }, - "100-1000 km": { - "Déplacements": "1.4%", - "Temps": "13.2%", - "Distances": "25.4%", - "Emissions directes": "19.1%", - "Emissions avec Amt/traînées": "18.6%" - }, - "1000 km+": { - "Déplacements": "0.1%", - "Temps": "2.6%", - "Distances": "21.3%", - "Emissions directes": "17.7%", - "Emissions avec Amt/traînées": "26.1%" - } - }, - "Quartiles de revenus": { - "Q1": { - "Déplacements": "23.2%", - "Temps": "21.6%", - "Distances": "16%", - "Emissions directes": "14.6%", - "Emissions avec Amt/traînées": "14.3%" - }, - "Q2": { - "Déplacements": "24.5%", - "Temps": "22.9%", - "Distances": "20.4%", - "Emissions directes": "20.8%", - "Emissions avec Amt/traînées": "19.8%" - }, - "Q3": { - "Déplacements": "26.2%", - "Temps": "26.4%", - "Distances": "27.7%", - "Emissions directes": "29.1%", - "Emissions avec Amt/traînées": "28.7%" - }, - "Q4": { - "Déplacements": "26.1%", - "Temps": "29.1%", - "Distances": "35.9%", - "Emissions directes": "35.5%", - "Emissions avec Amt/traînées": "37.2%" - } - }, - "Densité de commune de résidence": { - "Rural": { - "Déplacements": "33%", - "Temps": "31.6%", - "Distances": "37.3%", - "Emissions directes": "41.8%", - "Emissions avec Amt/traînées": "39.8%" - }, - "Intermédiaire": { - "Déplacements": "28%", - "Temps": "25.5%", - "Distances": "26.2%", - "Emissions directes": "27.3%", - "Emissions avec Amt/traînées": "26.7%" - }, - "Dense": { - "Déplacements": "39%", - "Temps": "42.9%", - "Distances": "36.6%", - "Emissions directes": "30.9%", - "Emissions avec Amt/traînées": "33.5%" - } - } -} - - - +export type TreeNode = { + type: 'node'; + name: string; + children: Tree[]; +}; +export type TreeLeaf = { + type: 'leaf'; + name: string; + value: number; +}; +export type Tree = TreeNode | TreeLeaf; +export const modeDeTransport: Tree = { + type: "node", + name: "Modes de transport", + children: [ + { + type: "node", + name: "Temps", + children: [ + { type: "leaf", name: "Marche", value: 12 }, + { type: "leaf", name: "Vélo", value: 5 }, + { type: "leaf", name: "2RM", value: 3 }, + { type: "leaf", name: "Voiture", value: 60 }, + { type: "leaf", name: "Bus et car", value: 10 }, + { type: "leaf", name: "Ferroviaire", value: 8 }, + { type: "leaf", name: "Avion", value: 0.5 }, + { type: "leaf", name: "Autres", value: 1.5 } + ] + }, + { + type: "node", + name: "Distance", + children: [ + { type: "leaf", name: "Marche", value: 2 }, + { type: "leaf", name: "Vélo", value: 5 }, + { type: "leaf", name: "2RM", value: 20 }, + { type: "leaf", name: "Voiture", value: 50 }, + { type: "leaf", name: "Bus et car", value: 15 }, + { type: "leaf", name: "Ferroviaire", value: 100 }, + { type: "leaf", name: "Avion", value: 1000 }, + { type: "leaf", name: "Autres", value: 0.3 } + ] + }, + { + type: "node", + name: "Emissions", + children: [ + { type: "leaf", name: "Marche", value: 0 }, + { type: "leaf", name: "Vélo", value: 0 }, + { type: "leaf", name: "2RM", value: 0.2 }, + { type: "leaf", name: "Voiture", value: 2.3 }, + { type: "leaf", name: "Bus et car", value: 0.8 }, + { type: "leaf", name: "Ferroviaire", value: 0.1 }, + { type: "leaf", name: "Avion", value: 10 }, + { type: "leaf", name: "Autres", value: 0.05 } + ] + }, + { + type: "node", + name: "Coût", + children: [ + { type: "leaf", name: "Marche", value: 0 }, + { type: "leaf", name: "Vélo", value: 0.1 }, + { type: "leaf", name: "2RM", value: 0.5 }, + { type: "leaf", name: "Voiture", value: 5 }, + { type: "leaf", name: "Bus et car", value: 1.2 }, + { type: "leaf", name: "Ferroviaire", value: 2 }, + { type: "leaf", name: "Avion", value: 20 }, + { type: "leaf", name: "Autres", value: 0.3 } + ] + } + ] +};