使用gnuplot:将矩阵(热图)的x轴和y轴用行和列名称标记

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轴标记为A-E,y轴标记为A-E。这个矩阵的大小不总是相同的,但行数始终等于列数,并且始终有标签。
有人能帮我吗?我猜我得使用using命令,但到目前为止,这对我来说完全像巫术一样...
非常感谢!
2个回答

12

这个问题确实有些棘手,我无法在没有一些*nix命令行技巧的情况下解决它。

首先,我们想要获取x轴刻度标签和y轴刻度标签:

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

现在,XTICS是字符串"F G H I J",YTICS是字符串"A B C D 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 )

我们使用了两个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,希望这没问题。


您,先生,是我今天的英雄。非常感谢您! - Eekhoorn
@zenbomb -- 没问题。对我来说,尝试弄清楚它实际上是一种有趣的游戏。我不经常使用 matrix 数据文件,所以这是一个很好的机会让我学习有关 gnuplot 的新知识。 - mgilson
XTICS无需awk:XTICS="cut -d' ' -f1 test.dat |xargs " ; 滥用xargs将列转换为行。 - Manwe

6

1
新增功能:自版本5.0补丁级别0起,可使用rowheaderscolumnheaders选项。 - Christoph
1
附加说明2:为了使其正常工作,OP数据的第一行应该是这样的,例如X A B C D E,否则xticlabels将向后偏移一个。 - theozh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接