Antoine Béland
10 octobre 2018
Sexe, Prénom, Année de naissance
M, Alphonse, 1932
F, Béatrice, 1964
F, Charlotte, 1988
Sexe | Prénom | Année de naissance |
---|---|---|
M | Alphonse | 1932 |
F | Béatrice | 1964 |
F | Charlotte | 1988 |
Exemple tiré de Comma-separated values Wikipedia, 2018
[
{ "Sexe": "M", "Prénom": "Alphonse", "Année de naissance": 1932 },
{ "Sexe": "F", "Prénom": "Béatrice", "Année de naissance": 1964 },
{ "Sexe": "F", "Prénom": "Charlotte", "Année de naissance": 1988 }
]
Sexe | Prénom | Année de naissance |
---|---|---|
M | Alphonse | 1932 |
F | Béatrice | 1964 |
F | Charlotte | 1988 |
d3.csv('https://example.org/fichier.csv').then(data => {
d3.select('body')
.append('ul')
.selectAll('li')
.data(data)
.enter()
.append('li')
.html(d => `${d.parti} ` +
`(${d.femmes} femmes, ${d.hommes} hommes)`);
});
Données
Démo
number
lorsqu'un fichier CSV est chargé
string
number
avec les fonctions parseInt
/
parseFloat
// Exemple de conversion avec les données de l'exemple précédent
data.forEach(d => {
d.hommes = parseInt(d.hommes);
d.femmes = parseInt(d.femmes);
});
d3.csv('https://example.org/fichier.csv').then(data => {
// Conversion des nombres en type "number"
data.forEach(d => {
d.hommes = parseInt(d.hommes);
d.femmes = parseInt(d.femmes);
})
// Filtrage des données
data = data.filter(d => d.hommes > 0 || d.femmes > 0);
// Affichage des données...
});
Données
Démo
Que pouvons-nous faire pour résoudre ce problème?
Utiliser une échelle linéaire!
const scale = d3.scaleLinear()
.domain([0, 110])
.range([0, 250]);
console.log(scale(0)); // Sortie: 0
console.log(scale(50)); // Sortie: 113.6
console.log(scale(110)); // Sortie: 250
Démo
d3.scaleLinear
(échelle linéaire)d3.scalePow
(échelle exponentielle)d3.scaleSqrt
(échelle racine carrée)d3.scaleTime
(échelle linéaire pour des dates)
// Domaine entre le 1er janvier et le 31 décembre 2018
const scale = d3.scaleTime()
.domain([new Date(2018, 0), new Date(2018, 11, 31)])
.range([0, 365]);
console.log(scale(new Date(2018, 0))); // Sortie: 0
console.log(scale(new Date(2018, 5))); // Sortie: 151.37
console.log(scale(new Date(2018, 11, 31))); // Sortie: 365
Démo
const data = [0, 1, 2, 3, 4, 5];
const scale1 = d3.scaleLinear()
.domain([d3.min(data), d3.max(data)])
.range([0, 500]);
// Équivalent à scale1
const scale2 = d3.scaleLinear()
.domain(d3.extent(data))
.range([0, 500]);
console.log(d3.min(data)); // Sortie: 0
console.log(d3.max(data)); // Sortie: 5
console.log(d3.extent(data)); // Sortie: [0, 5]
Démo
d3.scaleOrdinal
(échelle ordinale)d3.scaleBand
(échelle ordinale pour faciliter la création de bandes dans un bar chart)
const scale = d3.scaleOrdinal()
.domain(['CAQ', 'PLQ', 'PQ', 'QS'])
.range(['#60bdf0', '#d75550', '#f0a330', '#002b6a']);
console.log(scale('CAQ')); // Sortie: #60bdf0
console.log(scale('PLQ')); // Sortie: #d75550
console.log(scale('PQ')); // Sortie: #f0a330
console.log(scale('QS')); // Sortie: #002b6a
Démo
const BAR_HEIGHT = 50; // Hauteur d'une barre
const BAR_SPACING = 5; // Espacement entre les barres
const MAX_WIDTH = 300; // Largeur maximale d'une barre
const dataset = [ /* ... */ ];
const xScale = d3.scaleLinear()
.domain([0, 100])
.range([0, MAX_WIDTH]);
const yScale = d3.scaleBand()
.domain(dataset.map(d => d.name))
.range([0, BAR_HEIGHT * dataset.length])
.paddingInner(BAR_SPACING / BAR_HEIGHT);
Démo
d3.axisTop
(axe horizontal et étiquettes en haut)d3.axisLeft
(axe vertical et étiquettes à gauche)d3.axisRight
(axe vertical et étiquettes à droite)d3.axisBottom
(axe horizontal et étiquettes en bas)ticks
(nombre de marques à afficher l'axe)tickFormat
(format de l'étiquette à utiliser)call
sur l'élément dans lequel l'axe doit être dessiné
const scale = d3.scaleLinear()
.domain([0, 110])
.range([0, 250]);
// Création de l'axe
const axis = d3.axisBottom(scale)
.ticks(5);
// Rendu de l'axe
const svg = d3.select('svg');
svg.call(axis);
Démo
Démo
const svg = d3.select('svg');
const scale = d3.scaleLinear().domain([0, 110]).range([0, 250]);
// Création des axes
const verticalAxis = d3.axisLeft(scale).ticks(5);
const horizontalAxis = d3.axisBottom(scale).ticks(5);
// Rendu des axes
svg.append('g')
.attr('transform', 'translate(40, 5)')
.call(verticalAxis);
svg.append('g')
.attr('transform', 'translate(40, 255)')
.call(horizontalAxis);
Démo
Démo
Est-ce que je suis censé comprendre le charabia écrit dans la propriété « d
» ?
Non! D3.js va s'occuper d'écrire cela!
const data = [ /* ... */ ];
const x = d3.scaleTime()
.domain(d3.extent(data, d => d.date))
.range([0, 500]);
const y = d3.scaleLinear()
.domain([0, d3.max(data, d => d.value)])
.range([200, 0]);
const svg = d3.select('svg');
const line = d3.line()
.x(d => x(d.date))
.y(d => y(d.value));
svg.append('path')
.attr('d', line(data));
Démo
Image d'un vélo-compteur se trouvant sur la rue Laurier © François Démontagne, 2015
[
{
name: "Nom de la rue",
values: [
{
date: new Date(),
count: 220
},
// Suite du tableau listant les données pour une rue...
]
},
// Suite du tableau listant les rues...
]
* Google Chrome bloque les requêtes asynchrones réalisées dans un fichier local si celui-ci n'est pas hébergé sur un serveur local