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

如何调整R语言plot3D绘图中Z轴标题的位置与旋转

我来帮你搞定这个Z轴标签的调整问题~针对你用plot3D包绘制的三维图,有两种方法可以实现你想要的效果:要么让Z轴标签偏移远离刻度,要么设置成水平显示,下面分别给你讲具体操作:

方法1:直接偏移Z轴标签(最简单)

persp3D函数本身提供了zlab.offset参数,专门用来控制Z轴标签相对于轴的偏移距离,数值越大,标签离刻度越远。你只需要在原来的persp3D调用里加上这个参数就行:

library("plot3D") 
library(pbivnorm)
bsb <- function(t1,t2){ 
  a1 <- sqrt(phi1/2)*(sqrt(((phi1+1)*t1)/(phi1*mu1))-sqrt(((phi1*mu1)/((phi1+1)*t1)))) 
  a2 <- sqrt(phi2/2)*(sqrt(((phi2+1)*t2)/(phi2*mu2))-sqrt(((phi2*mu2)/((phi2+1)*t2)))) 
  Phi2 <- pbivnorm(a1, a2, rho, recycle = TRUE) 
  b1 <- ((phi1+1)/(2*phi1*mu1))*sqrt(phi1/2)*(((phi1*mu1)/((phi1+1)*t1))^(1/2)+((phi1*mu1)/((phi1+1)*t1))^(3/2)) 
  b2 <- ((phi2+1)/(2*phi2*mu2))*sqrt(phi2/2)*(((phi2*mu2)/((phi2+1)*t2))^(1/2)+((phi2*mu2)/((phi2+1)*t2))^(3/2)) 
  fdp <- Phi2*b1*b2 
  return(fdp) 
}
t1 <- seq(0.001,100,length=30)
t2 <- seq(0.001,20,length=40)
#Parameters
mu1=7
phi1=2
mu2=1
phi2=9
rho=0
z<-outer(t1,t2,bsb) 

# 修改后的persp3D调用,添加zlab.offset参数
pmat=persp3D(t1, t2, z, main="",xlab="$y_{1}$",ylab="$y_{2}$",zlab="$f(y_{1},y_{2})$",
             cex.axis=1,cex.lab=1, col = "gray10",border = "gray40", theta=50, phi=15, 
             expand=0.9, d=2, shade=0.3, ticktype="detailed", nticks=5, facets=FALSE,
             contour = list(nlevels=10,col="gray35"), zlim= c(-0.1, 0.23), bty = "b2",
             zlab.offset=1.5) # 这里调整偏移量,可根据需求改数值
text(trans3d(0,7.3,0.173,pmat), "(b)",cex=1,col="black")

你可以尝试调整zlab.offset的数值(比如1.2、1.8),直到标签位置符合你的预期。

方法2:手动添加水平的Z轴标签

如果想要让Z轴标签水平显示,默认的zlab参数做不到,我们可以先把默认的Z轴标签设为空,然后用trans3d函数把3D坐标转换成绘图的2D坐标,再用text函数添加水平标签:

library("plot3D") 
library(pbivnorm)
bsb <- function(t1,t2){ 
  a1 <- sqrt(phi1/2)*(sqrt(((phi1+1)*t1)/(phi1*mu1))-sqrt(((phi1*mu1)/((phi1+1)*t1)))) 
  a2 <- sqrt(phi2/2)*(sqrt(((phi2+1)*t2)/(phi2*mu2))-sqrt(((phi2*mu2)/((phi2+1)*t2)))) 
  Phi2 <- pbivnorm(a1, a2, rho, recycle = TRUE) 
  b1 <- ((phi1+1)/(2*phi1*mu1))*sqrt(phi1/2)*(((phi1*mu1)/((phi1+1)*t1))^(1/2)+((phi1*mu1)/((phi1+1)*t1))^(3/2)) 
  b2 <- ((phi2+1)/(2*phi2*mu2))*sqrt(phi2/2)*(((phi2*mu2)/((phi2+1)*t2))^(1/2)+((phi2*mu2)/((phi2+1)*t2))^(3/2)) 
  fdp <- Phi2*b1*b2 
  return(fdp) 
}
t1 <- seq(0.001,100,length=30)
t2 <- seq(0.001,20,length=40)
#Parameters
mu1=7
phi1=2
mu2=1
phi2=9
rho=0
z<-outer(t1,t2,bsb) 

# 先把zlab设为空
pmat=persp3D(t1, t2, z, main="",xlab="$y_{1}$",ylab="$y_{2}$",zlab="",
             cex.axis=1,cex.lab=1, col = "gray10",border = "gray40", theta=50, phi=15, 
             expand=0.9, d=2, shade=0.3, ticktype="detailed", nticks=5, facets=FALSE,
             contour = list(nlevels=10,col="gray35"), zlim= c(-0.1, 0.23), bty = "b2")
text(trans3d(0,7.3,0.173,pmat), "(b)",cex=1,col="black")

# 添加水平的Z轴标签
text(trans3d(x = max(t1)*1.1, y = mean(t2), z = mean(zlim), pmat = pmat), 
     labels = "$f(y_{1},y_{2})$", cex=1, srt=0, col="black")

这里的trans3d参数解释:

  • x = max(t1)*1.1:把标签放在Z轴的外侧(远离绘图区域)
  • y = mean(t2):让标签在Y轴方向居中
  • z = mean(zlim):让标签在Z轴的中间高度
  • srt=0:强制文字水平显示

你可以根据自己的图形视角(theta和phi参数)微调x、y、z的数值,让标签位置更完美。

内容的提问来源于stack exchange,提问作者fsbmat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:15:33