Gnuplot:为彩盒

时间:2017-11-15 15:03:06

标签: gnuplot

我正在使用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

enter image description here

垂直:

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

enter image description here

1 个答案:

答案 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