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),
)
为简单起见,在接下来的例子中使用它绘制 scatterlines
和 heatmap
。
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, 刘贵欣 (中文翻译), 田俊 (中文审校)