从原始(未绑定)数据在gnuplot中创建2D直方图(热图)

时间:2017-07-19 17:44:01

标签: gnuplot

我有一个包含2列原始未绑定数据的文件(x和y位移)。文件中的每一行对应一个新的时间步。我想将x和y位移相互关联。

对于每一行,我想将x值加之并将y值加到直方图中,然后加上一个' count'到相应的(x,y)bin。

我有一个代码已经完成了大部分工作,它将每个轴分开,然后放置一个点/' count'在相应的空间,但问题是它没有添加'计数'一起。相反,这些点只是相互重叠。您可以看到一些点看起来比其他多个点彼此重叠的点更粗/更暗。像这样:

Gnuplot output with my full data set. Shows the bolder overlapping points

我的问题是:我怎样才能获得积分/数字'相互叠加的(比如在我的图像中),将被添加到一起,以便我可以看到更高相关性的区域与颜色图或类似的东西在哪里?

I'd like my plot to look like this instead, with the color value corresponding to the number of points/'counts' in the 2D bin

我的gnuplot代码有点像我想做的那样:

#!/usr/local/bin/gnuplot

set term postscript eps enhanced color
set encoding utf8
set offsets
set style fill solid

bin(x,width,min)=width*(floor((abs(x) - min)/width) + 0.5)  + min

set output '2d.test.eps'
set palette defined (-1 "red", 0 "white", 1 "blue")
set cbrange [0:10]

binwidth=0.1
binwidth=0.1
xmin=-360
ymin=-360
set boxwidth binwidth*0.75

set view map
splot '2d.dat' using (bin($1,binwidth,xmin)):(bin($2,binwidth,ymin)):(1.0) not

数据文件格式:

   0.864    3.868
   1.878    3.617
   0.138    2.787
   0.646    3.220
  -0.969    3.176
  -0.447    3.031
  -0.316    3.130
   0.205    3.342
  -1.127    3.661
  -1.349    3.702
...

1 个答案:

答案 0 :(得分:1)

如果您愿意使用awk进行计算并使用uniq进行计数,则可以使用:

awk 'function abs(x){return (sqrt(x*x))}{print 0.1*(int((abs($1)+360)/0.1)+0.5)-360" "0.1*(int((abs($2)+360)/0.1)+0.5)-360}' input.dat | sort | uniq -c > output.dat

由于uniq预先计算了你需要绘制的数字,如

set view map
splot "output.dat" 2:3:1 matrix with image

这也应该直接来自gnuplot:

splot "<awk 'function abs(x){return (sqrt(x*x))}{print 0.1*(int((abs($1)+360)/0.1)+0.5)-360\" \"0.1*(int((abs($2)+360)/0.1)+0.5)-360}' data.dat | sort | uniq -c" u 2:3:1  2:3:1 matrix with image

(注意逃脱的#34;字符!)