如何在CairoMakie绘图中将图例置于坐标轴内部?
在CairoMakie中将图例嵌入坐标轴内部的解决方法
问题根源
你的代码核心问题是图例生成时机错误:axislegend需要读取坐标轴内所有带label属性的绘图元素,若在绘图操作(lines!)之前调用,此时没有任何可关联的图例项,会导致生成独立坐标轴的无效图例。
修正方案
方案1:调整axislegend调用顺序(推荐)
将图例生成代码移至所有绘图操作之后,确保所有带标签的折线已添加到坐标轴:
#data: u = ncvarget(fn, "U") v = ncvarget(fn,"V") #figure fig = Figure() ax1 = Axis(fig[1,1]) ax1.yreversed = true #plotting details uavg = zeros(zl,) Count = zeros(zl,) p = 100 Y_u = filter(!isnan, u[f,p,:]) M_u = [ones(size(Y_u)) collect(1:1:length(Y_u))] z = collect(1:1:length(Y_u)) Mt_u = M_u' MtM_u = Mt_u*M_u Mi_u = inv(MtM_u) V_u = Mi_u*Mt_u*Y_u y_u = M_u*V_u wave_u = Y_u - y_u # 先完成所有绘图 lines!(ax1, y_u, z, color = :red, label = "Linear Regression") lines!(ax1, Y_u, z, color = :pink, label = "data") lines!(ax1, wave_u, z, color = :palevioletred1, label = "nonwave?") # 最后调用axislegend,指定内部位置 axislegend(ax1, position = :rb) # :rb 代表右下,支持:lt(左上)、:rt(右上)、:lb(左下)等缩写
方案2:手动创建Legend并嵌入坐标轴
若需更精确的位置控制,可直接创建Legend对象并添加到坐标轴的overlay层,避免影响布局:
# 绘图完成后执行 leg = Legend( fig, ax1, position = (:right, :bottom), # 相对于坐标轴的位置 tellheight = false, tellwidth = false, # 这两个参数避免图例占用额外布局空间 framevisible = true # 可选:显示图例边框 ) ax1.overlay[1] = leg # 将图例嵌入坐标轴内部层
常见错误排查
- 避免在绘图前调用图例生成函数:此时没有可关联的
label元素,会生成空的独立坐标轴图例 - 确保所有需要显示的绘图元素都设置了
label参数:无label的元素不会出现在图例中 - 使用
axislegend时无需指定fig的布局位置(如fig[1,1]),它会自动绑定到目标坐标轴内部
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

