如何调整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
相关产品推荐
相关产品推荐

