我正在使用渐近线制作热图。我有一个包含两个条目的值数组,这些条目从 0 到 50,但都代表从 0 到 1 的物理量。
我想要一个 x 轴和一个 y 轴,它们的范围从 0 到 50,但标签的范围从 0 到 1,有人知道该怎么做吗?
我到目前为止包含了我的代码:
import graph;
import palette;
import patterns;
file in=input("input.dat").line();
real[][] vals = in;
pen outside = lightgrey;
pen[] Palette = Gradient(100, white, blue);
xaxis("$x$",YZero,
xmin=-1,
RightTicks(Label("$%.2g$"),
new real[]{1,20,40,60}),
above=false);
yaxis("$y$",ymin = -1);
image(vals,Range(minValue,maxValue),(mx,my),(Mx,My),Palette);
谢谢您的帮助 !
斯尔恩
答案1
如果我理解了这个问题,你可以x-axis
通过定义来修改标签ticklabel
。按照文档(和示例)和 graph.asy 文件
typedef string ticklabel(real);
ticklabel Format(string s=defaultformat)
{
return new string(real x) {return format(s,x);};
}
ticklabel DefaultFormat=Format();
ticklabel
从实数返回x
一个字符串。我修改了文档示例。
import graph;
import palette;
size(10cm,10cm,IgnoreAspect);
real f(real x, real y) {
return 0.9*pow10(2*sin(x/5+2*y^0.25)) + 0.1*(1+cos(10*log(y)));
}
scale(Linear,Log,Log);
pen[] Palette=BWRainbow();
bounds range=image(f,Automatic,(0,1),(100,100),nx=200,Palette);
string mod(real x)
{
return format(x/10,locale="en_US.utf8");
}
ticklabel mytick()
{
return new string(real x)
{
return mod(x);
};
}
ticklabel mytick=mytick();
xaxis("$x$",BottomTop,RightTicks(mytick,
new real[]{1,20,40,60,70,95}),
above=true);
yaxis("$y$",LeftRight,RightTicks,above=true);
palette("$f(x,y)$",range,(0,200),(100,250),Top,Palette,
PaletteTicks(ptick=linewidth(0.5*linewidth())));
事实上,如果你不需要 ticklabel 函数中的任何选项,那么命令
xaxis("$x$",BottomTop,RightTicks(ticklabel=mod,
new real[]{1,20,40,60,70,95}),
above=true);
给出了类似的结果。如果不指定,new real[]{1,20,40,60,70,95})
则将 10 到 100 转换为 1 到 10...