Map dataset ordinate value to related axis range

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
rkmandalbit
Posts: 6
Joined: Tue Oct 08, 2013 7:48 am
antibot: No, of course not.

Map dataset ordinate value to related axis range

Post by rkmandalbit » Fri Apr 24, 2015 11:19 am

Hello Everyone,

in case of multiple range axis, i not able to map dataset Ordinate value (Y) to related axis range thats why i am not able to Display multiple crosshair with related range axis. it always Display Ordinate value in respect of 0 to 100 y-Axis range. below code is i am using to Display croshhair for multiple range axis.

Code: Select all

 @Override
            public void chartMouseMoved(ChartMouseEventFX cmefx) {
                if (isCrosshaiActive()) {
                    final Rectangle2D dataArea = chartViewer.getRenderingInfo().getPlotInfo().getDataArea();
                    final JFreeChart chart = cmefx.getChart();
                    if (chart.getPlot() instanceof XYPlot) {
                        final ValueAxis xAxis = ((XYPlot) chart.getPlot()).getDomainAxis();
                        double x = xAxis.java2DToValue(cmefx.getTrigger().getX(), dataArea, ((XYPlot) chart.getPlot()).getDomainAxisEdge());
                        
                        //**********************************
                        //create crosshair for domain axis
                        //**********************************
                        final Crosshair domainCrosshair;
                        final List domainCrosshairs = crosshairOverlay.getDomainCrosshairs();
                        if (domainCrosshairs.isEmpty()) {
                            domainCrosshair = new Crosshair(Double.NaN, Color.BLUE, new BasicStroke(0.5f));
                            domainCrosshair.setVisible(true);
                            domainCrosshair.setLabelVisible(true);
                            crosshairOverlay.addDomainCrosshair(domainCrosshair);
                        } else {
                            domainCrosshair = (Crosshair) domainCrosshairs.get(0);
                        }
                        domainCrosshair.setValue(x);
                        domainCrosshair.setLabelGenerator(new StandardCrosshairLabelGenerator());                        
                        
                        // make the crosshairs disappear if the mouse is out of range
                        if (!xAxis.getRange().contains(x)) {
                            x = Double.NaN;
                        }
                        //index starts from 0, but index 0 is reserved for default range
                        //=> index for tags starts therefore from 1
                        for (int i = 1; i < ((XYPlot) chart.getPlot()).getDatasetCount(); i++) {
                            if (((XYPlot) chart.getPlot()).getDataset(i) != null) {
                                double y = DatasetUtilities.findYValue(((XYPlot) chart.getPlot()).getDataset(i), 0, x);

                                //map dataset ordinate value to related axis range   TODO
                                                                
                               //  ????


                                //**********************************
                                //create crosshair for range axis
                                //**********************************
                                Crosshair rangeCrosshair;
                                while(i > crosshairOverlay.getRangeCrosshairs().size()) {
                                    rangeCrosshair = new Crosshair(Double.NaN, Color.BLUE, new BasicStroke(0.5f));
                                    rangeCrosshair.setLabelVisible(true);
                                    rangeCrosshair.setVisible(true);
                                    if (i % 2 != 0) {
                                        rangeCrosshair.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
                                    }
                                    crosshairOverlay.addRangeCrosshair(rangeCrosshair);
                                }
                                rangeCrosshair = (Crosshair) crosshairOverlay.getRangeCrosshairs().get(i - 1);
                                rangeCrosshair.setValue(y);
                                rangeCrosshair.setLabelGenerator(new StandardCrosshairLabelGenerator());
                                System.out.println("Crosshair: X="+x+" Y="+y);
                            }
                        }
                    }
                }
            }
        });
    }

Locked