Désolé pour le titre long et probablement médiocre.
J'essaie de tracer des données dans gnuplot, où le fichier de données a le format
size = 0.5 type = 7 set term pngcairo set output 'Foo.png' set palette rgbformulae 22,13,-31 set cblabel "z" unset key set xlabel 'x' set ylabel 'y' set title 'y vs. x' plot "Data.txt" u 1:2:3 w p pt type ps size palette
Je veux tracer y par rapport à x et, pour chaque point, indiquer la valeur de z par la couleur du point. Actuellement, j'utilise le code suivant pour cela:
x y z 1.0 1.5 0.1 1.3 1.8 0.7 2.1 3.7 1.1 3.1 4.3 1.5 3.7 4.7 1.8
Cela fonctionne, mais je voudrais apporter la modification suivante: pour chaque point dont la valeur z est inférieure à un seuil, disons 1,0, je veux que la couleur soit définie sur gris, quelle que soit la valeur z. Ensuite, pour les valeurs z supérieures ou égales au seuil, je veux que la couleur soit choisie dans la palette en fonction de la valeur z.
Ainsi, je veux que la couleur passe de manière discontinue du gris au bleu (pour la palette actuelle) à la valeur de coupure. Est-ce possible et si oui comment?
3 Réponses :
C'est difficile à faire avec une palette basée sur des formules rgb. C'est relativement facile avec une palette définie. Voici un exemple qui donne une palette proche de ce que vous avez choisi, avec un gris foncé collé en bas. cbrange
est alors réglé de sorte que votre coupure z soit le minimum. Toutes les valeurs z inférieures à cbmin se verront attribuer la valeur du point final, qui est gris foncé dans ce cas.
set xrange [0:1]; set yrange [0:pi] set sample 100; set isosample 100 set palette defined (-0.01 "grey20", 0 "blue", 0.4 "green", 0.6 "yellow", 1.0 "red") zmin = -0.6 set cbrange [zmin: *] set xyplane at zmin splot cos(x)*sin(y+y*(x*x)) with pm3d
Merci, c'est très gentil! Lorsque j'ajoute votre palette suggérée et la gamme appropriée, la valeur de gris apparaît tout en bas de mon échelle de couleurs à droite. Savez-vous s'il existe un moyen de supprimer cela?
Pas vraiment. Vous pourriez peut-être en faire une tranche encore plus fine de la palette. Au lieu de -0.01 "grey20"
, utilisez peut-être -0.001 "grey20"
. Cependant, je pense que la tranche qui apparaît dans la barre de couleur ne sera jamais inférieure à 1/128 de la hauteur totale.
Après gnuplot 5.4, cela peut être réalisé en utilisant la fonction "palette ()" dans "en utilisant" et en la combinant avec la "variable rgb avec point lc".
size = 3 ### 0.5 in original code type = 7 set term pngcairo set output 'Foo.png' set palette rgbformulae 22,13,-31 set cblabel "z" unset key set xlabel 'x' set ylabel 'y' set title 'y vs. x' set cbrange [0:2] ### this is required by palette() function gray = 0x808080 ### gray color expressed by integer plot NaN w p palette, \ "Data.txt" u 1:2:($3<1 ? gray : palette($3)) w p pt type ps size lc rgb variable
La valeur RVB transmise à "lc rgb variable" est déterminée en comparant $ 3 avec la valeur seuil 1 (par exemple).
"NaN wp palette" est un tracé factice, une technique pour forcer la palette de couleurs à apparaître. Sans cela, la palette de couleurs ne sera pas affichée.
devrait être mentionné, je suppose que la fonction palette()
n'existe que depuis gnuplot 5.4.0, pas dans gnuplot 5.2.8
Merci pour votre réponse! Ma version de gnuplot est 5.2 (sans possibilité de mise à niveau, semble-t-il) donc je ne peux pas essayer votre solution (voir le commentaire de @theozh). J'ai donc accepté la réponse d'Ethan.
La fonction @theozh 'palette (z)' semble avoir été ajoutée en février 2020 (après la version 5.2.8). J'ai mis à jour la réponse. Merci de le signaler.
@AlexandreVandermonde Je suis désolé d'apprendre que vous ne pouvez pas l'essayer pour le moment. Si vous avez une chance de mettre à niveau gnuplot, vous pouvez faire quelque chose comme la réponse. Merci pour votre réponse, y compris une explication.
Voici une version 5.2 de gnuplot. Vous pouvez utiliser une palette rgbformulae. Il utilise le datablock $PALETTE
qui est créé après l'exécution de la test palette
commandes.
Code: (testé avec gnuplot aussi bas que 5.2.0)
### cut-off colors for a given rgbformulae palette (gnuplot >=5.2) reset session # create some test data set xrange [-5:5] set yrange [-5:5] set samples 50 set isosamples 50 set table $Data splot (sin(1.3*x)*cos(.9*y)+cos(.8*x)*sin(1.9*y)+cos(y*.2*x))*3 unset table set palette rgbformulae 22,13,-31 test palette # necessary to put the palette into the datablock $PALETTE myColorMin = 0 myColorMax = 6 myOutOfRangeColor = 0x808080 myColorPos(c) = int(255.0 * (c-myColorMin)/(myColorMax - myColorMin))+1 myColor(c) = c<myColorMin || c>myColorMax ? myOutOfRangeColor : \ (int(word($PALETTE[myColorPos(c)],2)*0xff)<<16) + \ (int(word($PALETTE[myColorPos(c)],3)*0xff)<<8) + \ (int(word($PALETTE[myColorPos(c)],4)*0xff)) set cbrange [myColorMin:myColorMax] set view 36, 72 set ztics 5 splot $Data u 1:2:3:(myColor($3)) w pm3d lc rgb variable notitle ### end of code
Résultat:
Merci, c'est très gentil! Je vais probablement garder la réponse d'Ethan comme acceptée, car il était le premier et comme il n'est pas si important que j'utilise ou non la palette rgbformula.