子图坐标轴标注异常:为何左侧子图未按预期显示坐标轴标签?
问题: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会被忽略,只保留整体的轴标签配置(如果有的话)。
解决方案
有两种方法可以解决这个问题:
合并子图时指定每个子图的标签
在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")用
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
相关产品推荐
相关产品推荐

