5.2 属性

使用 attributes 可以创建自定义的图。 设置属性可以使用多个关键字参数。 每个 plot 对象的 attributes 列表可以通过以下方式查看:

  1. fig, ax, pltobj = scatterlines(1:10)
  2. pltobj.attributes
  1. Attributes with 15 entries:
  2. color => RGBA{Float32}(0.0,0.447059,0.698039,1.0)
  3. colormap => viridis
  4. colorrange => Automatic()
  5. cycle => [:color]
  6. inspectable => true
  7. linestyle => nothing
  8. linewidth => 1.5
  9. marker => Circle
  10. markercolor => Automatic()
  11. markercolormap => viridis
  12. markercolorrange => Automatic()
  13. markersize => 9
  14. model => Float32[1.0 0.0 0.0 0.0; 0.0 1.0 0.0 0.0; 0.0 0.0 1.0 0.0; 0.0 0.0 0.0 1.0]
  15. strokecolor => black
  16. strokewidth => 0

或者调用 pltobject.attributes.attributes 返回对象属性的Dict

对于任一给定的绘图函数,都能在 REPL 中以 ?lineshelp(lines) 的形式获取帮助。Julia将输出该函数的相应属性,并简要说明如何使用该函数。 关于 lines 的例子如下:

  1. help(lines)
  1. lines(positions)
  2. lines(x, y)
  3. lines(x, y, z)
  4. Creates a connected line plot for each element in (x, y, z), (x, y) or
  5. positions.
  6. Tip
  7. You can separate segments by inserting NaNs.
  8. lines has the following function signatures:
  9. (Vector, Vector)
  10. (Vector, Vector, Vector)
  11. (Matrix)
  12. Available attributes for Lines are:
  13. color
  14. colormap
  15. colorrange
  16. cycle
  17. depth_shift
  18. diffuse
  19. inspectable
  20. linestyle
  21. linewidth
  22. nan_color
  23. overdraw
  24. shininess
  25. specular
  26. ssao
  27. transparency
  28. visible

不仅 plot 对象有属性,AxisFigure 对象也有属性。 例如,Figure 的属性有 backgroundcolorresolutionfontfontsize 以及 figure_padding。 其中 figure_padding 改变了图像周围的空白区域,如图 (图 5) 中的灰色区域所示。 它使用一个数字指定所有边的范围,或使用四个数的元组表示上下左右。

Axis 同样有一系列属性,典型的有 backgroundcolorxgridcolortitle。 使用 help(Axis) 可查看所有属性。

在接下来这张图里,我们将设置一些属性:

  1. lines(1:10, (1:10).^2; color=:black, linewidth=2, linestyle=:dash,
  2. figure=(; figure_padding=5, resolution=(600, 400), font="sans",
  3. backgroundcolor=:grey90, fontsize=16),
  4. axis=(; xlabel="x", ylabel="x²", title="title",
  5. xgridstyle=:dash, ygridstyle=:dash))
  6. current_figure()

Figure 5: Custom plot.

Figure 5: Custom plot.

此例已经包含了大多数用户经常会用到的属性。 或许在图上加一个 legend 会更好,这在有多条曲线时尤为有意义。 所以,向图上 append 另一个 plot object 并且通过调用 axislegend 添加对应的图例。 它将收集所有 plot 函数中的 labels, 并且图例默认位于图的右上角。 本例调用了 position=:ct 参数,其中 :ct 表示图例将位于 centertop, 如图 图 6 所示:

  1. lines(1:10, (1:10).^2; label="x²", linewidth=2, linestyle=nothing,
  2. figure=(; figure_padding=5, resolution=(600, 400), font="sans",
  3. backgroundcolor=:grey90, fontsize=16),
  4. axis=(; xlabel="x", title="title", xgridstyle=:dash,
  5. ygridstyle=:dash))
  6. scatterlines!(1:10, (10:-1:1).^2; label="Reverse(x)²")
  7. axislegend("legend"; position=:ct)
  8. current_figure()

Figure 6: Custom plot legend.

Figure 6: Custom plot legend.

通过组合 left(l), center(c), right(r)bottom(b), center(c), top(t) 还可以再指定其他位置。 例如,使用:lt 指定为左上角。

然而,仅仅为两条曲线编写这么多代码是比较复杂的。 所以,如果要以相同的样式绘制一组曲线,那么最好指定一个主题。 使用 set_theme!() 可实现该操作,如下所示。

使用 set_theme!(kwargs)定义的新配置,重新绘制之前的图:

  1. set_theme!(; resolution=(600, 400),
  2. backgroundcolor=(:orange, 0.5), fontsize=16, font="sans",
  3. Axis=(backgroundcolor=:grey90, xgridstyle=:dash, ygridstyle=:dash),
  4. Legend=(bgcolor=(:red, 0.2), framecolor=:dodgerblue))
  5. lines(1:10, (1:10).^2; label="x²", linewidth=2, linestyle=nothing,
  6. axis=(; xlabel="x", title="title"))
  7. scatterlines!(1:10, (10:-1:1).^2; label="Reverse(x)²")
  8. axislegend("legend"; position=:ct)
  9. current_figure()
  10. set_theme!()
  11. caption = "Set theme example."

Figure 7: Set theme example.

Figure 7: Set theme example.

倒数第二行的 set_theme!() 会将主题重置到 Makie 的默认设置。 有关 themes 的更多内容请转到 Section 5.3

在进入下节前, 值得先看一个例子:将多个参数所组成的 array 传递给绘图函数来配置属性。 例如,使用 scatter 绘图函数绘制气泡图。

本例随机生成 100 行 3 列的 array ,这些数据满足正态分布。 其中第一列表示 x 轴上的位置,第二列表示 y 轴上的位置,第三列表示与每一点关联的属性值。 例如可以用来指定不同的 color 或者不同的标记大小。气泡图就可以实现相同的操作。

  1. using Random: seed!
  2. seed!(28)
  3. xyvals = randn(100, 3)
  4. xyvals[1:5, :]
  1. 5×3 Matrix{Float64}:
  2. 0.550992 1.27614 -0.659886
  3. -1.06587 -0.0287242 0.175126
  4. -0.721591 -1.84423 0.121052
  5. 0.801169 0.862781 -0.221599
  6. -0.340826 0.0589894 -1.76359

对应的图 图 8 如下所示:

  1. fig, ax, pltobj = scatter(xyvals[:, 1], xyvals[:, 2]; color=xyvals[:, 3],
  2. label="Bubbles", colormap=:plasma, markersize=15 * abs.(xyvals[:, 3]),
  3. figure=(; resolution=(600, 400)), axis=(; aspect=DataAspect()))
  4. limits!(-3, 3, -3, 3)
  5. Legend(fig[1, 2], ax, valign=:top)
  6. Colorbar(fig[1, 2], pltobj, height=Relative(3 / 4))
  7. fig
  8. caption = "Bubble plot."

Figure 8: Bubble plot.

Figure 8: Bubble plot.

为了在图上添加 LegendColorbar,需将 FigureAxisPlot 元组分解为 fig, ax, pltobj。 我们将在 Section 5.6 讨论有关布局选项的更多细节。

通过一些基本且有趣的例子,我们展示了如何使用Makie.jl,现在你可能想知道:还能做什么? Makie.jl 都还有哪些绘图函数? 为了回答此问题,我们制作了一个 cheat sheet 如 图 9 所示。 使用 CairoMakie.jl 后端可以轻松绘制这些图。

Figure 9: Plotting functions: Cheat Sheet. Output given by Cairomakie.

Figure 9: Plotting functions: Cheat Sheet. Output given by Cairomakie.

10 展示了 GLMakie.jl 的_cheat sheet_ ,这些函数支持绘制大多数 3D 图。 这些将在后面的 GLMakie.jl 节进一步讨论。

Figure 10: Plotting functions: Cheat Sheet. Output given by GLMakie.

Figure 10: Plotting functions: Cheat Sheet. Output given by GLMakie.

现在,我们已经大致了解到能做什么。接下来应该掉过头来继续研究基础知识。 是时候学习如何改变图的整体外观了。

CC BY-NC-SA 4.0 Jose Storopoli, Rik Huijzer, Lazaro Alonso, 刘贵欣 (中文翻译), 田俊 (中文审校)