Engee 文档

数字

该页面正在翻译中。

对象包含一个顶层 场景 和一个 网格布局,以及已放入其中的块列表,如 轴心,轴心, 颜色栏, 滑块, 传说 等。

创建一个数字

您可以使用 图() 功能,并设置底层场景的属性。 其中最重要的是 大小.

f = Figure()
f = Figure(size = (600, 400))

当您使用简单的非变异绘图命令时,也会隐式创建图形,例如 情节(), 散点(), 线() 等。 由于这些命令还会为绘图和绘图本身创建轴,因此它们会返回一个复合对象 [医]图,其中只是存储这三个部分。 要访问图形,您可以将该对象析构为其三个部分,也可以直接访问图形字段。

figureaxisplot = scatter(rand(100, 2))
figure = figureaxisplot.figure

# destructuring syntax
figure, axis, plot = scatter(rand(100, 2))

# you can also ignore components
figure, = scatter(rand(100, 2))

您可以将参数传递给类似dict的对象中创建的图形 关键字:

scatter(rand(100, 2), figure = (size = (600, 400),))

将块放入图中

所有块都将其父图作为第一个参数,然后您可以通过索引语法将它们放在图布局中。

f = Figure()
ax = f[1, 1] = Axis(f)
sl = f[2, 1] = Slider(f)

GridPositions和GridSubpositions

的索引语法 实现了与布局无缝地工作。 如果你索引到图中,一个 网格位置 将创建存储此索引操作的对象。 此对象可用于将新轴绘制到图中的某个布局位置,例如如下所示: </无翻译>

using CairoMakie
f = Figure()
pos = f[1, 1]
scatter(pos, rand(100, 2))

pos2 = f[1, 2]
lines(pos2, cumsum(randn(100)))

# you don't have to store the position in a variable first, of course
heatmap(f[1, 3], randn(10, 10))

f
555fa32

您还可以进一步索引到 网格位置,这就产生了一个 网格位置. 与 网格位置s您可以在任意嵌套的网格布局中描述位置。 通常,只有通过嵌套才能实现所需的绘图布局,并且重复索引使这变得容易。 </无翻译>

using CairoMakie
f = Figure()

f[1, 1] = Axis(f, title = "I'm not nested")
f[1, 2][1, 1] = Axis(f, title = "I'm nested")

# plotting into nested positions also works
heatmap(f[1, 2][2, 1], randn(20, 20))

f
d99be59

所有还不存在的嵌套GridLayouts,但嵌套绘图调用所需的嵌套GridLayouts都将在后台自动创建。

注意 网格布局使用时隐式创建的s 网格/网格 在返回值中不能直接用于进一步操作。 你可以在事后用 内容 功能,例如,如下面的部分中所解释的。

数字填充

您可以使用关键字更改图形内容周围的空白(边距)量 figure_padding. 这需要一个数字为所有四个边,或四个数字的元组为左,右,底部,顶部。 您还可以使用以下主题设置此设置 set_theme!(figure_padding=30) 例如。 </无翻译>

using CairoMakie
f = Figure(figure_padding = 1, backgroundcolor = :gray80)

Axis(f[1, 1])
scatter!(1:10)

f
57eb9fc

从图形中检索对象

有时用户会感到惊讶的是,索引到图形中不会检索放置在该位置的对象。 这是因为 网格位置 是绘图所必需的,直接返回内容对象将消除这种可能性。 此外,一个 网格布局 可以在同一位置保存多个对象,或者具有部分重叠的内容,因此没有很好地定义给定某个索引应该返回的内容。

要从图中检索对象,您可以使用索引加上 目录内容 函数。 该 目录 函数返回在给定位置找到的所有对象的向量 网格位置. 您可以使用 确切=真 关键字参数,以便位置必须完全匹配,否则也返回该位置中包含的对象。

f = Figure()
box = f[1:3, 1:2] = Box(f)
ax = f[1, 1] = Axis(f)

contents(f[1, 1]) == [ax]
contents(f[1:3, 1:2]) == [box, ax]
contents(f[1:3, 1:2], exact = true) == [box]

如果您使用 目录 在一个 网格位置,的 确切 关键字仅指最底层的网格布局,所有上层都必须完全匹配。

f = Figure()
ax = f[1, 1][2, 3] = Axis(f)

contents(f[1, 1][2, 3]) == [ax]
contents(f[1:2, 1:2][2, 3]) == [] # the upper level has to match exactly

通常,您只希望在某个位置有一个对象,并且您希望直接使用它,而无需从返回的向量中检索它 目录. 在这种情况下,使用 内容 功能代替。 它的工作原理等同于 只有(内容(pos,确切=真)),所以如果它不能从一个确切的给定位置返回一个对象,它就会出错。

f = Figure()
ax = f[1, 1] = Axis(f)

contents(f[1, 1]) == [ax]
content(f[1, 1]) == ax

图形大小和分辨率

在Makie中,a的 大小 是无单位的。 那是因为 s可以呈现为图像或矢量图形或显示在交互式窗口中。 这些输出的实际物理尺寸取决于多种因素,例如屏幕尺寸,这些因素通常不在Makie的控制范围之内,因此我们不希望在任何情况下都承诺正确的输出尺寸 图(尺寸=(4cm,5cm)).

大小 一个 首先也是最重要的告诉你有多少空间可供使用 轴心,轴心 物等内容。 例如, 字体大小轴(宽度=。..,高度=。..) 也是无单位的,但它们可以相对于图尺寸来理解。 如果你的房间没有足够的空间 ,你可以增加它 大小 或减小内容的大小(例如使用较小的字体大小)。 然而,我们并不关心 大小 相对于其内容的大小。 当我们思考我们的大小时,它也有一个意义。 将在所有不同的可能输出设备上呈现时查看。

现在,虽然Makie使用无单位数字来表示图形大小,但它是默认设置的,这样这些数字实际上可以被认为是CSS像素。 我们选择了这个约定来简化在web上下文中使用Makie,其中包括基于浏览器的工具,如Pluto,Jupyter笔记本或VSCode等编辑器。 所有这些都使用CSS来控制对象的外观。

在默认设置下, 大小 (600, 450) 将在web上下文中以600X450CSS像素的大小显示(如果Makie通过 文本/html图像/svg+xml MIME类型)。 无论其 分辨率 如何,即输出位图具有多少像素,都是如此。 图像将用注释 宽度="600px"高度="450px" 这样浏览器就会知道预期的显示大小。

CSS像素是一个物理单位(1px==1/96英寸),但当然浏览器在许多不同的屏幕上显示内容,并且在许多不同的缩放级别上显示内容,因此您通常不会期望96px宽 但是,即使我们不知道我们的情节在屏幕上的物理大小,我们也希望它们能够与其他内容和文本很好地匹配,因此我们希望与当今系统上常规使用的大小相匹配。 例如,一个常见的字体大小是 12铂,相当于 16便士 (1px==3/4pt)。

这也适用于pdf输出。 在为出版物准备绘图时,我们通常希望将其绘图的字体大小与基础文档匹配,例如12pt。 但今天我们通常不会以预期的物理尺寸在纸上打印pdf。 通常,它们在放大和缩小的移动设备上读取,因此任何给定的文本很少在物理上处于12pt。

虽然矢量图形总是在给定的缩放级别上清晰呈现,但对于位图,实际像素数决定了它们在缩放级别或观看距离上看起来清晰或模糊。 这种"锐度"因素通常在 新闻部 或每英寸点数。 同样,由于我们在数字屏幕上放大和缩小的方式,这里的"英寸"不应该总是与实际的物理英寸相匹配(就像印刷时代一样)。 但是如果我们常规地使用CSS像素来描述尺寸,我们也可以使用 新闻部 我们将知道典型设备和典型缩放级别的清晰度。

总而言之,我们有两个因素会影响Makie的渲染输出 . 它的 大小,它决定了可用于内容的空间和显示大小,当以CSS像素等单位解释时,以及 分辨率 或像素密度或清晰度。 新闻部. 对于矢量图形,我们只关心大小因子(除非我们在其中嵌入光栅化位图)。

px_per_unit 因素

如果我们显示一个 图(大小=(600,450)) 在web上下文中,根据Makie的约定,图像将被注释为 宽度="600px"高度="450px". 但是实际的位图有多少像素,即图像有多锐利?

这是由 px_per_unit 将图形呈现为位图或通过 储蓄. 这是 2 默认情况下,渲染出位图时,因为许多现代屏幕将2x2屏幕像素映射到1X1CSS像素(例如Apple的"retina displays")。 如果您希望能够放大更多并且仍然具有良好的分辨率,则需要增加 px_per_unit 值,因此图像具有更多像素。

这里有两张图片展示了如何 大小px_per_unit 影响绘图的视觉外观。 你可以记住两个简单的启发式:

增加 大小 为您的内容提供更多空间和更大的位图。 当在输出上下文(例如pdf文档)中缩放到相同的大小时,具有较大的图形 大小 将出现较小的内容。

figure size

增加 px_per_unit 保留内容的空间相同,但由于分辨率较高,会产生较大的位图。 当在输出上下文(例如pdf文档)中缩放到相同的大小时,具有较大的图形 px_per_unit 将出现相同的内容,但更清晰。

px per unit

还有一个 pt_per_unit 可以向上或向下缩放矢量图形输出的因子。 但是如果你保持Makie的无单位数字实际上是CSS像素的约定,你可以保留默认值 pt_per_unit 在0.75并自动获得大小匹配的位图和矢量图形.