3
votes

Définissez la couleur sur gris pour les points sous une certaine limite lors du traçage avec la palette dans Gnuplot

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?


0 commentaires

3 Réponses :


3
votes

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

entrez la description de l'image ici


2 commentaires

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.



3
votes

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.

entrez la description de l'image ici


4 commentaires

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.



1
votes

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:

entrez la description de l'image ici


1 commentaires

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.