AnyMath 文档

网格布局

该页面正在翻译中。

正确设置列和行大小

有四种不同类型的大小,你可以给行和列。

固定

固定(scene_units) 用于将列或行设置为绝对大小,与其内容无关。 这只有在列或行中存在可变宽度内容时才真正有意义,这些内容可以收缩或扩展以满足此大小。 你可能不需要 固定 尺寸经常。 </无翻译>

using CairoMakie

f = Figure()

Axis(f[1, 1], title = "My column has size Fixed(400)")
Axis(f[1, 2], title = "My column has size Auto()")

colsize!(f.layout, 1, Fixed(400))
# colsize!(f.layout, 1, 400) would also work

f
db5c3cd

亲戚

相对(分数) 用于将列或行设置为可用宽度或高度的一定比例的大小。 这很有用,例如,如果您希望一列跨越可用宽度的50%,无论其他内容在那里。 在这种情况下,您将使用 亲属(1/2). 可用宽度是GridLayout的宽度减去包括突起的行或列间隙所占用的空间。 </无翻译>

using CairoMakie

f = Figure()

Axis(f[1, 1], title = "My column has size Relative(2/3)")
Axis(f[1, 2], title = "My column has size Auto()")
Colorbar(f[1, 3])

colsize!(f.layout, 1, Relative(2/3))

f
79f4d6b

汽车

汽车 大小是有点更复杂的理解。 它有两个参数,布尔值 [医]特里德米娜 而数 比率. 默认值为 自动()==自动(真,1). 这也是默认的行高和列宽。

调整大小的列或行 自动(真) 尝试将自己的大小与其内容相适应。

当一个 网格布局 解决了,它查看每行或每列中的内容,并检查它是否报告固定大小。 许多对象可以报告自己的宽度或高度,因为它们的内容具有特定的大小,例如 标签. 其他对象通常与用户设置的宽度或高度一起使用,例如 Colorbar(场景,宽度=30). 在这种情况下, 网格布局 还可以看到colorbar具有30个单位的宽度,并将列宽度适合该值。 对象像 轴心,轴心 另一方面通常不设置为特定的尺寸。

只有跨越_single_行或列的对象分别报告其宽度或高度。 如果_multiple_行或列跨越,则没有很好地定义对象需要的空间应该如何分布。

如果有一个以上的对象具有固定的宽度或高度在一个 自动(真) 大小的列,使用最大尺寸。

如果列或行的大小 自动(错误),固定大小的对象被忽略。 当然,也可能发生这样的情况:行或列中没有固定大小的对象。 自动(真) 尺寸。 在这两种情况下,列或行通过毕竟保留的内容来确定它们的大小 固定, 亲戚, 方面 和尺寸-推断 自动(真) 已计算列或行。 各未确定 汽车 列获取与其成比例的剩余空间的份额 比率 参数。

例如,假设有两列未确定 汽车 300单位空间时的大小。 列1具有比率 1 而第2列有比率 2. 第一列将得到 1 / (1 + 2) * 300 == 100 单位,而第二列得到 2 / (1 + 2) * 300 == 200 单位。 </无翻译>

using CairoMakie

f = Figure()

Axis(f[1, 1], title = "My column infers my width\nof 200 units")
Axis(f[1, 2], title = "My column gets 1/3rd\nof the remaining space")
Axis(f[1, 3], title = "My column gets 2/3rds\nof the remaining space")

colsize!(f.layout, 2, Auto(1)) # equivalent to Auto(true, 1)
colsize!(f.layout, 3, Auto(2)) # equivalent to Auto(true, 2)

f
d7b0bcd

方面

这个尺寸也有点难以理解。 语法是 长宽(参考,比率). 宽度为 方面(1,2.0) 设置为第1行高度的2.0倍,无论该高度是多少。 因此,[1,1]处的网格单元将始终具有2比1的宽高比。 相反的模式适用于具有 方面 尺寸。

当您想要约束网格单元的宽高比时,宽高大小的列或行非常有用。 例如,一个总是应该是正方形的情节。 在布局级别比设置更好的情况下强制方面 轴心。方面=AxisAspect(1) 在大多数情况下,因为它确保了一个_intact layout_,其中所有网格单元边框都在视觉上对齐。 一个 轴心,轴心方面=AxisAspect(1) 另一方面只是缩小,所以它保持正方形,但这会破坏与其他网格内容的对齐。 </无翻译>

using CairoMakie

f = Figure()

Axis(f[1, 1], title = "I'm square and aligned")
Box(f[1, 2], color = (:blue, 0.1), strokecolor = :transparent)
Axis(f[1, 2], aspect = AxisAspect(1),
    title = "I'm square but break the layout.\nMy actual cell is the blue rect.")
Axis(f[2, 1])
Axis(f[2, 2])

rowsize!(f.layout, 2, Relative(2/3))
colsize!(f.layout, 1, Aspect(1, 1))

f
b5ebded

注意请记住,如果您对行和列大小设置了太多约束,则GridLayout很容易太大或太小。 如果您使用具有固定大小或固定宽高比的元素,则使用可变宽度元素来填充剩余空间是很好的。

嵌套

网格可以嵌套在其他网格内,依此类推,到任意深度。 顶部网格的父级应该是放置布局的场景。 当您将网格放置在另一个网格内时,该网格会自动成为其父网格。 默认情况下,网格内部也设置为alignmode,这意味着内容边缘与网格的边界框对齐,不包括外部突起。 这样,嵌套网格中的绘图就可以很好地沿着它们的样条对齐。 </无翻译>

using CairoMakie

f = Figure()

subgl_left = GridLayout()
subgl_left[1:2, 1:2] = [Axis(f) for i in 1:2, j in 1:2]

subgl_right = GridLayout()
subgl_right[1:3, 1] = [Axis(f) for i in 1:3]

f.layout[1, 1] = subgl_left
f.layout[1, 2] = subgl_right

f
524924c

对齐方式

在这里,您可以看到带有和不带边距的外部对齐模式与内部对齐模式之间的区别。 只有标准的内部模式才能很好地对齐包含轴的轴棘。 外部模式主要用于主GridLayout,以便在窗口边缘和绘图之间留出一些空间。 您可以看到法线轴看起来与放置在网格内部的内对齐轴相同,并且它们都有效地对齐完全相同。 </无翻译>

using CairoMakie

f = Figure(size = (800, 800))

Axis(f[1, 1], title = "No grid layout")
Axis(f[2, 1], title = "No grid layout")
Axis(f[3, 1], title = "No grid layout")

Axis(f[1, 2], title = "Inside", alignmode = Inside())
Axis(f[2, 2], title = "Outside", alignmode = Outside())
Axis(f[3, 2], title = "Outside(50)", alignmode = Outside(50))

[Box(f[i, 2], color = :transparent, strokecolor = :red) for i in 1:3]

f
7c1fe22

跨区安置

网格布局中的元素可以跨越多个行和列。 您可以使用范围语法和整个宽度或高度的冒号来指定它们。 您还可以使用end指定最后一行或列。 </无翻译>

using CairoMakie

f = Figure()

Axis(f[1, 1:2], title = "[1, 1:2]")
Axis(f[2:4, 1:2], title = "[2:4, 1:2]")
Axis(f[:, 3], title = "[:, 3]")
Axis(f[1:3, 4], title = "[1:3, 4]")
Axis(f[end, end], title = "[end, end]")

f
5867f17

通过索引添加行和列

如果在网格布局的当前范围之外进行索引,则不会出现错误。 相反,布局会自动调整大小以包含新索引。 如果您想迭代构建布局,或添加超级或侧面标题,这非常有用。 </无翻译>

using CairoMakie

f = Figure(size = (800, 800))

Axis(f[1, 1])
for i in 1:3
    Axis(f[:, end+1])
    Axis(f[end+1, :])
end

Label(f[0, :], text = "Super Title", fontsize = 50)
Label(f[end+1, :], text = "Sub Title", fontsize = 50)
Label(f[1:end-1, 0], text = "Left Text", fontsize = 50,
    rotation = pi/2)
Label(f[1:end-1, end+1], text = "Right Text", fontsize = 50,
    rotation = -pi/2)

f
781581b

如果您的行从1到3,并索引到行0,则行现在的范围从0到3。 如果然后索引到行-1,则行的范围从-1到3,依此类推。 自GridLayoutBase以来,此行为已更改。jl v0.7.0. </无翻译>

using CairoMakie

f = Figure(size = (800, 800))

for i in 1:3, j in 1:3
    Axis(f[i, j])
end

Label(f[0, :], text = "First Supertitle", fontsize = 20)
Label(f[-1, :], text = "Second Supertitle", fontsize = 30)
Label(f[-2, :], text = "Third Supertitle", fontsize = 40)

f
b9a10f3

修剪空行和列

如果您以交互方式更改布局并最终得到未使用的行或列, 修剪! 我会帮你拿掉的。

这里我们从两个轴开始: </无翻译>

using CairoMakie

f = Figure()

ax1 = Axis(f[1, 1], title = "Axis 1")
ax2 = Axis(f[1, 2], title = "Axis 2")

f
10aebc1

现在我们决定,如果第二个轴低于第一个轴,我们会更喜欢它。 我们将其移动到新单元格中,旧的未使用列留空。 </无翻译>

f[2, 1] = ax2

f
b5d1c7c

我们可以用 修剪!: </无翻译>

trim!(f.layout)

f
247a27a

调整行和列之间的空间

您可以使用 吵闹!科尔加普! 以分别改变行或列之间的间距。 </无翻译>

using CairoMakie

fig = Figure()

axs = [Axis(fig[i, j]) for i in 1:3, j in 1:3]
axs[1, 1].title = "Group A"
axs[1, 2].title = "Group B.1"
axs[1, 3].title = "Group B.2"

hidedecorations!.(axs, grid=false)

colgap!(fig.layout, 1, Relative(0.15))

fig
797711e

所有空格都可以通过省略要调整大小的间隙的索引来一次更改。 </无翻译>

rowgap!(fig.layout, 50)

fig
b74926a