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

子图坐标轴标注异常:为何左侧子图未按预期显示坐标轴标签?

问题:Plots子图轴标签未按预期显示

我用下方代码生成图像后,发现左侧子图(surface图)的y轴标签“Space”、x轴标签“Time”没有正常显示,请问问题出在哪?

核心绘图代码

p1 = surface(sol.t, x, z, xlabel="Time", ylabel="Space", zlabel="|u|²", colorbar = false)
p2 = contourf(sol.t,x,z, xlabel="Time", ylabel="Space")
plt = plot(p1,p2,layout=(1,2), size=(1200,800))

完整代码

using DifferentialEquations, LinearAlgebra, Plots, SparseArrays
plotlyjs()

N₁=31 # 波导数量/解向量维度
γ=1  # 非线性项强度参数
h=1 # 网格间距 

centerGrid  = (N₁-1)/2;
x = -centerGrid:centerGrid;

# 二阶中心差分算子(δ²u)ₙ的系数矩阵
M           = spdiagm(-1 => fill(1,N₁-1), 0 => fill(-2,N₁), 1 => fill(1,N₁-1))
M[N₁,1]     = 1; # 周期性边界条件
M[1,N₁]     = 1;

# DNLS方程的右端项,解向量u是N₁×1的复向量
g₁(u,p,t)   = 1*im*(p[1]*M*u + @.(γ*((abs(u))^2).*u) )

# Julia是显式类型系统(比如数组不能同时包含Int和Complex),需将初始数据转为复数类型
u0  = Complex.(sech.(x))

tspan = (0.0,200)
prob = ODEProblem(g₁,u0,tspan, [h])
sol = solve(prob, Tsit5(), reltol=1e-8, abstol=1e-8)

z= [abs(sol.u[i][j])^2  for j=1:N₁, i=1:size(sol)[2]] # |u|²

p1 = surface(sol.t, x, z, xlabel="Time", ylabel="Space", zlabel="|u|²", colorbar = false)
p2 = contourf(sol.t,x,z, xlabel="Time", ylabel="Space")
plt = plot(p1,p2,layout=(1,2), size=(1200,800))

原因分析与解决方案

问题根源

在Plots.jl中,用plot(p1,p2,layout=...)合并子图时,默认会覆盖子图单独设置的轴标签,你给p1、p2单独定义的xlabel/ylabel会被忽略,只保留整体的轴标签配置(如果有的话)。

解决方案

有两种方法可以解决这个问题:

  1. 合并子图时指定每个子图的标签
    在plot函数中通过subplot参数分别给两个子图设置轴标签:

    p1 = surface(sol.t, x, z, zlabel="|u|²", colorbar = false)
    p2 = contourf(sol.t,x,z)
    plt = plot(p1,p2,layout=(1,2), size=(1200,800),
               subplot=1, xlabel="Time", ylabel="Space",
               subplot=2, xlabel="Time", ylabel="Space")
    
  2. 用plot!逐个添加子图并设置标签
    先创建空白布局,再依次添加子图并配置标签:

    plt = plot(layout=(1,2), size=(1200,800))
    # 添加第一个子图并设置标签
    plot!(plt, 1, surface(sol.t, x, z, zlabel="|u|²", colorbar=false), xlabel="Time", ylabel="Space")
    # 添加第二个子图并设置标签
    plot!(plt, 2, contourf(sol.t,x,z), xlabel="Time", ylabel="Space")
    

另外可以检查下z矩阵的维度是否匹配surface的要求:surface(X,Y,Z)要求Z是length(Y) × length(X)的矩阵,你的代码里z是N₁ × length(sol.t)(空间点×时间点),和surface(sol.t, x, z)的参数顺序是匹配的,这部分没问题。

内容的提问来源于stack exchange,提问作者KZ-Spectra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:22:41