我正在尝试使用 Asymptote 绘制 3D 图形。我使用了之前的一篇文章作为指导。
我在 2 个文件中有结构良好的 X、Y 和 Z 值。一个文件包含 x 和 y 变量,另一个文件包含 z 矩阵。所有计算均使用 R 执行。我仅使用 Asymptote 进行绘图。
- 这是 csv 格式的包含 x 和 y 变量(100 行)的 xy 文件: https://www.dropbox.com/s/rotpeelk9530dsl/xy_new.csv?dl=0
- 这是 z矩阵对于 csv 格式的每个 x 和 y 组合(100 x 100): https://www.dropbox.com/s/bwefr4te1dew11c/z_new.csv?dl=0
以下是迄今为止尝试过的 Asymptote 代码:
import three;
import grid3;
import graph3;
import palette;
unitsize(5cm,5cm,5cm);
currentprojection=orthographic(18,17,3);
bool renderPRC = true;
if(renderPRC) { ...
// PRC TRUE
settings.prc=true;
settings.embed=true;
}
else {
// RASTERIZE
settings.outformat="png";
settings.prc=false;
settings.render=3;
}
file fic =input("xy_new.csv").line().csv();
file fic1 =input("z_new.csv").line().csv();
real[][] z=fic1.dimension(0,100);
real[][] a=fic.dimension(0,2);
real [][] b=transpose(a);
real [] xpt,ypt;
xpt = b[1];
ypt = b[0];
real[][] zpt=-z;
surface s=surface(zpt,xpt,ypt,Spline);
s.colors(palette(s.map(zpart),Rainbow()));
draw(s);
我得到的输出不是 3D 文件。
我期待这样的事情:
上面的图是使用以下R
函数以相同的 x、y 和 z 值生成的:
plot3D::persp3D(x = x, y = y, z = -1*z, col="grey87",cex.axis=1, cex.lab=1,
colkey=FALSE, theta=-30,alpha = 1,zlim=c(-500,-240),ylim=c(0.2,5),
border = "grey50", ticktype="detailed",scale=T,
contour=list(levels = -1*c(240,242.09,242.3,242.8,243,244,245,246,247,247.5,247.8),side ="z",col="grey39"),
xlab="$\\sigma$",ylab="$\\xi$", zlab="Log Likelihood",
lty=0,expand = 0.7)
我有两部分问题:
- 为什么我的渐近线图不是三维的?
- 如何在曲面图上绘制轮廓?
答案1
抱歉来晚了,但是很难有空闲时间来为 Asymptote 问题做出贡献。
您的主要问题是unitsize
x、y、z 范围之间的差异。这就是为什么您有这样的图片。然后您有两种可能性:修改unitsize
或使用size3
(IgnoreAspect
避免自动缩放)。我还添加了轮廓问题。
import grid3;
import graph3;
import palette;
import contour;
import x11colors;
//unitsize(2cm,.002cm,.05cm);
size3(300,300,IgnoreAspect);
currentprojection=orthographic(18,17,3);
currentprojection=orthographic(camera=(-15.2232850051446,-32914.6837071317,892.991504793621),
zoom=0.822702474791882);
file fic =input("xy_new.csv").line().csv();
file fic1 =input("z_new.csv").line().csv();
real[][] z=fic1.dimension(0,100);
real[][] a=fic.dimension(0,2);
real [][] b=transpose(a);
real [] xpt,ypt;
xpt = b[1];
ypt = b[0];
real[][] zpt=-z;
surface s=surface(zpt,xpt,ypt,Spline);
s.colors(palette(s.map(zpart),Rainbow()));
draw(s);
for (int i=0; i<10 ; ++i)
{ real t = -250+i;
guide[][] contours = contour(zpt,(0.2,100),(5,5000),new real[]{t},join=operator ..);
guide3[][] liftedcontours = lift(new real (real x, real y) {return t;}, contours);
for(guide3 p:liftedcontours[0]){
draw(p,blue+1bp);
}
}
xaxis3(Label("$x$",.1),Bounds,InTicks);
yaxis3(Label("$y$",0.5),Bounds,InTicks);
zaxis3(Label("$z$",0.5),Bounds,InTicks(beginlabel=false));