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 :
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 :
script
Rendre la spirale 3D
Pour rendre la spirale d’origine 3D il faut apporter trois modifications au script :
- 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. - Utiliser la commande
splotau lieu deplot. C’est simplement sa version 3D. - Ajouter dans les colonnes de
uune colonne entre lesy(la seconde) et la couleur (la troisième) pour renseigner lesz. 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 à :
script
Une spirale 3D et lisse
On peut combiner les deux techniques pour créer une spirale à la fois 3D et lisse :
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 :
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.
script
script
script