2016-11-22 68 views
3

我有麻煩創建與gnuplot數據與不同尺度的熱圖。gnuplot不同尺度的熱圖

考慮下面的示例數據集:

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 

如果我使用熱圖繪製它,它似乎只如果我縮放x值是正確的,使得他們在相同的範圍內爲y - 值。

請在下面找到一個示例。只有第二個圖給我的熱圖(在右下角的左上角高值,低值)的正確值:

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 

我怎麼也實現這一點對於非標定值?

任何幫助表示讚賞。非常感謝。

回答

1

在這裏你去:

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

太棒了,非常感謝! – user31028

+0

你不客氣。如果它解決了您的問題,請隨時接受答案。 –

+1

此外:'set dgrid3d 20,20'相當於'set dgrid3d 20,20 qnorm'。參數'qnorm'通過一個因子'(dx^2 + dy^2)^ norm/2'對所生成的網格上的所有點進行加權,如果x和y尺度非常不同,這可能不是預期的結果。 – Christoph

0

的比例情節看起來是正確的,但我不知道是否真的是正確的。至少在左下角似乎有一個神器,一個可能不應該在那裏的局部最大值。你可以更好地看到它,如果你刪除set view map

original plot

我想原因是dgrid3d。它會對相鄰點進行一些奇特的加權,這可能會導致意想不到的結果。

我的建議是通過刪除set dgrid3d 20,20並使用set pm3d interpolate 20,20來使用線性插值。這給下面的圖片:

linear interpolation

最後,你的數據在某種程度上要求至少嘗試logscale情節:

interpolate and logscale

我在過去的劇情腳本如下。與你相比沒什麼特別的。我必須爲未縮放的情節指定xrange,並且由於4個情節而更長。

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