堆叠颜色刻度渐近线

堆叠颜色刻度渐近线

我对渐近线还很陌生,我正在用它来制作热图。我有 2D 数据点,假设它们的值范围是AC,还有另一个中间值b之间。

我希望我的价值观Ab介于蓝色和黄色之间,我的价值观来自bC介于黄色和红色之间。

有人知道如何使用这些特定设置将两个调色板堆叠成一个吗?

感谢您的帮助

答案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;
}

你反其道而行之,因此没有起作用,但现在看来没问题了,再次感谢!

相关内容