8

我对 gnuplot 完全陌生,谷歌搜索后没有找到可行的解决方案。

我有一个看起来像这样的数据矩阵:

  A B C D E
A 0 2 3 4 5
B 6 0 8 9 0
C 1 2 0 4 5
D 6 7 8 0 0
E 1 2 3 4 0

我想做的是用 绘制热图plot 'result.csv' matrix with image,x 轴用 AE 标记,y 轴用 AE 标记。这个矩阵并不总是具有相同的大小,但行数总是等于列数并且它总是被标记。

有人可以帮我解决这个问题吗?我想我必须使用该using命令,但到目前为止,这对我来说似乎是完全的巫术......

非常感谢!

4

2 回答 2

12

这实际上是一个 doosie,如果没有一些 *nix shell 魔法,我无法实现它。

首先,我们要获取 x tic 标签和 y tic 标签:

XTICS="`awk 'BEGIN{getline}{printf "%s ",$1}' test.dat`"
YTICS="`head -1 test.dat`"

此时,XTICS 是字符串“FGHI J”,YTICS 是字符串“ABCD E”。

现在,我们要通过迭代设置 xtics:

set for [i=1:words(XTICS)] xtics ( word(XTICS,i) i-1 )
set for [i=1:words(YTICS)] ytics ( word(YTICS,i) i-1 )

我们使用了 2 个 gnuplot 内置函数(wordwords)。 words(string)计算给定字符串中有多少单词(单词是由空格分隔的字符序列)。 word(string,n)返回字符串中的第 n 个单词。

现在,我们可以绘制您的数据文件...唯一的问题是matrix想要使用您的数据文件中的所有行和列。您可能可以使用every关键字减少实际读取的行/列,但我不知道如何在矩阵文件上执行此操作——而且我认为继续依赖 shell 实用程序(awksed)可能更容易

plot "<awk '{$1=\"\"}1' test.dat | sed '1 d'" matrix w image
#######^ replace the first field with nothing
################################## ^ delete first line

现在你的情节(希望)看起来像你想要的那样。

还要注意,由于我们使用了迭代,这个脚本只能在 gnuplot 4.3 或更高版本中工作——因为当前的稳定版是 4.6,希望没关系。

于 2012-05-29T12:31:12.437 回答
5

好的,这个问题很老了,但是在 gnuplot 中已经实现了一种更简单的方法:

plot 'result.csv' matrix rowheaders columnheaders with image

http://gnuplot.sourceforge.net/demo/heatmaps.html得到它

于 2017-06-21T08:46:38.193 回答