AnyMath 文档

宽高比和自动图形尺寸

该页面正在翻译中。

绘图中一个非常常见的问题是处理纵横比和其他精确控制数字的方法。

例如,许多地块需要方轴。 如果你看过 轴心,轴心,你可能知道它有一个 方面 可以控制轴框宽高比的属性。 这个方面与数据限制无关,它只是关于轴的相对视觉长度。

让我们来看一个常见的例子,一个旁边有colorbar的方形轴: </无翻译>

using CairoMakie
set_theme!(backgroundcolor = :gray90)

f = Figure(size = (800, 500))
ax = Axis(f[1, 1], aspect = 1)
Colorbar(f[1, 2])
f
5d6885e

正如您所看到的,轴是正方形的,但它和colorbar之间也有很大的间隙。 这是为什么?

我们可以通过在轴所在的同一单元格中添加一个框来可视化原因: </无翻译>

Box(f[1, 1], color = (:red, 0.2), strokewidth = 0)
f
517c4c2

框的红色区域向外延伸到轴留下的空白处。 这说明了 方面 关键字实际上在做。 它减小了轴的尺寸,从而实现了所选的纵横比。 它没有告诉布局轴住在"请让这个单元格坚持这个宽高比"。 就布局而言,轴具有未定义的大小,因此其布局单元格可以具有布局认为正确的任何大小,基于布局的所有其他内容和图形大小。

因此,使用 方面 总是会导致间隙,除非轴所在的布局单元格碰巧具有恰好正确的长宽比。 这意味着 方面 应该只在它引起的空白不太重要的情况下使用。

对于所有其他情况,有一个不同的方法。

我们希望强制布局将轴单元保持在特定的宽高比。 因此,我们必须操纵布局本身,而不是轴。

默认情况下,每个GridLayout行和列的大小为 汽车(). 这意味着大小可以取决于固定大小的内容,如果有的话,否则它会扩展以填充可用空间。 如果我们想强制一个单元格具有宽高比,我们需要将其各自的行或列大小设置为 方面.

让我们再次尝试上面的示例,但这次我们强制轴的列相对于轴的行(即第1行)具有1.0的宽高比。 </无翻译>

f = Figure(size = (800, 500))
ax = Axis(f[1, 1])
Colorbar(f[1, 2])
colsize!(f.layout, 1, Aspect(1, 1.0))
f
83d28c4

正如您所看到的,这次colorbar紧贴轴,它们之间没有不必要的空白。 我们可以想象 方面 再次用一个红色框,向我们显示布局单元格的范围: </无翻译>

Box(f[1, 1], color = (:red, 0.2), strokewidth = 0)
f
3a8f9d2

所以这次布局单元格本身是正方形的,因此填充它的轴也是正方形的。 让我来证明我们可以再次玩同样的游戏,并给轴一个 方面 这与布局单元格所具有的正方形不同。 这将再次导致不必要的空白: </无翻译>

ax.aspect = 0.5
f
4adb4ea

现在我们再次更改列方面,以消除这个差距: </无翻译>

colsize!(f.layout, 1, Aspect(1, 0.5))
f
cd500d9

让我们用一个方轴回到我们以前的状态: </无翻译>

f = Figure(size = (800, 500))
ax = Axis(f[1, 1])
Colorbar(f[1, 2])
colsize!(f.layout, 1, Aspect(1, 1.0))
f
67854eb

现在您可能会认为Axis和Colorbar之间不再存在空白,但左侧和右侧有很多空白。 为什么布局不能为我们解决这个问题?

那么,在Makie中,布局必须在我们设置的图形大小的范围内运行。 如果内容太少,它不能只是减少数字大小。 这是因为很多时候,数字是为了完全符合某些学术期刊的大小规则而创建的,因此您绘制的内容不允许与数字大小混淆。

因此,我们在示例中所做的是对布局中对象的大小引入约束,这样就不可能填满理论上可用的所有空间。 如果你仔细想想,在填充矩形空间的同时,用方形轴和薄色条填充这个图是不可能的。 我们需要一个更小的数字!

但它到底应该有多小? 这将是相当困难的眼球,但谢天谢地有一个功能,这个确切的目的。 通过调用 resize_to_layout!,我们可以将图形大小调整为布局所需的所有内容的大小。

让我们试试吧: </无翻译>

resize_to_layout!(f)
f
e732fac

正如您所看到的,两侧的空白已被修剪。 (如果缩放看起来更小或更大,那只是因为这个网站上的显示,而不是底层的数字大小)。

这种技术对于内容应该决定图形大小的各种情况都很有用,而不是相反。

例如,假设我们有一个具有25个方轴的平面图,它们的大小都是150乘150。 我们只需制作这些具有固定宽度和高度的轴即可。 该 汽车 默认布局的大小列和行拾取这些测量值并相应地调整自身。

当然,图大小将默认不适合这样的安排,内容将剪辑: </无翻译>

f = Figure()
for i in 1:5, j in 1:5
    Axis(f[i, j], width = 150, height = 150)
end
f
aba6f35

但就像之前我们可以打电话 resize_to_layout! 并且尺寸将被校正,因此不会发生削波。 </无翻译>

resize_to_layout!(f)
f
e5317a2