private void onPlotClicked(PointF point) { // make sure the point lies within the graph area. we use gridrect // because it accounts for margins and padding as well. if (plot.containsPoint(point.x, point.y)) { Number x = plot.getXVal(point); Number y = plot.getYVal(point); selection = null; double xDistance = 0; double yDistance = 0; // find the closest value to the selection: for (SeriesBundle<XYSeries, ? extends XYSeriesFormatter> sfPair : plot.getRegistry().getSeriesAndFormatterList()) { XYSeries series = sfPair.getSeries(); for (int i = 0; i < series.size(); i++) { Number thisX = series.getX(i); Number thisY = series.getY(i); if (thisX != null && thisY != null) { double thisXDistance = Region.measure(x, thisX).doubleValue(); double thisYDistance = Region.measure(y, thisY).doubleValue(); if (selection == null) { selection = new Pair<>(i, series); xDistance = thisXDistance; yDistance = thisYDistance; } else if (thisXDistance < xDistance) { selection = new Pair<>(i, series); xDistance = thisXDistance; yDistance = thisYDistance; } else if (thisXDistance == xDistance && thisYDistance < yDistance && thisY.doubleValue() >= y.doubleValue()) { selection = new Pair<>(i, series); xDistance = thisXDistance; yDistance = thisYDistance; } } } } } else { // if the press was outside the graph area, deselect: selection = null; } if (selection == null) { selectionWidget.setText(NO_SELECTION_TXT); } else { selectionWidget.setText( "Selected: " + selection.second.getTitle() + " Value: " + selection.second.getY(selection.first)); } plot.redraw(); }
/** * Removes an existing value from the series. * * @param index the index in the series of the value to remove */ public synchronized void remove(int index) { super.remove(index); double removedValue = mValue.remove(index); if (removedValue == mMinValue || removedValue == mMaxValue) { initRange(); } }
private void updatePlot(SeriesSize seriesSize) { // Remove all current series from each plot plot.clear(); // Setup our Series with the selected number of elements series1 = new SimpleXYSeries( Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Us"); series2 = new SimpleXYSeries( Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Them"); plot.setDomainBoundaries(-1, series1.size(), BoundaryMode.FIXED); plot.setRangeUpperBoundary( SeriesUtils.minMax(series1, series2).getMaxY().doubleValue() + 1, BoundaryMode.FIXED); if (seriesSize != null) { switch (seriesSize) { case TEN: plot.setDomainStep(StepMode.INCREMENT_BY_VAL, 2); break; case TWENTY: plot.setDomainStep(StepMode.INCREMENT_BY_VAL, 4); break; case SIXTY: plot.setDomainStep(StepMode.INCREMENT_BY_VAL, 6); break; } } // add a new series' to the xyplot: if (series1CheckBox.isChecked()) plot.addSeries(series1, formatter1); if (series2CheckBox.isChecked()) plot.addSeries(series2, formatter2); // Setup the BarRenderer with our selected options MyBarRenderer renderer = plot.getRenderer(MyBarRenderer.class); renderer.setBarOrientation((BarRenderer.BarOrientation) spRenderStyle.getSelectedItem()); final BarRenderer.BarGroupWidthMode barGroupWidthMode = (BarRenderer.BarGroupWidthMode) spWidthStyle.getSelectedItem(); renderer.setBarGroupWidth( barGroupWidthMode, barGroupWidthMode == BarRenderer.BarGroupWidthMode.FIXED_WIDTH ? sbFixedWidth.getProgress() : sbVariableWidth.getProgress()); if (BarRenderer.BarOrientation.STACKED.equals(spRenderStyle.getSelectedItem())) { plot.getInnerLimits().setMaxY(15); } else { plot.getInnerLimits().setMaxY(0); } plot.redraw(); }
/** Removes all the values from the series. */ public synchronized void clear() { super.clear(); mValue.clear(); initRange(); }
/** * Adds a new value to the series. * * @param x the value for the X axis * @param y the value for the Y axis * @param value the value */ public synchronized void add(double x, double y, double value) { super.add(x, y); mValue.add(value); updateRange(value); }
/** * @param x * @param numOfDays * @param y */ public void add(Date x, long numOfDays, double y) { long days = x.getTime() / DAY + 1; for (int i = 0; i < numOfDays; i++) super.add(days + i, y); }
/** * Adds a new value to the series. * * @param x the date / time value for the X axis * @param y the value for the Y axis */ public void add(Date x, double y) { super.add(x.getTime() / DAY + 1, y); }
public String generateXYAreaChart( HttpSession session, PrintWriter pw, String courseId, int studentId) { String filename = null; /* int groupId=0; if (groupName.equals("All")){ groupId=0; }else{ groupId = studStatisticBean.getGroupIdByName(groupName); }*/ try { // Retrieve list of WebHits for each section and populate a TableXYDataset StudentsConceptChartDataSet cDataSet = new StudentsConceptChartDataSet(studStatisticBean, courseId, studentId); // cDataSet.setStudentStatisticBeanIdRef(studStatisticBean); ArrayList sections = cDataSet.getSections(); Iterator sectionIter = sections.iterator(); DefaultTableXYDataset dataset = new DefaultTableXYDataset(); while (sectionIter.hasNext()) { String section = (String) sectionIter.next(); ArrayList list = cDataSet.getDataByHitConcept(section); XYSeries dataSeries = new XYSeries(section, true, false); Iterator webHitIter = list.iterator(); while (webHitIter.hasNext()) { StudentsConceptHit cHit = (StudentsConceptHit) webHitIter.next(); dataSeries.add(cHit.getOrdNumb(), cHit.getHitDegree()); } dataset.addSeries(dataSeries); } // Throw a custom NoDataException if there is no data if (dataset.getItemCount() == 0) { System.out.println("No data has been found"); throw new NoDataException(); } // Create tooltip and URL generators SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.UK); StandardXYToolTipGenerator ttg = new StandardXYToolTipGenerator( StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, sdf, NumberFormat.getInstance()); TimeSeriesURLGenerator urlg = new TimeSeriesURLGenerator(sdf, "bar_chart.jsp", "series", "hitDate"); // Create the X-Axis DateAxis xAxis = new DateAxis(null); xAxis.setLowerMargin(0.0); xAxis.setUpperMargin(0.0); // Create the X-Axis NumberAxis yAxis = new NumberAxis(null); yAxis.setAutoRangeIncludesZero(true); // Create the renderer StackedXYAreaRenderer renderer = new StackedXYAreaRenderer(XYAreaRenderer.AREA_AND_SHAPES, ttg, urlg); renderer.setSeriesPaint(0, new Color(255, 255, 180)); renderer.setSeriesPaint(1, new Color(206, 230, 255)); renderer.setSeriesPaint(2, new Color(255, 230, 230)); renderer.setSeriesPaint(3, new Color(206, 255, 206)); renderer.setShapePaint(Color.gray); renderer.setShapeStroke(new BasicStroke(0.5f)); renderer.setShape(new Ellipse2D.Double(-3, -3, 6, 6)); renderer.setOutline(true); // Create the plot XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer); plot.setForegroundAlpha(0.65f); // Reconfigure Y-Axis so the auto-range knows that the data is stacked yAxis.configure(); // Create the chart JFreeChart chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT, plot, true); chart.setBackgroundPaint(java.awt.Color.white); // Write the chart image to the temporary directory ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, 600, 400, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info); pw.flush(); } catch (NoDataException e) { System.out.println(e.toString()); filename = "public_nodata_500x300.png"; } catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "public_error_500x300.png"; } return filename; }
public String generateXYChart( String section, HttpSession session, PrintWriter pw, String courseId, int studentId) { /*int groupId=0; if (groupName.equals("All")){ groupId=0; }else{ groupId = studStatisticBean.getGroupIdByName(groupName); }*/ String filename = null; try { // Retrieve list of WebHits StudentsConceptChartDataSet cDataSet = new StudentsConceptChartDataSet(studStatisticBean, courseId, studentId); ArrayList list = cDataSet.getDataByHitConcept(section); // Throw a custom NoDataException if there is no data if (list.size() == 0) { System.out.println("No data has been found"); throw new NoDataException(); } // Create and populate an XYSeries Collection XYSeries dataSeries = new XYSeries("Students progress line"); Iterator iter = list.listIterator(); while (iter.hasNext()) { StudentsConceptHit ch = (StudentsConceptHit) iter.next(); dataSeries.add(ch.getOrdNumb(), ch.getHitDegree()); } XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries); NumberFormat nf = NumberFormat.getIntegerInstance(); NumberFormat nf2 = NumberFormat.getInstance(); String cTitle = null; // StandardXYToolTipGenerator ttg = new // StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,nf,nf2); CustomXYToolTipGenerator ttg = new CustomXYToolTipGenerator(); ttg.addToolTipSeries(cDataSet.getConceptNames()); StandardXYURLGenerator sxyUrlGen = new StandardXYURLGenerator("#", xyDataset.getSeriesName(0), "PassedConceptOrdNum"); ValueAxis ordNumAxis = new NumberAxis("Concept ordinal number"); NumberAxis valueAxis = new NumberAxis("Current knowledge"); // valueAxis.setAutoRangeIncludesZero(true); valueAxis.setRange(0.0, 6.0); // override default ordNumAxis.setAutoRange(true); ordNumAxis.setLowerMargin(0.0); StandardXYItemRenderer renderer = new StandardXYItemRenderer( StandardXYItemRenderer.LINES + StandardXYItemRenderer.SHAPES, ttg, sxyUrlGen); Marker marker = new ValueMarker(1.50); // / Marker marker2 = new ValueMarker(2.50); Marker marker3 = new ValueMarker(3.50); Marker marker4 = new ValueMarker(4.50); Marker marker5 = new ValueMarker(5.00); renderer.setShapesFilled(true); XYPlot plot = new XYPlot(xyDataset, ordNumAxis, valueAxis, renderer); plot.addRangeMarker(marker); plot.addRangeMarker(marker2); plot.addRangeMarker(marker3); plot.addRangeMarker(marker4); plot.addRangeMarker(marker5); XYTextAnnotation xyBad = new XYTextAnnotation("Bad", 1, 1); xyBad.setX(0.2); xyBad.setY(0.75); XYTextAnnotation xyNotBad = new XYTextAnnotation("Not Bad", 1, 1); xyNotBad.setX(0.2); xyNotBad.setY(2); XYTextAnnotation xyGood = new XYTextAnnotation("Good", 1, 1); xyGood.setX(0.2); xyGood.setY(3); XYTextAnnotation xyVeryGood = new XYTextAnnotation("Very Good", 1, 1); xyVeryGood.setX(0.2); xyVeryGood.setY(4); XYTextAnnotation xyExcellent = new XYTextAnnotation("Excellent", 1, 1); xyExcellent.setX(0.2); xyExcellent.setY(4.75); XYTextAnnotation xyExpert = new XYTextAnnotation("Expert", 1, 1); xyExpert.setX(0.2); xyExpert.setY(5.25); plot.addAnnotation(xyBad); plot.addAnnotation(xyNotBad); plot.addAnnotation(xyGood); plot.addAnnotation(xyVeryGood); plot.addAnnotation(xyExcellent); plot.addAnnotation(xyExpert); JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true); chart.setBackgroundPaint(java.awt.Color.white); // Write the chart image to the temporary directory ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, 600, 400, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info); pw.flush(); } catch (NoDataException e) { System.out.println(e.toString()); filename = "public_nodata_500x300.png"; } catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "public_error_500x300.png"; } return filename; }