![使用外部(分隔)数据文件绘制渐近线轮廓图](https://linux22.com/image/399071/%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%EF%BC%88%E5%88%86%E9%9A%94%EF%BC%89%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E7%BB%98%E5%88%B6%E6%B8%90%E8%BF%91%E7%BA%BF%E8%BD%AE%E5%BB%93%E5%9B%BE.png)
我需要绘制二维数据,我想在等高线图中绘制。根据我尝试使用 pgf/tikz 获得漂亮等高线图的个人经验以及我在填充轮廓图,我想尝试一下 Asymptote。作为第一步,我尝试将上面链接中给出的示例从使用函数 f(x,y) 转换为使用数据集(即在 matlab 中生成的 100x100 分隔 dat 文件)。据我所知这里,我不需要指定 x 和 y 坐标,只需要指定最小值和最大值对,高度“函数”的规范应该遵循 image.asy 示例(在本例中为 v):
size(12cm,12cm);
import graph;
import palette;
int n=256;
real ninv=2pi/n;
real[][] v=new real[n][n];
for(int i=0; i < n; ++i)
for(int j=0; j < n; ++j)
v[i][j]=sin(i*ninv)*cos(j*ninv);
pen[] Palette=BWRainbow();
picture bar;
bounds range=image(v,(0,0),(1,1),Palette);
palette(bar,"$A$",range,(0,0),(0.5cm,8cm),Right,Palette,
PaletteTicks("$%+#.1f$"));
add(bar.fit(),point(E),30E);
我正在尝试做同样的事情,但它不接受我的“函数”作为绘制轮廓的有效函数:
没有匹配函数'contour(real[][], pair, pair, real[], int, guide(... guide[]))
我更熟悉 PGF,但 Asymptote 轮廓的质量吸引了我。有人能指出我的错误/为我提供合适的 PGF/Tikz 替代方案吗?
代码如下:
\documentclass{article}
\usepackage[pdftex]{graphicx}
\usepackage[inline]{asymptote}
\begin{document}
\begin{figure}[!h]
\begin{asy}
import graph;
import contour;
import palette;
defaultpen(fontsize(10pt));
size(14cm,8cm,IgnoreAspect);
// Load my height function:
file Z=input("dataZ.dat").line();
real[][] z= Z;
z = transpose(z);
pair xyMin=(1,74);
pair xyMax=(3,86);
// original function
real f(real x, real y) {return -2.051^3*1000/(2*3.1415*(2.99*10^2)^2)/(x^2*Cos(y)^2);}
int N=200;
int Levels=16;
defaultpen(1bp);
bounds range=bounds(-3,-0.10);
real[] Cvals=uniform(range.min,range.max,Levels);
// Original
// guide[][] g=contour(f,xyMin,xyMax,Cvals,100,operator --);
// Modified
guide[][] g=contour(z,xyMin,xyMax,Cvals,100,operator --);
pen[] Palette=Gradient(Levels,rgb(0.3,0.06,0.5),rgb(0.9,0.9,0.85));
for(int i=0;i<g.length-1;++i){
filldraw(g[i][0]--xyMin--(xyMax.x,xyMin.y)--xyMax--cycle,Palette[i],darkblue+0.2bp);
}
xaxis("$x$",BottomTop,1,3,darkblue+0.5bp,RightTicks(Step=0.2,step=0.05),above=true);
yaxis("$y$",LeftRight,74,86,darkblue+0.5bp,LeftTicks(Step=2,step=0.5),above=true);
palette("$f(x,y)$",range,point(SE)+(0.2,0),point(NE)+(0.3,0),Right,Palette,
PaletteTicks("$%+#0.1f$",N=Levels,olive+0.1bp));
\end{asy}
\caption{A contour plot.}
\end{figure}
\end{document}