宽高比和自动图形尺寸
|
该页面正在翻译中。 |
绘图中一个非常常见的问题是处理纵横比和其他精确控制数字的方法。
例如,许多地块需要方轴。 如果你看过 轴心,轴心,你可能知道它有一个 方面 可以控制轴框宽高比的属性。 这个方面与数据限制无关,它只是关于轴的相对视觉长度。
using CairoMakie
set_theme!(backgroundcolor = :gray90)
f = Figure(size = (800, 500))
ax = Axis(f[1, 1], aspect = 1)
Colorbar(f[1, 2])
f
正如您所看到的,轴是正方形的,但它和colorbar之间也有很大的间隙。 这是为什么?
Box(f[1, 1], color = (:red, 0.2), strokewidth = 0)
f
框的红色区域向外延伸到轴留下的空白处。 这说明了 方面 关键字实际上在做。 它减小了轴的尺寸,从而实现了所选的纵横比。 它没有告诉布局轴住在"请让这个单元格坚持这个宽高比"。 就布局而言,轴具有未定义的大小,因此其布局单元格可以具有布局认为正确的任何大小,基于布局的所有其他内容和图形大小。
因此,使用 方面 总是会导致间隙,除非轴所在的布局单元格碰巧具有恰好正确的长宽比。 这意味着 方面 应该只在它引起的空白不太重要的情况下使用。
对于所有其他情况,有一个不同的方法。
我们希望强制布局将轴单元保持在特定的宽高比。 因此,我们必须操纵布局本身,而不是轴。
默认情况下,每个GridLayout行和列的大小为 汽车(). 这意味着大小可以取决于固定大小的内容,如果有的话,否则它会扩展以填充可用空间。 如果我们想强制一个单元格具有宽高比,我们需要将其各自的行或列大小设置为 方面.
f = Figure(size = (800, 500))
ax = Axis(f[1, 1])
Colorbar(f[1, 2])
colsize!(f.layout, 1, Aspect(1, 1.0))
f
Box(f[1, 1], color = (:red, 0.2), strokewidth = 0)
f
ax.aspect = 0.5
f
colsize!(f.layout, 1, Aspect(1, 0.5))
f
f = Figure(size = (800, 500))
ax = Axis(f[1, 1])
Colorbar(f[1, 2])
colsize!(f.layout, 1, Aspect(1, 1.0))
f
现在您可能会认为Axis和Colorbar之间不再存在空白,但左侧和右侧有很多空白。 为什么布局不能为我们解决这个问题?
那么,在Makie中,布局必须在我们设置的图形大小的范围内运行。 如果内容太少,它不能只是减少数字大小。 这是因为很多时候,数字是为了完全符合某些学术期刊的大小规则而创建的,因此您绘制的内容不允许与数字大小混淆。
因此,我们在示例中所做的是对布局中对象的大小引入约束,这样就不可能填满理论上可用的所有空间。 如果你仔细想想,在填充矩形空间的同时,用方形轴和薄色条填充这个图是不可能的。 我们需要一个更小的数字!
但它到底应该有多小? 这将是相当困难的眼球,但谢天谢地有一个功能,这个确切的目的。 通过调用 resize_to_layout!,我们可以将图形大小调整为布局所需的所有内容的大小。
resize_to_layout!(f)
f
正如您所看到的,两侧的空白已被修剪。 (如果缩放看起来更小或更大,那只是因为这个网站上的显示,而不是底层的数字大小)。
这种技术对于内容应该决定图形大小的各种情况都很有用,而不是相反。
例如,假设我们有一个具有25个方轴的平面图,它们的大小都是150乘150。 我们只需制作这些具有固定宽度和高度的轴即可。 该 汽车 默认布局的大小列和行拾取这些测量值并相应地调整自身。
f = Figure()
for i in 1:5, j in 1:5
Axis(f[i, j], width = 150, height = 150)
end
f
resize_to_layout!(f)
f