5.3 主题

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

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

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

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

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

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

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

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

with_theme(theme_dark()) do
    demo_themes(y, xv, yv, matrix)
end
with_theme(theme_black()) do
    demo_themes(y, xv, yv, matrix)
end
Figure 11: Theme dark.
Figure 12: Theme black.

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

with_theme(theme_ggplot2()) do
    demo_themes(y, xv, yv, matrix)
end
with_theme(theme_minimal()) do
    demo_themes(y, xv, yv, matrix)
end
with_theme(theme_light()) do
    demo_themes(y, xv, yv, matrix)
end
Figure 13: Theme ggplot2.
Figure 14: Theme minimal.
Figure 15: Theme light.

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

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

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

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

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

with_theme(plot_with_legend_and_colorbar, publication_theme())
Figure 16: Themed plot with Legend and Colorbar.

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

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

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



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