5.3 主题

有多种方式可以改变图的整体外观。你可以使用 预定义主题 或自定义的主题。例如,通过 with_theme(your_plot_function, theme_dark()) 使用预定义的暗色主题。另外,也可以使用 Theme(kwargs) 构建你自己的主题或使用 update_theme!(kwargs) 更新当前激活的主题。

还可以使用 set_theme!(theme; kwargs...) 将当前主题改为 theme, 并且通过 kwargs 覆盖或增加一些属性。使用不带参数的 set_theme!() 即可恢复到之前主题的设置。在下面的例子中,我们准备了具有不同样式的测试绘图函数,以便于观察每个主题的大多数属性。

  1. using Random: seed!
  2. seed!(123)
  3. y = cumsum(randn(6, 6), dims=2)
  1. 6×6 Matrix{Float64}:
  2. 0.808288 0.386519 0.355371 0.0365011 -0.0911358 1.8115
  3. -1.12207 -2.47766 -2.16183 -2.49928 -2.02981 -1.37017
  4. -1.10464 -1.03518 -3.19756 -1.18944 -2.71633 -3.80455
  5. -0.416993 -0.534315 -1.42439 -0.659362 -0.0592298 0.644529
  6. 0.287588 1.50687 2.36111 2.54137 0.48751 0.630836
  7. 0.229819 0.522733 0.864515 2.89343 2.06537 2.21375

本例随机生成了一个大小为 (20,20) 的矩阵,以便于绘制一张热力图(heatmap)。 同时本例也指定了 \(x\) 和 \(y\) 的范围。

  1. using Random: seed!
  2. seed!(13)
  3. xv = yv = LinRange(-3, 0.5, 20)
  4. matrix = randn(20, 20)
  5. matrix[1:6, 1:6] # first 6 rows and columns
  1. 6×6 Matrix{Float64}:
  2. -0.271257 0.894952 0.728865 -0.293849 -0.449277 -0.0948871
  3. -0.193033 -0.421286 -0.455905 -0.0576092 -0.756621 -1.47419
  4. -0.123177 0.762254 0.773921 -0.38526 -0.0659695 -0.599284
  5. -1.47327 0.770122 1.20725 0.257913 0.111979 0.875439
  6. -1.82913 -0.603888 0.164083 -0.118504 1.46723 0.0948876
  7. 1.09769 0.178207 0.110243 -0.543203 0.592245 0.328993

因此,新绘图函数如下所示:

  1. function demo_themes(y, xv, yv, matrix)
  2. fig, _ = series(y; labels=["$i" for i = 1:6], markersize=10,
  3. color=:Set1, figure=(; resolution=(600, 300)),
  4. axis=(; xlabel="time (s)", ylabel="Amplitude",
  5. title="Measurements"))
  6. hmap = heatmap!(xv, yv, matrix; colormap=:plasma)
  7. limits!(-3.1, 8.5, -6, 5.1)
  8. axislegend("legend"; merge=true)
  9. Colorbar(fig[1, 2], hmap)
  10. fig
  11. end

注意,series 函数的作用是同时绘制多条附带标签的直线图和散点图。另外还绘制了附带 colorbar 的 heatmap。如图所示,有两种暗色主题,一种是 theme_dark() ,另一种是 theme_black()

  1. with_theme(theme_dark()) do
  2. demo_themes(y, xv, yv, matrix)
  3. end
  4. with_theme(theme_black()) do
  5. demo_themes(y, xv, yv, matrix)
  6. end

Figure 11: Theme dark.

Figure 11: Theme dark.

Figure 12: Theme black.

Figure 12: Theme black.

另外有三种白色主题,theme_ggplot2()theme_minimal()theme_light()。这些主题对于更标准的出版图很有用。

  1. with_theme(theme_ggplot2()) do
  2. demo_themes(y, xv, yv, matrix)
  3. end
  4. with_theme(theme_minimal()) do
  5. demo_themes(y, xv, yv, matrix)
  6. end
  7. with_theme(theme_light()) do
  8. demo_themes(y, xv, yv, matrix)
  9. end

Figure 13: Theme ggplot2.

Figure 13: Theme ggplot2.

Figure 14: Theme minimal.

Figure 14: Theme minimal.

Figure 15: Theme light.

Figure 15: Theme light.

另一种方案是通过使用 with_theme(your_plot, your_theme()) 创建自定义 Theme 。 例如,以下主题可以作为出版质量图的初级模板:

  1. publication_theme() = Theme(
  2. fontsize=16, font="CMU Serif",
  3. Axis=(xlabelsize=20, xgridstyle=:dash, ygridstyle=:dash,
  4. xtickalign=1, ytickalign=1, yticksize=10, xticksize=10,
  5. xlabelpadding=-5, xlabel="x", ylabel="y"),
  6. Legend=(framecolor=(:black, 0.5), bgcolor=(:white, 0.5)),
  7. Colorbar=(ticksize=16, tickalign=1, spinewidth=0.5),
  8. )

为简单起见,在接下来的例子中使用它绘制 scatterlinesheatmap

  1. function plot_with_legend_and_colorbar()
  2. fig, ax, _ = scatterlines(1:10; label="line")
  3. hm = heatmap!(ax, LinRange(6, 9, 15), LinRange(2, 5, 15), randn(15, 15);
  4. colormap=:Spectral_11)
  5. axislegend("legend"; position=:lt)
  6. Colorbar(fig[1, 2], hm, label="values")
  7. ax.title = "my custom theme"
  8. fig
  9. end

然后使用前面定义的 Theme,其输出如 (图 16) 所示。

  1. with_theme(plot_with_legend_and_colorbar, publication_theme())

Figure 16: Themed plot with Legend and Colorbar.

Figure 16: Themed plot with Legend and Colorbar.

如果需要在 set_theme!(your_theme)后更改一些设置,那么可以使用 update_theme!(resolution=(500, 400), fontsize=18)。 另一种方法是给 with_theme 函数传递额外的参数:

  1. fig = (resolution=(600, 400), figure_padding=1, backgroundcolor=:grey90)
  2. ax = (; aspect=DataAspect(), xlabel=L"x", ylabel=L"y")
  3. cbar = (; height=Relative(4 / 5))
  4. with_theme(publication_theme(); fig..., Axis=ax, Colorbar=cbar) do
  5. plot_with_legend_and_colorbar()
  6. end

Figure 17: Theme with extra args.

Figure 17: Theme with extra args.

现在,接下来将讨论如何使用 LaTeX 字符串和自定义主题进行绘图。

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