我正在从矩阵格式的文本文件中绘制 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_xSTATS_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/

10-12 23:18