Package scalaSci.math.plot.plots

Source Code of scalaSci.math.plot.plots.QuantileLayerPlot

package scalaSci.math.plot.plots;

import java.awt.Color;

import javax.swing.JFrame;

import scalaSci.math.plot.FrameView;
import scalaSci.math.plot.Plot2DPanel;
import scalaSci.math.plot.render.AbstractDrawer;
import scalaSci.math.plot.utils.PArray;

public class QuantileLayerPlot extends LayerPlot {
  public static int WIDTH = 2;
  int axe;
  double quantileRate;
  Color gradC;
  double main_data_constant = 0;
  public boolean symetric = false;
  double[] Q;

  public QuantileLayerPlot(Plot p, int a, double q, double r, boolean _symetric) {
    this(p, a, null, r, true);
    main_data_constant = q;
  }

  /** Build a quantile plot based on a given plot. The quantile is drawn as a linear gradient from the base plot dots.
   * @param p base plot
   * @param a axis number of quantile : 0=X quantile, 1=Y quantile, 2=Z quantile
   * @param q array of quantiles values
   * @param r rate of the quantile. The gradient line length is q/r
   * @param _symetric if yes, quantiles are drawn on both negative and positive sides of base plot dots
   */
  public QuantileLayerPlot(Plot p, int a, double[] q, double r, boolean _symetric) {
    super(r + " quantile of " + p.name, p);
    if (q != null)
      PArray.checkLength(q, p.getData().length);
    Q = q;
    axe = a;
    quantileRate = r;
    symetric = _symetric;

  }

  public double getQuantilesValue(int numCoord) {
    return Q[numCoord];
  }

  public int getAxe() {
    return axe;
  }

  public double getQuantileRate() {
    return quantileRate;
  }

  public void plot(AbstractDrawer draw, Color c) {
    if (!plot.visible)
      return;

    draw.setColor(c);
    gradC = new Color(c.getRed(), c.getGreen(), c.getBlue(), (int) (255 * (1 - quantileRate)));

    draw.setLineType(AbstractDrawer.CONTINOUS_LINE);
    draw.setLineWidth(WIDTH);
    if (main_data_constant == 0)
      for (int i = 0; i < plot.getData().length; i++) {
        double[] d = PArray.getRowCopy(plot.getData(), i);
        d[axe] += Q[i];///quantileRate;
        draw.setGradient(plot.getData()[i], c, d, gradC);
        draw.drawLine(plot.getData()[i], d);
        // draw.drawDot(d, RADIUS/*(int)(RADIUS*quantileRate)*/);

        if (symetric) {
          d[axe] -= 2 * Q[i];///quantileRate;
          draw.setGradient(plot.getData()[i], c, d, gradC);
          draw.drawLine(plot.getData()[i], d);
          // draw.drawDot(d, RADIUS/*(int)(RADIUS*quantileRate)*/);
        }
      }
    else
      for (int i = 0; i < plot.getData().length; i++) {
        double[] d = PArray.getRowCopy(plot.getData(), i);
        d[axe] += main_data_constant;///quantileRate;
        draw.setGradient(plot.getData()[i], c, d, gradC);
        draw.drawLine(plot.getData()[i], d);
        // draw.drawDot(d, shape/*RADIUS/*(int)(RADIUS*quantileRate)*/);

        if (symetric) {
          d[axe] -= 2 * main_data_constant;///quantileRate;
          draw.setGradient(plot.getData()[i], c, d, gradC);
          draw.drawLine(plot.getData()[i], d);
          // draw.drawDot(d, RADIUS/*(int)(RADIUS*quantileRate)*/);
        }
      }
    draw.resetGradient();
    draw.setLineWidth(AbstractDrawer.DEFAULT_LINE_WIDTH);

  }

  @Override
  public void setData(double[][] d) {
    Q = d[0];
  }

  @Override
  public double[][] getData() {
    return new double[][] { Q };
  }

        /*
         var p2 = new Plot2DPanel
         for (i<-0 until 1) {
           var XYZ = Array.ofDim[Double](10, 2)
          for (j<-0 until XYZ.length) {
            XYZ(j)(0) = 1+Math.random
            XYZ(j)(1) = 100+Math.random
          }
         p2.addScatterPlot("toto"+i, XYZ)
         }
         p2.addQuantiletoPlot(0, 1, 1.0, true, 0.2)
         new FrameView(p2)
       
        
         */
  public static void main(String[] args) {
    Plot2DPanel p2 = new Plot2DPanel();
    for (int i = 0; i < 1; i++) {
      double[][] XYZ = new double[10][2];
      for (int j = 0; j < XYZ.length; j++) {
        XYZ[j][0] = /*1 + */Math.random();
        XYZ[j][1] = /*100 * */Math.random();
      }
      p2.addScatterPlot("toto" + i, XYZ);
    }
    p2.addQuantiletoPlot(0, 1, 1.0, true, 0.2);
    new FrameView(p2).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
TOP

Related Classes of scalaSci.math.plot.plots.QuantileLayerPlot

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.