Choosing an attractive linear scale for a graph's Y Axis

后端 未结 13 1434
予麋鹿
予麋鹿 2020-12-07 08:42

I\'m writing a bit of code to display a bar (or line) graph in our software. Everything\'s going fine. The thing that\'s got me stumped is labeling the Y axis.

The

13条回答
  •  爱一瞬间的悲伤
    2020-12-07 08:49

    Here is a PHP example I am using. This function returns an array of pretty Y axis values that encompass the min and max Y values passed in. Of course, this routine could also be used for X axis values.

    It allows you to "suggest" how many ticks you might want, but the routine will return what looks good. I have added some sample data and shown the results for these.

    #!/usr/bin/php -q
     2)
        $ticks -= 2;
      // Get raw step value
      $tempStep = $range/$ticks;
      // Calculate pretty step value
      $mag = floor(log10($tempStep));
      $magPow = pow(10,$mag);
      $magMsd = (int)($tempStep/$magPow + 0.5);
      $stepSize = $magMsd*$magPow;
    
      // build Y label array.
      // Lower and upper bounds calculations
      $lb = $stepSize * floor($yMin/$stepSize);
      $ub = $stepSize * ceil(($yMax/$stepSize));
      // Build array
      $val = $lb;
      while(1)
      {
        $result[] = $val;
        $val += $stepSize;
        if($val > $ub)
          break;
      }
      return $result;
    }
    
    // Create some sample data for demonstration purposes
    $yMin = 60;
    $yMax = 330;
    $scale =  makeYaxis($yMin, $yMax);
    print_r($scale);
    
    $scale = makeYaxis($yMin, $yMax,5);
    print_r($scale);
    
    $yMin = 60847326;
    $yMax = 73425330;
    $scale =  makeYaxis($yMin, $yMax);
    print_r($scale);
    ?>
    

    Result output from sample data

    # ./test1.php
    Array
    (
        [0] => 60
        [1] => 90
        [2] => 120
        [3] => 150
        [4] => 180
        [5] => 210
        [6] => 240
        [7] => 270
        [8] => 300
        [9] => 330
    )
    
    Array
    (
        [0] => 0
        [1] => 90
        [2] => 180
        [3] => 270
        [4] => 360
    )
    
    Array
    (
        [0] => 60000000
        [1] => 62000000
        [2] => 64000000
        [3] => 66000000
        [4] => 68000000
        [5] => 70000000
        [6] => 72000000
        [7] => 74000000
    )
    

提交回复
热议问题