![堆叠颜色刻度渐近线](https://linux22.com/image/364284/%E5%A0%86%E5%8F%A0%E9%A2%9C%E8%89%B2%E5%88%BB%E5%BA%A6%E6%B8%90%E8%BF%91%E7%BA%BF.png)
我对渐近线还很陌生,我正在用它来制作热图。我有 2D 数据点,假设它们的值范围是A到C,还有另一个中间值b之间。
我希望我的价值观A到b介于蓝色和黄色之间,我的价值观来自b到C介于黄色和红色之间。
有人知道如何使用这些特定设置将两个调色板堆叠成一个吗?
感谢您的帮助
答案1
编辑:第一个命题是错误的,步骤计算有误。感谢@Slvn 的评论和@Werner 提供的信息。
对于非均匀渐变样式调色板,有 3 种颜色,范围为 a、b、c,请找到以下代码(实际上是 的修改版image.asy
),请注意,感谢@Slvn,代码已被修改。
size(12cm,12cm);
import graph;
import palette;
pen[] NonUniformThreeColorsGradient(int NColors=256,real a, real b, real c, pen p1, pen p2, pen p3)
{
pen[] P;
real step1=NColors > 1 ? ((c-a)/((b-a)*(NColors-1))) : 1;
real step2=NColors > 1 ? ((c-a)/((c-b)*(NColors-1))) : 1;
real step=NColors > 1 ? (1/(NColors-1)) : 1;
pen begin=p1;
pen end=p2;
P.append(sequence(new pen(int j) {
return interp(begin,end,j*step1);
},(int) ((b-a)/(c-a)*NColors)));
pen begin=p2;
pen end=p3;
P.append(sequence(new pen(int j) {
return interp(begin,end,j*step2);
},(int) ((c-b)/(c-a)*NColors)));
return P;
}
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]=3*sin(i*ninv)*cos(j*ninv);
pen[] Palette= NonUniformThreeColorsGradient(256,-3,1,3,blue,yellow,red);
//pen[] Palette= Gradient(256,blue,yellow,red);
picture bar;
bounds range=image(v,(0,0),(1,1), range=Range(-3,3), Palette);
// Range(-3,3) forces to use [-3,3] as Range : useful in the case where
// there is no data in [2.5;3] for example
// see palette documentation for Full, Automatic, Range(min,max)
palette(bar,"$A$",range,(0,0),(0.5cm,8cm),Right,Palette,
PaletteTicks("$%+#.1f$"));
add(bar.fit(),point(E),30E);
我希望这是一个正确的答案(现在它是正确的?)。请找出结果
答案2
实际上我认为你的代码中有一个拼写错误@OG
pen[] NonUniformThreeColorsGradient(int NColors=256,real a, real b, real c, pen p1, pen p2, pen p3)
{
pen[] P;
real step1=NColors > 1 ? ((c-a)/((b-a)*(NColors-1))) : 1;
real step2=NColors > 1 ? ((c-a)/((c-b)*(NColors-1))) : 1;
real step=NColors > 1 ? (1/(NColors-1)) : 1;
pen begin=p1;
pen end=p2;
P.append(sequence(new pen(int j) {
return interp(begin,end,j*step1);
},(int) ((b-a)/(c-a)*NColors)));
pen begin=p2;
pen end=p3;
P.append(sequence(new pen(int j) {
return interp(begin,end,j*step2);
},(int) ((c-b)/(c-a)*NColors)));
return P;
}
你反其道而行之,因此没有起作用,但现在看来没问题了,再次感谢!