我正在使用gnuplot将一些矩阵文件绘制为热图。这些矩阵可以是水平的(矩阵的高度低于其宽度)或垂直的(矩阵的高度高于其宽度)。
一切都很好 - 除了彩盒。我已设置set size ratio -1
以获得具有方位比为1:1的样方的热图。此命令可拉伸或缩小图形。但它也拉伸或收缩了彩盒。
我想为我的颜色框设置一个固定的宽度 ,因为我的一些矩阵文件的宽度非常小 - 这导致了一个非常薄的颜色框。我试图手动设置我的颜色框的宽度。但是,如果不手动设置其原点和完整尺寸,这是不可能的。
实施例
水平:
unset key
set cbrange [0:5]
set xrange [0:10]
set yrange [0:5]
set size ratio -1
set cbtics out nomirror
$map1 << EOD
5 4 3 1 0 5 4 3 1 0
2 2 0 0 1 2 2 0 0 1
0 0 0 1 0 0 0 0 1 0
0 0 0 2 3 0 0 0 2 3
0 1 2 4 3 2 2 0 0 1
EOD
plot '$map1' using ($1+.5):($2+.5):($3) matrix with image
垂直:
unset key
set cbrange [0:5]
set xrange [0:5]
set yrange [0:10]
set size ratio -1
set cbtics out nomirror
$map1 << EOD
5 4 3 1 0
2 2 0 0 1
0 0 0 1 0
0 0 0 2 3
0 1 2 4 3
5 4 3 1 0
2 2 0 0 1
0 0 0 1 0
0 0 0 2 3
2 2 0 0 1
EOD
plot '$map1' using ($1+.5):($2+.5):($3) matrix with image
答案 0 :(得分:1)
@ user8153为我的问题提供了一个很好的解决方案。它就像我给出的例子中的魅力一样。但我不得不改变他的命令。否则它不适用于我的实际输入数据:
List("a,b").toString
这将绘制一个旁边有颜色框的图形(图形窗口和颜色框之间没有任何空格 - 我们稍后会修复它)。颜色框的宽度是输出宽度的3.4%(当使用像png或pngcairo,svg或eps这样的术语时......)。
我更喜欢图形和彩色框之间的一点空间。我的颜色框的来源(位置)是# [...]
cbwidth = 0.034
rightmargin = 0.875
set colorbox user origin graph 1, graph 0 size cbwidth, graph 1
set rmargin at screen rightmargin
# [...]
。该位置等于图形窗口的右下角。 1 表示此窗口的 100%。因此,如果我们想增加一些额外的空间,我们只需增加这个百分比。 @ user8153决定添加10%的额外空格= graph 1, graph 0
(查看他的评论 - 我将origin graph 1.1, graph 0
更改为first 0
)。不幸的是,在这种情况下我们无法设置静态百分比,因为这100%是指图形窗口(不是画布宽度 - 分别是孔图图像),图形窗口的宽度随矩阵纵横比而变化。因此,您必须每次调整此值,具体取决于图形窗口的实际宽度。
为了自动完成此操作,我建议手动将终端的大小设置为高于640x480的值(在这种情况下为1200x1200,裁剪将削减空白区域):
graph 0
之后,您可以自由计算颜色框的x位置。要么使用gnuplots if / else 要么使用其他语言(在我的情况下它是打字稿,因为我通过node.js-gnuplot-wrapper调用gnuplot - 但逻辑是相同的):
set term pngcairo size 1200,1200 crop
当然你不应该忘记xtics和ytics,x轴和y轴的标签以及标题需要一些空间。这些不包括在上层算法中。也许有人有一个更好的解决方案,如何获得真正的图形窗口宽度。获得该值后,您可以修改颜色框的原点命令部分:
来自:const size = 1200 // canvas size (width and height): 1200px
const cbspace = 0.017; // prefered space between colorbox and window: 20px / 1200px
const rmargin = 0.875; // right margin next to the graphs window
let graphWindowWidth: number; // real width of the graphs window
if (matrixHeight > matrixWidth) {
graphWindowWidth = (matrixWidth / matrixHeight) * size;
} else {
graphWindowWidth = size * rmargin;
}
let cbPosX = (cbspace * size + graphWidth) / graphWidth;
至:set colorbox user origin graph 1, graph 0 size cbwidth, graph 1