我正在从矩阵格式的文本文件中绘制 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%。
谢谢。
最佳答案
编辑:
下面的解决方案基本上是正确的想法,但是它在我的示例中有效,但在一般情况下无效,因为 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
居中在您的最大值的位置,并将其拉伸(stretch) +-20% 的总范围。plot "data" matrix w image
的结果是现在代替
关于gnuplot - GNU 在动态计算点周围设置热图轴限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26369395/