Domanda

Ho un insieme di punti "Dati" che definiscono una curva che voglio tracciare con Bezier Smooth. Quindi voglio riempire l'area sotto quella curva tra alcune coppie di valori x. Se avessi solo un paio di valori X non è così difficile perché definisco una nuova serie di dati e traccialo con Secco.Esempio:

Esempio di ciò che voglio fare

Il problema è che voglio farlo più volte nella stessa trama.

Modifica: Esempio di funzionamento minimo:

#!/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
.

dove la struttura dei "dati" è:

x_point y_point
.

E ho capito che il mio problema è che in effetti non riesco a riempire nemmeno una curva, sembra essere riempita perché la pendenza è quasi costante lì.

È stato utile?

Soluzione

Per riempire parti sotto una curva, è necessario utilizzare lo stile filledcurves. Con l'opzione x1 si riempie la parte tra la curva e l'asse x.

Per riempire solo parti della curva, è necessario filtrare i dati, ovvero fornire i valori X un valore di 1/0 (punto dati non valido) se sono al di fuori dell'intervallo desiderato e il valore corretto dai dati file altrimenti. Alla fine traccia la curva stessa:

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'
.

Completa la gamma [-1:0.5] e [0.2:0.8].

Per dare un esempio di funzionamento, uso il nome file speciale +:

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'
.

con il risultato (con 4.6.4):

Inserire l'immagine Descrizione qui

Se è necessario utilizzare un po 'di levigatura, il filtro può influire sulla curva dei dati in modo diverso, a seconda della parte filtrata. È possibile prima scrivere i dati levigati in un file temporaneo e quindi utilizzare questo per la stampa 'normale':

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'
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top