2012-11-22 16 views
12

Ho cercato di modificare lo stile di riempimento per l'opzione filledcurves in gnuplot in modo che il colore di riempimento rappresenti la differenza tra le due curve su un grafico bidimensionale. Sto pensando a questo come all'estensione dell'opzione 'filledfurves above/below' in cui invece di avere solo due colori che rappresentano sopra o sotto c'è una gamma di colori o una tavolozza.Gnuplot filledcurves with palette

Ecco un esempio della trama che vorrei fare da un file di dati utilizzando lo stile di curva riempito sopra/sotto. Una barra di colori che rappresenta la differenza di y tra le due curve sarebbe molto utile.

http://i.stack.imgur.com/RLlpU.png

ho cercato di fare questo con l'aggiunta di una quarta colonna al comando utilizzando cioè

plot 'data.txt' using 1:2:3:($3-$2) with filledcurves fs palette 

ma il filledcurves non sembra accettare la quarta colonna ... Ho anche considerato provando la variabile rgb ma questo non sembra funzionare neanche.

+2

Sembra un lavoro per una richiesta di funzionalità (http://sourceforge.net/tracker/?group_id=2055&atid=352055); Non credo che gnuplot possa fare ciò che vuoi in modo nativo. Finché non verrà implementato, potreste pensare semplicemente a tracciare la differenza tra gli spettri di stato caldo e freddo come una linea separata sulla trama. (Che può essere riprodotto meglio nella stampa e essere un po 'più facile da capire per i daltonici.) – andyras

+0

Non ci ho pensato abbastanza, ma potresti ottenere qualcosa di simile tramite una combinazione di 'set view map ',' splot' e 'pm3d' ... – mgilson

+0

Questo sembra quello che stai cercando. http://gnuplot-tricks.blogspot.com/2009/08/filled-curves-in-gnuplot.html –

risposta

-2

Il trucco è disegnare le linee, quindi riempire tra di loro con filledcurves. Ecco come farlo (in base alla examples at gnuplot):

set style line 2 lc rgb 'forest-green' 
set style line 3 lc rgb 'plum' 
set style fill pattern 5 lc 'yellow' 
set xrange [0:3000] 
set yrange [0:1] 
plot 'data.txt' u 1:2:3 w filledcurves notitle, \ 
    '' u 1:2 ls 2 with lines notitle, \ 
    '' u 1:3 ls 3 with lines notitle 

L'output è simile al seguente: enter image description here

Il file di dati contiene questi valori fittizi (che ricordano il secondo grafico):

500  0.90 0.90 
1000 0.90 0.75 
1500 0.92 0.40 
2000 0.95 0.30 
2500 0.94 0.23 
4

Sto giocando con una patch per gnuplot per consentire l'utilizzo di linecolor rgb variable per le curve piene. Poi il seguente codice gnuplot può essere utilizzato:

max_color=1 
# for a datafile one could extract the maximum diffference with e.g. 
# stats 'hotcold.dat' using 1:($3-$2) 
# max_color = (abs(STATS_min_y) > abs(STATS_max_y)) ? abs(STATS_min_y) : abs(STATS_max_y) 

red(val) = (val < 0 ? abs(1+val/max_color) : 1) 
green(val) = (1 - abs(val)/max_color) 
blue(val) = red(-val) 
rgb(val) = 65536*int(255*red(val)) + 256*int(255*green(val)) + int(255*blue(val)) 

set yrange[0:1] 
set xrange[400:2500] 
set samples 200 

fhot(x) = 0.1*exp(-((x-400)/200)**2) + 0.8*exp(-((x-2000)/300)**2) 
fcold(x) = 0.25*exp(-((x-700)/100)**6)+ 0.4 - (2e-4*(x-2500))**2 
plot '+' using 1:(fhot($1)):(fcold($1)):(rgb(fhot($1)-fcold($1))) with filledcurves lc rgb var t '',\ 
    '' using 1:(fhot($1)) with lines lw 4 lc rgb rgb(max_color) t 'Hot',\ 
    '' using 1:(fcold($1)) with lines lw 4 lc rgb rgb(-max_color) t 'Cold' 

Che dà questo risultato: enter image description here

non ho presentato la patch, ancora, perché non so se ho capito bene la domanda e perché non so se ho coperto tutti i casi. Quindi potrebbe essere necessario un po 'di messa a punto.

+0

Quindi, come va quella patch? L'hai caricato da qualche parte? È utilizzabile? – rgcalsaverini

+0

@rgcalsaverini No, non l'ho caricato.L'ho scritto per il gusto di farlo, ma dal momento che non ho bisogno di questa grafica, non sapevo se fosse l'approccio corretto, se mi mancava qualcosa ... E poiché non ho mai avuto alcun feedback, fermato con la prima implementazione rudimentale. – Christoph

+1

Bel patch! Queste soluzioni meritano, almeno, le stesse motivazioni che la domanda ha! ;) –

0

Prova ad utilizzare gli istogrammi riempiti.

set style fill solid 1.0 
plot \ 
datafile u 1:2:3 lt palette w boxes,\ 
datafile u 1:2:3 lt palette lw 2 w l 

La colonna 3 definisce il colore di riempimento in base alle impostazioni della tavolozza, le colonne 1 e 2 definiscono i punti di dati. È inoltre possibile utilizzare l'istogramma del colore di sfondo per cancellare le parti sotto il grafico.

Vorrei aggiungere un'immagine ma non riesco a causa della scarsa reputazione.