Remplir plusieurs sections ci-dessous une courbe de données dans Gnuplot
Question
J'ai un ensemble de points de données"," définition d'une courbe que je veux tracer avec de bézier lisse.Je tiens donc à remplir la zone en dessous de la courbe entre certaines paires de valeurs de x.Si je n'avais qu'une paire de valeurs de x, il n'est pas difficile parce que je définir un nouvel ensemble de données et de tracer avec filledcu.Exemple:
Le problème est que je veux le faire plusieurs fois dans la même parcelle.
Edit:Minimes de travail exemple:
#!/usr/bin/gnuplot
set terminal wxt enhanced font 'Verdana,12'
set style fill transparent solid 0.35 noborder
plot 'data' using 1:2 smooth sbezier with lines ls 1
pause -1
Si la structure de données " est:
x_point y_point
Et j'ai réalisé que mon problème en fait est que je ne peux pas remplir même pas une courbe, il semble être rempli car la pente est presque constant il.
La solution
Pour remplir les pièces ci-dessous une courbe, vous devez utiliser le filledcurves
style.Avec l'option x1
vous remplissez la partie comprise entre la courbe et l'axe des abscisses.
Afin de remplir uniquement les parties de la courbe, vous devez filtrer vos données, c'est à diredonner les valeurs de x d'une valeur de 1/0
(point de données non valides) s'ils sont en dehors de la plage souhaitée, et la valeur correcte du fichier de données autrement.À la fin de vous tracer la courbe elle-même:
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
'' using 1:2 with lines lw 3 lt 1 title 'curve'
Cela remplit la gamme [-1:0.5]
et [0.2:0.8]
.
Pour donner un exemple, j'ai utiliser le nom de fichier +
:
set samples 100
set xrange [-2:2]
f(x) = -x**2 + 4
set linetype 1 lc rgb '#A3001E'
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot '+' using (filter($1, -1, -0.5)):(f($1)) with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):(f($1)) with filledcurves x1 lt 1 notitle,\
'' using 1:(f($1)) with lines lw 3 lt 1 title 'curve'
Avec le résultat (avec 4.6.4):
Si vous devez utiliser une sorte de lissage, le filtre peut affecter les données de la courbe de différentes manières, selon les filtré de la partie.Vous pouvez d'abord écrire le lissage des données dans un fichier temporaire, puis de les utiliser pour "normal" complot:
set table 'data-smoothed'
plot 'data' using 1:2 smooth bezier
unset table
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data-smoothed' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
'' using 1:2 with lines lw 3 lt 1 title 'curve'