You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:09:54