2016-11-22 3 views
3

Ich habe Probleme beim Erstellen einer Heatmap mit gnuplot für Daten mit verschiedenen Maßstäben.gnuplot heat map mit verschiedenen Skalen

Betrachten Sie den folgenden Beispieldatensatz:

0.100 1.000  10.0 
0.010 1.000  20.0 
0.001 1.000  40.0 

0.100 10.00  20.0 
0.010 10.00  40.0 
0.001 10.00  80.0 

0.100 100.0  40.0 
0.010 100.0  80.0 
0.001 100.0 160.0 

Wenn ich es mit einem Heatmap plotte, scheint es nur richtig zu sein, wenn ich so die x-Werte skalieren, dass sie im gleichen Bereich wie der y -Werte.

Unten finden Sie ein illustrierendes Beispiel. Nur die zweite Handlung gibt mir die richtigen Werte der Heatmap (hohe Werte in der oberen linken Ecke, niedrige Werte in der unteren rechten Ecke):

set multiplot layout 2,1 

set pm3d 
set dgrid3d 20,20 
set view map 

set xlabel 'unscaled' 
splot 'data.dat' u 1:2:3 

set xlabel 'scaled by factor 1000' 
splot 'data.dat' u ($1*1000):2:3 

Wie kann ich das erreichen auch für die nicht skalierte Werte ?

Jede Hilfe wird geschätzt. Danke vielmals.

Antwort

1

Hier gehen Sie:

set dgrid3d 20,20 
set pm3d explicit 
set view map 

set table "interpolated_data.dat" 

splot 'data.dat' using ($1*1000):2:3 

set output 'heatmap.png' 
set terminal pngcairo 

set multiplot layout 2,1 

unset table 
unset dgrid3d 
set pm3d 
unset surface 

set xlabel 'scaled by factor 1000' 
splot 'interpolated_data.dat' u 1:2:3 

set xlabel 'unscaled' 
splot 'interpolated_data.dat' u ($1/1000):2:3 
+0

Super, vielen Dank! – user31028

+0

Gern geschehen. Bitte zögern Sie nicht, die Antwort zu akzeptieren, wenn es Ihr Problem gelöst hat. –

+1

Zusatz: 'set dgrid3d 20,20' ist äquivalent zu' set dgrid3d 20,20 qnorm'. Der Parameter 'qnorm' gewichtet alle Punkte auf dem generierten Gitter mit einem Faktor' (dx^2 + dy^2)^norm/2', was nicht unbedingt der Fall ist, wenn die x- und y-Skalen sehr unterschiedlich sind. – Christoph

0

Der skalierte Plot korrekt aussieht, aber ich bin mir nicht sicher, ob es wirklich richtig ist. Zumindest scheint in der unteren linken Ecke ein Artefakt zu sein, ein lokales Maximum, das wahrscheinlich nicht da sein sollte. Sie können es besser sehen, wenn Sie set view map entfernen:

original plot

Ich denke, der Grund, warum die dgrid3d ist. Es macht eine gewisse Gewichtung der benachbarten Punkte, was zu unerwarteten Ergebnissen führen kann.

Mein Vorschlag wäre, eine lineare Interpolation zu verwenden, indem Sie set dgrid3d 20,20 entfernen und set pm3d interpolate 20,20 verwenden. Dies ergibt sich folgendes Bild:

linear interpolation

Schließlich Ihre Daten fragt irgendwie für mindestens ein logscale Grundstück versuchen:

interpolate and logscale

Mein Skript für die letzte Handlung folgt. Nichts besonderes im Vergleich zu dir. Ich musste xrange für das unskalierte Plot angeben, und es ist länger wegen der 4 Plots.

reset 
set terminal png size 1200,800 
set output "data_log.png" 

set logscale x 
set logscale y 

set multiplot layout 2,2 title "With \"interpolate\" and logscale" 

set pm3d at s interpolate 20,20 
set hidden3d 

set xlabel 'unscaled' 
set origin 0.5,0.5 
set xrange [0.001:0.1] 
splot 'data.dat' u 1:2:3 notitle 
set autoscale x 

set xlabel 'scaled by factor 1000' 
set origin 0.5,0.0 
splot 'data.dat' u ($1*1000):2:3 notitle 

set view map 

set xlabel 'unscaled' 
set origin 0.0,0.5 
set xrange [0.001:0.1] 
splot 'data.dat' u 1:2:3 notitle 
set autoscale x 

set xlabel 'scaled by factor 1000' 
set origin 0.0,0.0 
splot 'data.dat' u ($1*1000):2:3 notitle 

unset multiplot 
set output