La spirale du climat, le retour

Cette fois-ci elle est toute lisse et en 3D

Article pas relu

Dans le précédent article je montrais comment obtenir une spirale du climat en utilisant gnuplot et les outils Unix. Depuis je creuse les capacités de gnuplot pour tenter d’y apporter des améliorations. Dans cet article nous allons voir comment rendre la spirale 3D et davantage lisse et même jouer avec des emojis.

Je mets moins de détails dans cet article mais le code est toujours disponible en dessous de chaque figure.

Rendre la spirale lisse

La dernière version de la spirale du climat disponible sur le site de la NASA est beaucoup plus “lisse” que ce que l’on a produit dans le dernier article. Et pour cause, le dernier article trace des segments droits entre les points de données, tous disposés autour du cercle, on obtient donc 12 angles assez nettes.

Pour lisser la courbe gnuplot fourni plusieurs techniques de “smoothing”. Je vous passe les détails mais celle que l’on veut est smooth path. Si la courbe que l’on doit lisser est assez longue, ce qui est notre cas, il faut choisir un nombre d’échantillons conséquent sans quoi la courbe “lissée” ne sera pas du tout lisse :

La courbe verte avec seulement 10 échantillons n
figure 1 : La courbe verte avec seulement 10 échantillons n'est pas aussi lisse que la courbe bleu avec 1000 (68Ko)
script

En l’occurrence 50 000 échantillons semble être un bon compromis entre temps de calcul et lissage de la courbe. On pourrait être tenté de directement modifier la script qui produit la spirale en demandant smooth path sauf que dommage, smmoth et la coloration avec palette ne sont pas compatibles. La courbe tracée est d’une seule couleur.

On peut contourner ce problème grâce à une fonctionnalité de gnuplot permettant de lui demander non pas de tracer une courbe mais de mettre les coordonnées de la courbe qui aurait été tracée dans un fichier. On obtient alors des coordonnées x et y représentant la courbe déjà lissée que l’on peut tracer avec un style basique line, fonctionnant avec palette.

Le script créant la table est ici. Il suppose l’existance d’un dossier nommé bonusfigures. La tête du fichier généré est :

# Curve 0 of 1, 49926 points
# Curve title: "'data.dat' u (x($2+1,$1*-1+4)):(y($2+1,$1*-1+4))"
# x y type
 1.0747e-06  0.81  i
 0.0173563  0.80211  i
 0.0354639  0.793827  i
 0.0535323  0.785525  i

Reste à savoir comment retrouver la valeur de l’anomalie pour la mapper sur la palette. Rien de plus simple, puisque l’on a les coordonnées (x,y) il suffit de faire un rapide théorème de pythagore pour retrouver la distance entre le point et l’origine du cercle :

anomalie(x,y)=sqrt(x**2+y**2)-1

On obtient la figure suivante :

La spirale du climat toute lisse toute belle
figure 2 : La spirale du climat toute lisse toute belle (240Ko)
script

Rendre la spirale 3D

Pour rendre la spirale d’origine 3D il faut apporter trois modifications au script :

  1. ajouter set hidden3d. Cette option permet de garantir que les lignes qui seront à l’arrière de la spirale ne seront pas visibles parce que masquées par celles à l’avant. Sans cette option les lignes à l’avant sont celles tracées en dernier, alors même qu’elles devraient être masquées depuis notre point de vue. Cette option fait particulièrement la différence pour la génération de vidéo que l’on verra après. Merci à Ethan Merrit qui a très rapidement répondu à ma question à ce sujet.
  2. Utiliser la commande splot au lieu de plot. C’est simplement sa version 3D.
  3. Ajouter dans les colonnes de u une colonne entre les y (la seconde) et la couleur (la troisième) pour renseigner les z. Puisque l’on veut représenter la spirale comme “montant” dans le temps on peut simplement y mettre le numéro de la ligne à l’aide de la colonne virtuelle 0.

Le résultat ressemble à :

Une jolie spirale du climat en 3D. Plus le temps avance plus la spirale
monte.
figure 3 : Une jolie spirale du climat en 3D. Plus le temps avance plus la spirale monte. (72Ko)
script

Une spirale 3D et lisse

On peut combiner les deux techniques pour créer une spirale à la fois 3D et lisse :

Une spirale montante, lisse et en 3D
figure 4 : Une spirale montante, lisse et en 3D (132Ko)
script

Même dans une relativement petite image comme celle-ci on remarque que les traits ne sont pas parfaitement lisses, l’image paraît moins nette que la spirale 3D non lisse. C’est parce qu’avec cette technique de lissage on se retrouve à tracer des dizaines de milliers de minuscules traits qui ne se branchent pas toujours parfaitement les un derrière les autres, presque comme si c’était des points. Avec un échantillon encore plus élevé et une résolution d’image un peu plus grande on peut obtenir un résultat de meilleur qualité mais l’image deviendrait assez grosse. Pour l’article ici tant pis.

Une spirale 3D et lisse et avec des emojis

Maintenant que l’on a lissé la courbe on a à notre disposition pleins de points intermédiaires entre les 12 points de “vraies” données. On peut donc tracer la courbe avec le style point et obtenir une “illusion” de trait. On peut aussi dire à gnuplot que les points à tracer ne sont pas une forme prédéfinies mais un caractère bien précis. Et qui dit texte dit emoji. On peut conditionner quel emoji va apparaître en fonction de la valeur de l’anomalie. Un emoji évoquant le froid quand on est dans les négatifs, un emoji évoquant le chaud quand on est dans le chaud. Puisqu’il y a vraiment beaucoup de points (~50 000) on peut aussi dire à la commande plot de sauter tous les n points avec every n, n étant un entier. On met tout ça ensemble et on obtient :

Une spirale du climat 3d où les points sont des emojis rendant
compte de la valeur de l
figure 5 : Une spirale du climat 3d où les points sont des emojis rendant compte de la valeur de l'anomalie (140Ko)
script

Des vidéos

Finalement on peut adapter tous ces scripts pour en faire des vidéos, sur le même principe que l’article précédent. Pour les vidéos en 3d il ne faut pas oublier de fixer l’étendue des z sinon la première frame ne fera qu’un point de haut, la seconde deux points etc. L’option set hidden3d est également indispensable.

Puisque les courbes lissées contiennent beaucoup de points la génération des frames prend pas mal de temps. Il devrait être possible de grandement accélérer cela si j’étais capable de demander que le calcul soit fait de manière incrémentale. En effet si la vidéo fait 150 frames le premier de la courbe a été calculé et affiché 149 fois “pour rien”. Peut-être que la solution est du côté du traitement d’image. gnuplot pourrait générer les 150 images avec un seul segment de lignes chacune puis on superposerait les images les une sur les autres pour obtenir la vidéo. J’ai pas mieux creusé, ce ne sont que des idées.

Ah aussi j’ai oublié de mettre les années mais j’ai la flemme.

figure 6 : La spirale du climat animée toute lisse (80Ko)
script
figure 7 : La spirale du climat en 3D animée (64Ko)
script
figure 8 : La spirale du climat en 3D toute lisse animée (40Ko)
script