2012-11-22 25 views
12

Próbowałem zmienić styl wypełnienia opcji fillcurves w gnuplot, aby kolor wypełnienia reprezentował różnicę między dwiema krzywymi na wykresie 2-wymiarowym. Myślę o tym jako o rozszerzeniu opcji "fillcurves powyżej/poniżej", gdzie zamiast tylko dwóch kolorów reprezentujących powyżej lub poniżej istnieje zakres kolorów lub paleta.Krzywe wypełnione gnuplotem z paletą

Oto przykład wykresu, który chciałbym wykonać z pliku danych przy użyciu powyższego/poniżej wypełnionego stylu krzywej. Barbarystyczny kolor przedstawiający różnicę y pomiędzy dwiema krzywymi byłby bardzo użyteczny.

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

Próbowałem to zrobić dodając czwartą kolumnę do komendy przy użyciu tj

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

ale filledcurves nie wydaje się akceptować czwartą kolumnę ... Mam również uważane próbując zmiennej rgb, ale to też nie działa.

+2

Wygląda to jak zadanie dla żądania funkcji (http://sourceforge.net/tracker/?group_id=2055&atid=352055); Nie sądzę, by gnuplot mógł robić to, co chcesz. Dopóki to nie zostanie wdrożone, możesz pomyśleć tylko o narysowaniu różnicy między widmem stanu gorącego i zimnego jako osobnej linii na twojej działce. (To może się lepiej reprodukować i być trochę łatwiejsze do zrozumienia dla osób niewidomych). – andyras

+0

Nie myślałem o tym wystarczająco dużo, ale możesz osiągnąć coś podobnego dzięki kombinacji "ustawionej mapy widoku" ',' splot' i 'pm3d' ... – mgilson

+0

To wygląda na to, czego szukasz. http://gnuplot-tricks.blogspot.com/2009/08/filled-curves-in-gnuplot.html –

Odpowiedz

-2

Sztuką jest narysowanie linii, a następnie wypełnienie między nimi za pomocą filledcurves. Oto jak to zrobić (na podstawie 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 

Wyjście wygląda następująco: enter image description here

Plik danych zawiera te wartości obojętne (które przypominają swój drugi wykres):

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

Gram z łatką do gnuplot, aby umożliwić używanie wypełnionych krzywych przy użyciu linecolor rgb variable. Następnie poniższy kod gnuplot można stosować:

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' 

Daje to wynik: enter image description here

ja nie złożyli poprawkę, jeszcze, bo nie wiem, czy dobrze zrozumiałem pytanie poprawnie i ponieważ nie wiem, czy obejmowałem wszystkie przypadki. Dlatego może być konieczne pewne dostrojenie.

+0

Więc jak idzie ta łatka? Przesyłałeś go gdzieś? Czy to jest użyteczne? – rgcalsaverini

+0

@rgcalsaverini Nie, nie przesłałem go.Napisałem to dla zabawy, ale ponieważ nie potrzebuję takiej grafiki, nie wiedziałem, czy to jest właściwe podejście, jeśli czegoś mi brakowało ... A ponieważ nigdy nie otrzymałem żadnej opinii na ten temat, zatrzymany przy pierwszej prymitywnej implementacji. – Christoph

+1

Ładna łatka! Rozwiązania te zasługują przynajmniej na tyle przebojów, na jakie jest to pytanie! ;) –

0

Spróbuj użyć wypełnionych histogramów.

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 

Kolumna 3 definiuje kolor wypełnienia kolorem zgodnie z ustawieniami palety, kolumny 1 i 2 definiują punkty danych. Możesz również użyć histogramu koloru tła do czyszczenia części pod wykresem.

Chciałbym dodać obraz, ale nie mogę z powodu niskiej reputacji.