Archives de catégorie : QGIS

Des statistiques et des bulles d’iris qui flottent sur Paris

Cet article traite des cartes avec camemberts, des problèmes que cela pose d’un point de vue graphique, et cartographique. Mais surtout, nous verrons la conception d’une carte socio avec diagrammes, par contour IRIS à Paris, qui s’appuie sur le circle packing. Tout ça en essayant d’être rigolo.

Cliquer sur l’image modes de pour voir en grand


La tarte tatin, c’est bon …enfin, ça dépend


Les twix, c’est meilleur que les donuts


Les américains, ils disent que les tartes aux pommes, c’est pas bon. En effet, un article de Business Insider affirme qu’il est difficile de se faire une idée des proportions avec les pie charts. C’est pourquoi on en mange autant.

En France, on appelle ces pie charts des camemberts… On aurait pu appeler ces graphiques des “quiches lorraines” ou “pizzas 4 fromages” selon ce qu’on préfère. Résidant en Provence, je dirais “pompe à l’huile”

“Les chiffres sont critiques !  Regardez donc cette pompe à l’huile !”

Une tarte un peu spéciale


http://www.datemplate.com/post_types-of-charts_136702/gende
En fait, la vraie dénomination de ce graphique serait d’après l’illustration ci-dessus des “slice chart”.
Si l’on se réfère à cette illustration, la vraie pie chart serait une tarte tellement disproportionnée que tout pâtissier assez audacieux pour en confectionner une se ferait interner.
Cette pie chart présente en réalité certaines caractéristiques des radar charts, ou encore spider charts (des arachnophobes dans la salle ?)

Du coup, on pourrait la traduire par RADAR PIE CHART ™, ou “tarte espion” en français.

Ce type de graphique assez bizarroïde présente selon moi certains avantages sur une carte.
En admettant que l’angle de chaque part de tarte espion soit identique, chacune possèdera la même directivité dans l’espace, ce qui facilite les comparaisons. Ce n’est pas le cas avec la tarte maison.
Evidemment, cela ne marche plus dès lors que l’on fait varier à la fois l’angle des parts et leur longueur. C’est un cas qu’on rencontre assez souvent avec des graphiques car la bidimensionnalité est leur vocation première.

Ces tartes espion peuvent être utiles afin de figurer des variables statistiques discrètes mais aussi continues, par exemple temporelles.

Bulles de statistiques


Les iris ne sont pas que des fleurs

L’IGN et l’Insee nous ont gratifiés il n’y a pas si longtemps des contours…IRIS ®, l’iris étant le niveau d’agrégation et administratif le plus fin après la parcelle, le bâtiment et le pavé de trottoir.
En liant des données statistiques à ces IRIS, on peut réaliser tout plein d’analyses et de cartes folles et sympas, ce qui explique pourquoi la mise à disposition de ces contours a pas mal excité la géosphère.

“retrouvons-nous après un petit flash publicité”

Bon, je le dis comme ça : à l’ouverture des données, je m’étais amusé à réaliser une carte des IRIS niveau France entière avec des…iris

Catégories socio-professionnelles

L’Insee, acteur historique de l’#Opendata en France https://t.co/9G7jFHY7N6 pic.twitter.com/Ws9Ei9bOYs

@Insee (@InseeFr) 9 février 2016

C’est fou tout ce qu’on trouve sur le site de l’INSEE, mine de rien. La donnée qui nous intéresse ici est le fichier Travail-Emploi du recensement général de la population de 2012 à l’Iris. Grâce à ces données, on peut faire des cartes très intéressantes pour se faire une idée, entre quartiers, de la mixité sociale, du mode de déplacement privilégié des riverains : voiture, deux roues, etc

Illustrons la méthode en nous appuyant sur la première carte à bulles présentée en début de page. Les colonnes du fichier statistique qui ont été utilisées sont :

  • nombre d’agriculteurs : on en trouve à Paris, si s
  • nombre d’artisans, commerçants et chefs d’entreprise
  • nombre de cadres et professions intellectuelles supérieures
  • nombre personnes occupant des professions intermédiaires
  • nombre d’employés
  • nombre d’ouvriers

Quand les diagrammes posent des soucis aux géomaticiens

Nous pourrions être tentés de représenter ces données sous forme pie charts (camemberts), voire de graphiques à barres (twix).

Dans les deux cas, la difficulté vient, à l’échelle de travail qui est assez fine, du phénomène appelé overlapping qu’on appelle recouvrement en français, mais ça fait moins stylé.

ça fait over-mal

L’astuce du jour, le circle packing, ou empaquetage de cercles (on traduit comme on peut)


L’astuce du jour  $*♪ TADAM ♪*$  consiste à utiliser la technique du circle packing.

Cette technique que Google traduit par “cercle d’emballage”, consiste à répartir le mieux possible des cercles dans un espace de telle sorte qu’aucun ne recouvre l’autre.

C’est un peu ce qui se passe si vous remplissez à 99% une table de billard de boules et que vous mettez des boules dessus. Ces dernières vont se faufiler, pousser les autres jusqu’à le tout se soit équilibré (mais faut avoir bouché les trous du billard avant).

Son application en cartographie la plus connue s’appelle les cartogrammes de Dorling, du nom de son créateur, Danny Dorling

Danny Dorling (au photomaton ?)
http://www.abc.net.au/4corners/stories/2011/10/04/3331769.htm


A quoi ressemblera ma carte


un méchant diagramme
Au niveau de chaque rosace, chaque catégorie se verra affecter une tranche sur le diagramme et cette dernière sera d’autant plus grande qu’il y aura d’employés, ou de cadres, ou d’artisans,…

La carte


Le feeling


Et là, dans ma tête, cercle a évoqué “bulles”. Des bulles flotteraient au-dessus de la capitale avec des statistiques dedans. Les stats c’est lourd, mais quand elles sont dans des bulles, c’est plus léger.

Éléments de contexte


Bon ok, c’est un peu flou, et même très petit


J’ai positionné la Seine, épine dorsale de la capitale ainsi que les contours d’arrondissements (BDROUTE 500 ®) avec un léger flou, pour donner de la profondeur de champ, comme en photographie, ainsi que rejoindre cette idée de légèreté.

L’algorithme de circle packing s’est chargé du mieux qu’il a pu, de répartir les boules de même circonférence sur le territoire, alors que les iris ont initialement des formes, surfaces différentes, il faut faire attention à l’échelle d’analyse.
Chaque bulle a la couleur d’un arrondissement. Cela est d’autant plus nécessaire que la limite imposée à l’algorithme en terme d’itérations a pu entraîner par endroits le transfert d’une bulle dans un arrondissement voisin.

Parlez arrondissement à un provincial comme moi, et il n’y pigera que nenni. Parlez-lui métro, et tout s’éclaire. Tout touriste parviendra à adjoindre une atmosphère à une bouche de métro. Les noms “Barbès”, “Porte d’Italie”, “Le Trocadéro”, “La Défense” évoquent tout de suite des ambiances, des souvenirs.

Les stations de métro fournissent un très bon référentiel que j’ai choisi d’ajouter en filigrane afin de relier l’environnement socio-professionnel à ce réseau auquel on se réfère souvent.

La couleur des lignes, des étiquettes est celle du logo de la RATP. Fallait bien choisir une couleur et la couleur peut évoquer une fonction.

Pour récupérer les lignes ainsi que les stations, j’ai utilisé une petite requête overpass (overpass est  un super outil d’interrogation et d’extraction de données OSM par attributs et critères géographiques et non un pass navigo illimité que l’on trouve sur le darknet).

Les iris et leurs niveaux supérieurs

Aussi, les noms d’Iris constituent des toponymes intéressants à faire figurer sur la carte. Cependant, ils sont beaucoup trop nombreux. On trouvera par exemple PERE LACHAISE 1, PERE LACHAISE 2, etc…

groupes_iris = sub("^(.*) ([0-9]+)$", "\1", iris.df$NOM_IRIS)

Grâce à une petite expression régulière, j’ai récupéré la racine du nom de l’iris sans le numéro et constitué une couche agrégée d’entités de niveau supérieur. Les noms de ces entités supérieures ont servi à l’étiquetage. Je leur ai affecté la même couleur que celle de l’arrondissement auquel ils appartiennent.

Bribes de design

D’un point de vue programmatique, pour générer ces diagrammes, je me suis appuyé sur la librairie R packcircles et des rudiments de géométrie.

En particulier, pour avoir une tranche de gâteau, il suffit de générer un polygone issu d’une série de points, elle-même définie en fonction d’une distance à un centroïde, d’un effectif et d’une rangée d’angles.

Sous QGIS, un mode est utilisé, qui de son joli nom “Flannery”, permet de définir de façon automatique la taille de symboles proportionnels. Ce mode se base sur une fonction interne de QGIS appelée scale_exp. D’après la documentation utilisateur officielle de QGIS, cette fonction échelonne des valeurs entre une valeur minimale et une maximale en suivant une courbe exponentielle.

J’ai porté le code sous R grâce à la doc’ API de QGIS pour définir la taille des pales de la rosace.
Il s’avère qu’en réalité, le rééchelonnage des valeurs se fait selon une courbe de puissance. La fonction devrait du coup plutôt s’appeler scale_pow. 
Voici une illustration de ce que cette fonction accomplit :

La fonction puissance permet de mieux dissocier les valeurs hautes
Si l’on effectue un étirement linéaire, on perçoit moins les différences de valeur :

étirement linéaireVS étirement par puissance

Du QGIS


Sur cet iris, des employés d’abord. des professions intermédiaires ensuite, des cadres, des ouvriers et des artisans enfin

Pour les bulles, j’ai utilisé le dégradé selon la forme, auquel j’ai ajouté un effet d’ombre intérieure.
J’ai utilisé l’effet flou ainsi que des ombres portées sur les autres éléments d’habillage.
Pour les pétales de la rosace, j’ai utilisé un dégradé simple pour un peu de skeumorphisme ainsi que des ombres portées.
J’ai également utilisé les modes de fusion, celui de lumière dure et surtout, celui appelé “multiplier”.

Déclinaisons

Paris, encore

On peut décliner ces cartes sur tout un tas d’autres sujets.

Voici, sur le même mode, la répartition entre étudiants, chômeurs et retraités à Paris par iris:

Et ici, les modes de déplacement utilisé à Paris : deux roues, voiture, transport collectif, marche à pied :

Bonus tracks

Allez, en bonus, voici une carte de la population par âge quinquennal, par département

A vrai dire, je n’ai rien inventé : des cartes exploitant cette technique ont déjà circulé dans les médias, souvent réalisées à l’échelle internationale ou nationale.

Par exemple, il y a cette carte de la pollution, issue de l’atlas du carbone :


Kenneth Field, un carto-critique très pertinent, et créateur de cartes originales, avait par exemple créé cette carte à l’occasion du mondial du football

Rond – ballon, il n’y a qu’un pas !

Le bâti de Paris façon réseau ou comment faire des gribouillis avec R comme avec Processing

Paris sous forme de réseau. Non, on ne parle pas de rues, mais de bâti. Dans cet article, nous proposerons le passage d’une représentation à plat des bâtiments en une figuration sous forme de lignes, aux multiples évocations. On verra qu’avec R, on peut faire certaines choses comme Processing, l’outil de référence en design génératif.

La carte


Cliquer sur l’image pour la voir en grand sur flickr
Sur cette carte est représenté le bâti de Paris sous la forme d’une toile. Chaque point de couleur représente un bâtiment et la couleur de chacun indique la période de construction du bâtiment. 



La rampe de couleurs est celle utilisée par Etienne Côme sur sa carte interactive BATIPARIS.

Sur ma carte, un arc relie deux bâtiments et il est d’autant plus clair qu’il relie deux bâtiments de périodes de construction différentes.

Ce mode de visualisation peut être intéressant pour explorer les différences de valeur dans une variable dans un voisinage, comme dans le cas de cette carte de la densité de population en France :

Différence de densité de population au niveau départemental (RGP INSEE 2013)

Sur ma carte, en suivant le réseau, on trouve toujours un chemin pour aller d’un bâtiment à un autre, même si l’on part de la place de l’Étoile pour se diriger vers Bercy; ceci a été obtenu grâce à une technique appelée arbre couvrant de poids minimal. Cette représentation a pour objet d’illustrer la densité d’une ville où tout serait interconnecté.

Paris dresse sa toile


La représentation du bâti est le plus souvent faite avec l’emprise des bâtiments, ce qui peut donner de beaux résultats comme celui de BATIPARIS.
Afin d’illustrer l’évolution champignonnesque d’une ville et se départir de cette représentation classique des bâtiments, on pourrait être tentés de représenter cela sous forme de réseau.

toile d’araignée, mycélium et réseau neuronal

Sur ma carte, les ramifications qui relient chaque bâtiment peuvent évoquer de multiples choses : les synapses de neurones rappelant les smart cities, les filaments d’un mycélium, voire même, si on regarde tout ça en noir et blanc, une sorte d’écriture qui évoquerait le tissage, au fil du temps, d’un tissu urbain.

Les données


Les données utilisées sont celles de l’Atelier Parisien d’URbanisme (APUR). Les données de bâti de l’APUR sont très riches. Outre la période de construction, on y trouve l’année de réhabilitation, les caractéristiques de la toiture, la surface d’ensoleillement,…
Une variable est particulièrement intéressante, que nous exploiterons peut-être dans un nouveau post : la hauteur des bâtiments.

La colonne que nous avons utilisée est la même que celle utilisée par Etienne Côme dans son application : la colonne C_PERCONST.

La transformation


L’illustration ci-dessus, créée par Benedikt Gross, montre le processus en cours lors d’un design de données. Je lui ai juste ajoutée les outils utilisés.
Pour obtenir notre carte, nous avons créé un algorithme exploitant la théorie des graphes ainsi que des techniques de design génératif. Pour ce dernier domaine, Processing constitue l’outil de référence. Il est adopté par nombre de data artists, d’artistes multimédia. Nous verrons grâce à cet article que R permet aussi de faire du design génératif. Néanmoins, pour peindre nos données, nous nous sommes tournés vers un second outil : QGIS, plutôt que R, en raison de capacités graphiques assez particulières.

Dans un premier temps, les centroïdes des bâtiments ont été générés

L’île de la Cité

Ensuite, nous avons relié tous ces points grâce à la fonction de Delaunay

De l’eau naît

J’ai trouvé que le nombre de segments était bien trop grand pour le rendu final. Afin de l’épurer, j’ai utilisé une technique de la théorie des graphes appelée Arbre couvrant de poids minimal, ou minimum spanning tree en anglais. Cet arbre est tel qu’on peut trouver un chemin entre chaque sommet avec un nombre de branches minimal

MST (Minimum Spanning Tree)

Les liaisons entre bâtiments étaient selon moi trop rectilignes. Afin d’obtenir quelque chose de plus “smooth”, j’ai utilisé les courbes de Bézier. C’est une forme visuelle très usitée dans les infographies de réseaux.

Avec Bézier, tout devient plus doux

Le style


  • J’ai adopté un fonds noir pour mettre en contraste les données. 
  • J’ai posé le réseau de segments avec un petit effet flou, avec le mode de fusion “addition” et une valeur de luminosité différente selon la différence de période reliant deux bâtiments. Grâce au mode addition ajouté entre les objets, les endroits où les segments se superposent semblent s’éclairer.
  • Par-dessus, j’ai posé les centroïdes de bâtiments coloriés selon la période de construction, avec un mode de fusion “revêtement”. Pour rappel, la rampe de couleurs est celle utilisée dans BATIPARIS. J’avais utilisé le mode de fusion “revêtement” pour la carte de l’orientation des rues de Paris. Avec ce mode, c’est comme si on teintait une couche avec les couleurs d’une autre.
  • Enfin, en dessous, j’ai disposé la Seine afin de donner un contexte. Celle-ci se trouve dans une couleur hors du spectre utilisé pour le bâti, et avec un peu de flou pour donner un côté organique et en atténuer la présence. 

J’aurais pu rajouter des données contextuelles supplémentaires mais j’ai préféré garder un côté minimaliste pour cette carte.

Voici un tableau récapitulant l’agencement des différentes couches dans QGIS avec leur style et leur ordre de superposition :

Variations


J’ai réalisé des petites variations autour de cette carte.

Tout d’abord, en générant des lots de données par période, on peut voir dans quelles zones Paris a dressé sa Toile au cours du temps. C’est comme si on voyait la signature de chaque époque.

Jusqu’en 1800, on construit surtout au centre
Georges Eugène Hausmann est dans la place. Ca construit à tout va, y compris des places (comme celle de l’Étoile)
Le rythme de construction semble plus modéré dans les 80’s, à part peut-être dans le NE de la capitale


Le code


Décortiquage

La librairie spdep a permis de réaliser la triangulation de Delaunay :

coords = coordinates(ile_cite)
nb = tri2nb(coords)

ainsi que de calculer l’arbre couvrant de poids minimal :

nb = tri2nb(coords)
nbw = nb2listw(nb, zero.policy = FALSE)
mst.bh <- mstree(nbw,5)

J’ai créé une fonction appelée MakeLineFromCoords qui permet de tracer une ligne à partir d’une série de coordonnées. D’ailleurs, je me suis dit qu’elle pouvait être utile pour superposer tout type de graphique en ligne sur des cartes : par exemple, évolution du chômage par département au cours du temps :

makeLineFromCoords <- function(coords, i) {

  Sl1 = Line(coords)
S1 = Lines(list(Sl1), ID=as.character(i))
Sl = SpatialLines(list(S1))
return(Sl)
}

R inclut une librairie appelée bezier qui, comme son nom l’indique, permet de dessiner…des courbes de Bézier.

b = bezier(t=t <- seq(0, 1, length=100), p=rbind(coords[from, ], midpoint, coords[to, ]))

midpoint désigne le point d’ancrage situé entre les deux points à connecter. La position de ce dernier détermine la courbure finale de l’arc. J’ai injecté un peu de hasard dans la position de ce dernier.
Dans un premier temps, j’ai calculé la distance séparant les deux points :

d = sqrt((coords[from, 1] – coords[to, 1])^2 + (coords[from, 2] – coords[to, 2])^2)

Ensuite, j’ai bougé sa position selon certains seuils. Tout d’abord, j’ai calculé un facteur de transformation qui déterminera dans quelle direction se fait le déplacement du point :

ifelse(runif(1,-1,1) > 0, 1, -1)


Ensuite, j’ai appliqué un ratio tel que le point bougera dans un rayon allant du milieu situé entre les deux points à une distance égale au tiers de la distance séparant les deux points.

Voici le code correspondant au déplacement en X :

(coords[from, 1] + coords[to, 1])/2 + ifelse(runif(1,-1,1) > 0, 1, -1

Et celui en Y est similaire :

(coords[from, 2] + coords[to, 2])/2 + ifelse(runif(1,-1,1) > 0, 1, -1) * runif(1,0,d/3)

Au final, le point intermédiaire d’ancrage de la courbe de Bézier se situera ici :

midpoint = c((coords[from, 1] + coords[to, 1])/2 + ifelse(runif(1,-1,1) > 0, 1, -1) * runif(1,0,d/3),(coords[from, 2] + coords[to, 2])/2 + ifelse(runif(1,-1,1) > 0, 1, -1) * runif(1,0,d/3))

Le code dans son intégralité



Corine Disco Cover

This post is about the making of an experimental video that dives into the land cover of Paris & its surroundings with a hint of RGB magic. 

You’ll see the purpose of gridding, how to cross a vector and a raster layer in R. Finally we’ll cover one of the latest functionnality of QGIS 2.12 : data-defined layer combinations in atlases.


If the world were square


do you prefer ice creams or sandwiches ?
Matrix is the first movie approaching grids

Gridding is a way to simplify the representation of data on a large scale. It can be a useful way to “resample” the vision of a territory if you work on bigger units. These units, usually squares, are comparable, on the contrary to administrative units. If you can omit the administrative units, gridding is a way to get an homogeneous view of your territory. The larger your area of interest will be, the bigger the squares from your grid you might configure.

hexagons look ecologic, triangles ecclesiastic

Also, you could prefer hexagonal units to square units for more harmony. Some prefer triangles. Anyway, the number of possible shapes are limited.

Land Cover of Paris & surroundings

I wanted to visualize the land cover of Ile-De-France width a grid. Ile-de-France is a region that includes Paris at its center. Precisely, I decided to study the repartition of urban , agricultural and natural (forests, gardens, etc…) areas, that is 3 variables over the whole area.

the best diagram I’ve ever made, even if pie charts are the worst

The question was : how to represent 3 variables at a time on each square unit ? One answer could have been “diagrams”, that is pie charts, histograms on the map
But I found it cooler to use an RGB representation.

A Freemason way of seeing data

Let’s suppose R means urban, G Natural and B Agricultural. If the color of a square approaches red, then it means urban; if it is purple, it means urban & agricultural areas dominate but not natural; if it is desaturated, it means the 3 types of cover are equally mixed.

The recipe

I remember a mushroom im my parents’garden had the same shape

For the land cover of Ile-de-France, we have a nice 2012 Corine Land Cover GeoTiff.

Laurent Manadou exploring data

I wondered if one could adopt a dynamic view that goes from the global view to the zonal one in a sort of “data diving”.

beware of the logarithmic launching pad

I wondered what series of sizes to adopt. I decided to generate 100 images. 1km would be the minimum unit and we would reach the BIG square covering all the region, the width of Ile-De-France being precisely 154 451 km according to GÉOFLA. The distribution, as illustrated, will be logarithmic.

The same sensation appears when you dive head first in a municipal pool

Above is a GIF presenting the different calculation canvases.

Here is the video with land cover percentages encoded as colors, with reversed order, from the biggest to the smallest unit. The changing colors make it kind of animated dancefloor.

Dataekwondo

This illustration, that I had made for a GéoTribu post, illustrates the usual workflow I adopt, from production to design. I generated the distinct grids associated with the land cover percentage values with R. I designed all the layers with QGIS. With the same tool, I generated an atlas. With this atlas, I created a video with ffmpeg.

Technical details

The QGIS part may interest the QGIS fans as it uses a new QGIS 2.12 functionnality : data defined control over map layers and style presets

Generation : R

I created a function in R that generates a grid. The hack consists in polygonizing a raster layer, of which the resolution determinates the square size :

creerGrille = function(pol, size=50000) {
r = raster(extend(extent(pol), size)); res(r) = size; r[]=1
grille = rasterToPolygons(r)
grille = grille[which(gIntersects(grille, pol, byid=T)), ]
grille = grille[-which(gTouches(grille, reg, byid=T)), ]
return(grille)
}

The extract function crosses the vector grid and the 2012 CLC raster. The table function gives the number of pixels of each category :

  counts = extract(clc2, grille, 
method="simple",
fun=function(x,...)table(x),
na.rm=T)

The prop.table calculates the proportion of urban, natural and agricultural areas :

RGB = round(prop.table(counts[, 1:3], 1)*255)

Design : QGIS

color RGB code from columns, named “R”, “G”, and “B”

An expression defines the color of each square depending on its column values :

MultiQML plugin

I saved the QML style file, then used the multiQML plugin to apply it to the 99 other layers.

Data defined control over map layers and style presets

To get a static coverage layer, I duplicated my area of interest as many times as the number of pages (or layers) and assigned the square size value to the layer names. In the latest version of QGIS, you can generate an atlas with a list of layers on each page defined by an expression.

Also, I used some generative design tricks to get the animated halo effect around the IDF region.

Shapeburst fill and data-defined color

The color follows the chromatic color circle, covering all the rainbow colors :
color_hsv(scale_linear(@atlas_featurenumber,1,100,0,360),40,27)

riding the wave of generative design



sin wave shade distance


while a sin function defines the shade distance. This way, we get a “flame” effect with increasing then decreasing shade width. scale_linear(sin(scale_linear(@atlas_featurenumber,1,100,0,pi()*2)),0,1,5,10)

Video making: ffmpeg

Finally, this command line generates the video from images :
ffmpeg -framerate 25 -r 10 -i output_%d.jpg -vcodec mpeg4 -b 50000k -qscale:v 1 dancingVideo.avi

The code

The functions

The processing code

Credits

Images from The Noun Project : diver by Claire Jones, honey by Angela Horton, sandwich by Gareth Servant, biker by Les vieux garçons, ice cream by Rafaël Massé.