我正在使用矩阵格式的文本文件在gnuplot中绘制热图:
z11 z12 z13
z21 z22 z23
z31 z32 z33
依此类推,使用以下命令(不包括轴标记等,为简洁起见):
plot '~/some_text_file.txt' matrix notitle with image
矩阵非常大,在大多数情况下超过50 000个元素,这主要是由于我的y维度(#rows)的大小。我想知道是否有办法在y维度上更改一组最大值的限制值,同时保持x和z维度相同。例如。如果矩阵中的最大值为[4000,33],我希望我的y范围以4000 +为中心 - 让我们说y维长度的20%。
感谢。
答案 0 :(得分:2)
修改强>
下面的解决方案基本上是正确的想法,但是它在我的示例中有效但不是一般的,因为gnuplot如何将stats
命令与矩阵文件一起使用。有关详细信息,请参阅答案后的评论。
您可以使用stats
执行此操作,以获取动态对应于最大值的索引。
考虑以下我命名为data
的文件:
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 5 3 4
0 1 2 3 4
如果我运行stats
,我会:
gnuplot> stats "data" matrix
* FILE:
Records: 25
Out of range: 0
Invalid: 0
Blank: 0
Data Blocks: 1
* MATRIX: [5 X 5]
Mean: 2.1200
Std Dev: 1.5315
Sum: 53.0000
Sum Sq.: 171.0000
Minimum: 0.0000 [ 0 0 ]
Maximum: 5.0000 [ 3 2 ]
COG: 2.9434 2.0566
最大值位于[ 3 2 ]
位置,意味着第3 + 1行和第2列+ 1(在gnuplot中,第一行/列将是数字0)。运行stats
后,会自动创建一些变量(help stats
以获取更多信息),其中包含STATS_index_max_x
和STATS_index_max_y
,其中存储了最大值的位置:
gnuplot> print STATS_index_max_x
3.0
gnuplot> print STATS_index_max_y
2.0
您可以使用它自动设置范围。现在,因为STATS_index_max_x
实际上给你y(而不是x)的位置,你需要小心。可以通过系统调用获得获取范围的总行数(可能有更好的内置函数,我不知道):
gnuplot> range = system("awk 'END{print NR}' data")
gnuplot> print range
5
所以基本上你会这样做:
stats "data" matrix
range = system("awk 'END{print NR}' data")
range_center = STATS_index_max_x
d = 0.2 * range
set yrange [range_center - d : range_center + d]
将yrange
置于最大值的位置,并将其拉伸至其总范围的+ -20%。
plot "data" matrix w image
的结果现在是
而不是