Java tutorial
/******************************************************************************************************* * * msi.gama.outputs.layers.charts.ChartJFreeChartOutputScatter.java, in plugin msi.gama.core, * is part of the source code of the GAMA modeling and simulation platform (v. 1.8) * * (c) 2007-2018 UMI 209 UMMISCO IRD/SU & Partners * * Visit https://github.com/gama-platform/gama for license information and contacts. * ********************************************************************************************************/ package msi.gama.outputs.layers.charts; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Point; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; import java.util.ArrayList; import java.util.HashMap; import org.apache.commons.lang.StringUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.axis.LogAxis; import org.jfree.chart.axis.LogarithmicAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.entity.CategoryItemEntity; import org.jfree.chart.entity.ChartEntity; import org.jfree.chart.entity.PieSectionEntity; import org.jfree.chart.entity.XYItemEntity; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.AbstractRenderer; import org.jfree.chart.renderer.xy.AbstractXYItemRenderer; import org.jfree.chart.renderer.xy.XYAreaRenderer; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.chart.renderer.xy.XYBoxAndWhiskerRenderer; import org.jfree.chart.renderer.xy.XYErrorRenderer; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLine3DRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.renderer.xy.XYShapeRenderer; import org.jfree.chart.renderer.xy.XYSplineRenderer; import org.jfree.chart.renderer.xy.XYStepRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.general.Dataset; import org.jfree.data.general.PieDataset; import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYIntervalDataItem; import org.jfree.data.xy.XYIntervalSeries; import org.jfree.data.xy.XYIntervalSeriesCollection; import org.jfree.ui.RectangleInsets; import msi.gama.common.interfaces.IDisplaySurface; import msi.gama.common.interfaces.IKeyword; import msi.gama.common.preferences.GamaPreferences; import msi.gama.runtime.IScope; import msi.gaml.expressions.IExpression; public class ChartJFreeChartOutputScatter extends ChartJFreeChartOutput { public class myXYErrorRenderer extends XYErrorRenderer { ChartJFreeChartOutputScatter myoutput; String myid; boolean useSize; AffineTransform transform = new AffineTransform(); public boolean isUseSize() { return useSize; } public void setUseSize(final IScope scope, final boolean useSize) { this.useSize = useSize; } public void setMyid(final String myid) { this.myid = myid; } private static final long serialVersionUID = 1L; public void setOutput(final ChartJFreeChartOutput output) { myoutput = (ChartJFreeChartOutputScatter) output; } @Override public Shape getItemShape(final int row, final int col) { if (isUseSize()) { transform.setToScale(myoutput.getScale(myid, col), myoutput.getScale(myid, col)); return transform.createTransformedShape(super.getItemShape(row, col)); } return super.getItemShape(row, col); } } double getScale(final String serie, final int col) { if (MarkerScale.containsKey(serie)) { return MarkerScale.get(serie).get(col); } return 1; } HashMap<String, ArrayList<Double>> MarkerScale = new HashMap<String, ArrayList<Double>>(); public ChartJFreeChartOutputScatter(final IScope scope, final String name, final IExpression typeexp) { super(scope, name, typeexp); // TODO Auto-generated constructor stub } @Override public void createChart(final IScope scope) { super.createChart(scope); jfreedataset.add(0, new XYIntervalSeriesCollection()); PlotOrientation orientation = PlotOrientation.VERTICAL; if (reverse_axes) orientation = PlotOrientation.HORIZONTAL; switch (type) { case SERIES_CHART: { chart = ChartFactory.createXYLineChart(getName(), "", "", (XYIntervalSeriesCollection) jfreedataset.get(0), orientation, true, false, false); break; } case XY_CHART: chart = ChartFactory.createXYLineChart(getName(), "", "", (XYIntervalSeriesCollection) jfreedataset.get(0), orientation, true, false, false); break; case SCATTER_CHART: chart = ChartFactory.createXYLineChart(getName(), "", "", (XYIntervalSeriesCollection) jfreedataset.get(0), orientation, true, false, false); break; case BOX_WHISKER_CHART: { chart = ChartFactory.createBoxAndWhiskerChart(getName(), "Time", "Value", (BoxAndWhiskerCategoryDataset) jfreedataset.get(0), true); chart.setBackgroundPaint(new Color(249, 231, 236)); break; } } } @Override public void setDefaultPropertiesFromType(final IScope scope, final ChartDataSource source, final int type_val) { // TODO Auto-generated method stub switch (type_val) { case ChartDataSource.DATA_TYPE_LIST_DOUBLE_N: case ChartDataSource.DATA_TYPE_LIST_LIST_DOUBLE_N: case ChartDataSource.DATA_TYPE_LIST_LIST_DOUBLE_12: case ChartDataSource.DATA_TYPE_LIST_POINT: case ChartDataSource.DATA_TYPE_MATRIX_DOUBLE: { source.setCumulative(scope, false); source.setUseSize(scope, false); break; } case ChartDataSource.DATA_TYPE_LIST_DOUBLE_3: { source.setCumulative(scope, true); source.setUseSize(scope, true); break; } case ChartDataSource.DATA_TYPE_LIST_LIST_DOUBLE_3: { source.setCumulative(scope, false); source.setUseSize(scope, true); break; } default: { source.setCumulative(scope, true); source.setUseSize(scope, false); } } } @Override public void initdataset() { super.initdataset(); if (getType() == ChartOutput.SERIES_CHART) { chartdataset.setCommonXSeries(true); chartdataset.setByCategory(false); } if (getType() == ChartOutput.XY_CHART) { chartdataset.setCommonXSeries(false); chartdataset.setByCategory(false); } if (getType() == ChartOutput.SCATTER_CHART) { chartdataset.setCommonXSeries(false); chartdataset.setByCategory(false); } } Dataset createDataset(final IScope scope) { return new XYIntervalSeriesCollection(); } @Override protected AbstractRenderer createRenderer(final IScope scope, final String serieid) { final String style = this.getChartdataset().getDataSeries(scope, serieid).getStyle(scope); AbstractRenderer newr = new myXYErrorRenderer(); switch (style) { case IKeyword.SPLINE: { newr = new XYSplineRenderer(); break; } case IKeyword.STEP: { newr = new XYStepRenderer(); break; } case IKeyword.DOT: { newr = new XYShapeRenderer(); break; } case IKeyword.WHISKER: { newr = new XYBoxAndWhiskerRenderer(); break; } case IKeyword.AREA: { newr = new XYAreaRenderer(); break; } case IKeyword.BAR: { newr = new XYBarRenderer(); break; } case IKeyword.THREE_D: { newr = new XYLine3DRenderer(); break; } case IKeyword.STACK: case IKeyword.RING: case IKeyword.EXPLODED: default: { // newr = new FastXYItemRenderer(); newr = new myXYErrorRenderer(); ((myXYErrorRenderer) newr).setMyid(serieid); ((myXYErrorRenderer) newr).setOutput(this); break; } } return newr; } protected void resetRenderer(final IScope scope, final String serieid) { final AbstractXYItemRenderer newr = (AbstractXYItemRenderer) this.getOrCreateRenderer(scope, serieid); // newr.setSeriesStroke(0, new BasicStroke(0)); newr.setBaseCreateEntities(true); final ChartDataSeries myserie = this.getChartdataset().getDataSeries(scope, serieid); if (newr instanceof XYLineAndShapeRenderer) { ((XYLineAndShapeRenderer) newr).setSeriesLinesVisible(0, myserie.getMysource().showLine); ((XYLineAndShapeRenderer) newr).setSeriesShapesFilled(0, myserie.getMysource().fillMarker); ((XYLineAndShapeRenderer) newr).setSeriesShapesVisible(0, myserie.getMysource().useMarker); } if (newr instanceof XYShapeRenderer) { if (!myserie.getMysource().fillMarker) { ((XYShapeRenderer) newr).setUseFillPaint(false); // ((XYShapeRenderer) newr).setDrawOutlines(true); } } if (myserie.getMycolor() != null) { newr.setSeriesPaint(0, myserie.getMycolor()); } newr.setSeriesStroke(0, new BasicStroke((float) myserie.getLineThickness())); if (newr instanceof myXYErrorRenderer) { ((myXYErrorRenderer) newr).setDrawYError(false); ((myXYErrorRenderer) newr).setDrawXError(false); if (myserie.isUseYErrValues()) ((myXYErrorRenderer) newr).setDrawYError(true); if (myserie.isUseXErrValues()) ((myXYErrorRenderer) newr).setDrawXError(true); if (myserie.getMysource().isUseSize()) ((myXYErrorRenderer) newr).setUseSize(scope, true); } if (myserie.getMysource().getUniqueMarkerName() != null) setSerieMarkerShape(scope, myserie.getName(), myserie.getMysource().getUniqueMarkerName()); } @Override protected void clearDataSet(final IScope scope) { // TODO Auto-generated method stub super.clearDataSet(scope); final XYPlot plot = (XYPlot) this.chart.getPlot(); for (int i = plot.getDatasetCount() - 1; i >= 1; i--) { plot.setDataset(i, null); plot.setRenderer(i, null); } ((XYIntervalSeriesCollection) jfreedataset.get(0)).removeAllSeries(); jfreedataset.clear(); jfreedataset.add(0, new XYIntervalSeriesCollection()); plot.setDataset((XYIntervalSeriesCollection) jfreedataset.get(0)); plot.setRenderer(0, null); IdPosition.clear(); } @Override protected void createNewSerie(final IScope scope, final String serieid) { final ChartDataSeries dataserie = chartdataset.getDataSeries(scope, serieid); final XYIntervalSeries serie = new XYIntervalSeries(dataserie.getSerieLegend(scope), false, true); final XYPlot plot = (XYPlot) this.chart.getPlot(); final XYIntervalSeriesCollection firstdataset = (XYIntervalSeriesCollection) plot.getDataset(); if (!IdPosition.containsKey(serieid)) { if (firstdataset.getSeriesCount() == 0) { firstdataset.addSeries(serie); plot.setDataset(0, firstdataset); } else { final XYIntervalSeriesCollection newdataset = new XYIntervalSeriesCollection(); newdataset.addSeries(serie); jfreedataset.add(newdataset); plot.setDataset(jfreedataset.size() - 1, newdataset); } plot.setRenderer(jfreedataset.size() - 1, (XYItemRenderer) getOrCreateRenderer(scope, serieid)); IdPosition.put(serieid, jfreedataset.size() - 1); // DEBUG.LOG("new serie"+serieid+" at // "+IdPosition.get(serieid)+" fdsize "+plot.getSeriesCount()+" jfds // "+jfreedataset.size()+" datasc "+plot.getDatasetCount()); // TODO Auto-generated method stub } } @SuppressWarnings("unchecked") @Override protected void resetSerie(final IScope scope, final String serieid) { // TODO Auto-generated method stub final ChartDataSeries dataserie = chartdataset.getDataSeries(scope, serieid); final XYIntervalSeries serie = ((XYIntervalSeriesCollection) jfreedataset .get(IdPosition.get(dataserie.getSerieId(scope)))).getSeries(0); serie.clear(); final ArrayList<Double> XValues = dataserie.getXValues(scope); final ArrayList<Double> YValues = dataserie.getYValues(scope); final ArrayList<Double> SValues = dataserie.getSValues(scope); boolean secondaxis = false; if (dataserie.getMysource().getUseSecondYAxis(scope)) { secondaxis = true; this.setUseSecondYAxis(scope, true); } if (XValues.size() > 0) { final NumberAxis domainAxis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getDomainAxis(); NumberAxis rangeAxis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getRangeAxis(0); int ids = IdPosition.get(dataserie.getSerieId(scope)); if (secondaxis) { // rangeAxis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getRangeAxis(1); // ((XYPlot) this.chart.getPlot()).setRangeAxis(IdPosition.get(dataserie.getSerieId(scope)),rangeAxis); // ((XYPlot) this.chart.getPlot()).setRangeAxis(IdPosition.get(dataserie.getSerieId(scope)),rangeAxis); ((XYPlot) this.chart.getPlot()).mapDatasetToRangeAxis(ids, 1); } else { // ((XYPlot) this.chart.getPlot()).setRangeAxis(IdPosition.get(dataserie.getSerieId(scope)),rangeAxis); ((XYPlot) this.chart.getPlot()).mapDatasetToRangeAxis(ids, 0); } domainAxis.setAutoRange(false); rangeAxis.setAutoRange(false); // domainAxis.setRange(Math.min((double)(Collections.min(XValues)),0), // Math.max(Collections.max(XValues),Collections.min(XValues)+1)); // rangeAxis.setRange(Math.min((double)(Collections.min(YValues)),0), // Math.max(Collections.max(YValues),Collections.min(YValues)+1)); XYIntervalDataItem newval; for (int i = 0; i < XValues.size(); i++) { if (dataserie.isUseYErrValues()) { if (dataserie.isUseXErrValues()) { newval = new XYIntervalDataItem(XValues.get(i), dataserie.xerrvaluesmin.get(i), dataserie.xerrvaluesmax.get(i), YValues.get(i), dataserie.yerrvaluesmin.get(i), dataserie.yerrvaluesmax.get(i)); // serie.add(XValues.get(i),dataserie.xerrvaluesmin.get(i),dataserie.xerrvaluesmax.get(i),YValues.get(i),dataserie.yerrvaluesmin.get(i),dataserie.yerrvaluesmax.get(i)); } else { newval = new XYIntervalDataItem(XValues.get(i), XValues.get(i), XValues.get(i), YValues.get(i), dataserie.yerrvaluesmin.get(i), dataserie.yerrvaluesmax.get(i)); // serie.add(XValues.get(i),XValues.get(i),XValues.get(i),YValues.get(i),dataserie.yerrvaluesmin.get(i),dataserie.yerrvaluesmax.get(i)); } } else { if (dataserie.isUseXErrValues()) { newval = new XYIntervalDataItem(XValues.get(i), dataserie.xerrvaluesmin.get(i), dataserie.xerrvaluesmax.get(i), YValues.get(i), YValues.get(i), YValues.get(i)); // serie.add(XValues.get(i),dataserie.xerrvaluesmin.get(i),dataserie.xerrvaluesmax.get(i),YValues.get(i),YValues.get(i),YValues.get(i)); } else { newval = new XYIntervalDataItem(XValues.get(i), XValues.get(i), XValues.get(i), YValues.get(i), YValues.get(i), YValues.get(i)); // serie.add(XValues.get(i),XValues.get(i),XValues.get(i),YValues.get(i),YValues.get(i),YValues.get(i)); } } serie.add(newval, false); } // domainAxis.setAutoRange(true); // rangeAxis.setAutoRange(true); } // resetAutorange(scope); if (SValues.size() > 0) { MarkerScale.remove(serieid); final ArrayList<Double> nscale = (ArrayList<Double>) SValues.clone(); MarkerScale.put(serieid, nscale); } this.resetRenderer(scope, serieid); } public NumberAxis formatYAxis(final IScope scope, NumberAxis axis) { axis.setAxisLinePaint(axesColor); axis.setTickLabelFont(getTickFont()); axis.setLabelFont(getLabelFont()); if (textColor != null) { axis.setLabelPaint(textColor); axis.setTickLabelPaint(textColor); } axis.setAxisLinePaint(axesColor); axis.setLabelFont(getLabelFont()); axis.setTickLabelFont(getTickFont()); if (textColor != null) { axis.setLabelPaint(textColor); axis.setTickLabelPaint(textColor); } if (!this.getYTickValueVisible(scope)) { axis.setTickMarksVisible(false); axis.setTickLabelsVisible(false); } return axis; } @Override public void resetAxes(final IScope scope) { NumberAxis domainAxis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getDomainAxis(); NumberAxis rangeAxis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getRangeAxis(); NumberAxis range2Axis = rangeAxis; boolean secondaxis = false; if (getUseSecondYAxis(scope)) { secondaxis = true; range2Axis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getRangeAxis(1); if (range2Axis == null) { NumberAxis secondAxis = new NumberAxis(""); ((XYPlot) this.chart.getPlot()).setRangeAxis(1, secondAxis); range2Axis = secondAxis; range2Axis = (NumberAxis) ((XYPlot) this.chart.getPlot()).getRangeAxis(1); range2Axis = formatYAxis(scope, range2Axis); ((XYPlot) this.chart.getPlot()).setRangeAxis(1, range2Axis); } } if (getX_LogScale(scope)) { LogarithmicAxis logAxis = new LogarithmicAxis(domainAxis.getLabel()); logAxis.setAllowNegativesFlag(true); ((XYPlot) this.chart.getPlot()).setDomainAxis(logAxis); domainAxis = logAxis; } if (getY_LogScale(scope)) { LogarithmicAxis logAxis = new LogarithmicAxis(rangeAxis.getLabel()); logAxis.setAllowNegativesFlag(true); logAxis = (LogarithmicAxis) formatYAxis(scope, logAxis); ((XYPlot) this.chart.getPlot()).setRangeAxis(logAxis); rangeAxis = logAxis; } if (secondaxis) { if (getY2_LogScale(scope)) { LogarithmicAxis logAxis = new LogarithmicAxis(range2Axis.getLabel()); logAxis.setAllowNegativesFlag(true); logAxis = (LogarithmicAxis) formatYAxis(scope, logAxis); ((XYPlot) this.chart.getPlot()).setRangeAxis(1, logAxis); range2Axis = logAxis; } } if (!getUseXRangeInterval(scope) && !getUseXRangeMinMax(scope)) { domainAxis.setAutoRange(true); } if (this.getUseXRangeInterval(scope)) { domainAxis.setFixedAutoRange(getXRangeInterval(scope)); domainAxis.setAutoRangeMinimumSize(getXRangeInterval(scope)); domainAxis.setAutoRange(true); } if (this.getUseXRangeMinMax(scope)) { domainAxis.setRange(getXRangeMin(scope), getXRangeMax(scope)); } if (this.getXTickLineVisible(scope)) { ((XYPlot) this.chart.getPlot()).setDomainGridlinePaint(this.tickColor); if (getXTickUnit(scope) > 0) { domainAxis.setTickUnit(new NumberTickUnit(getXTickUnit(scope))); ((XYPlot) this.chart.getPlot()).setDomainGridlinesVisible(true); } else ((XYPlot) this.chart.getPlot()) .setDomainGridlinesVisible(GamaPreferences.Displays.CHART_GRIDLINES.getValue()); } else { ((XYPlot) this.chart.getPlot()).setDomainGridlinesVisible(false); } if (!getUseYRangeInterval(scope) && !getUseYRangeMinMax(scope)) { rangeAxis.setAutoRange(true); } if (this.getUseYRangeInterval(scope)) { rangeAxis.setFixedAutoRange(getYRangeInterval(scope)); rangeAxis.setAutoRangeMinimumSize(getYRangeInterval(scope)); rangeAxis.setAutoRange(true); } if (this.getUseYRangeMinMax(scope)) { rangeAxis.setRange(getYRangeMin(scope), getYRangeMax(scope)); } if (this.getYTickLineVisible(scope)) { ((XYPlot) this.chart.getPlot()).setRangeGridlinePaint(this.tickColor); if (getYTickUnit(scope) > 0) { rangeAxis.setTickUnit(new NumberTickUnit(getYTickUnit(scope))); ((XYPlot) this.chart.getPlot()).setRangeGridlinesVisible(true); } else ((XYPlot) this.chart.getPlot()) .setRangeGridlinesVisible(GamaPreferences.Displays.CHART_GRIDLINES.getValue()); } else { ((XYPlot) this.chart.getPlot()).setRangeGridlinesVisible(false); } if (secondaxis) { if (!getUseY2RangeInterval(scope) && !getUseY2RangeMinMax(scope)) { range2Axis.setAutoRange(true); } if (this.getUseY2RangeInterval(scope)) { range2Axis.setFixedAutoRange(getY2RangeInterval(scope)); range2Axis.setAutoRangeMinimumSize(getY2RangeInterval(scope)); range2Axis.setAutoRange(true); } if (this.getUseY2RangeMinMax(scope)) { range2Axis.setRange(getY2RangeMin(scope), getY2RangeMax(scope)); } if (this.getYTickLineVisible(scope)) { ((XYPlot) this.chart.getPlot()).setRangeGridlinePaint(this.tickColor); if (getY2TickUnit(scope) > 0) { range2Axis.setTickUnit(new NumberTickUnit(getY2TickUnit(scope))); ((XYPlot) this.chart.getPlot()).setRangeGridlinesVisible(true); } else ((XYPlot) this.chart.getPlot()) .setRangeGridlinesVisible(GamaPreferences.Displays.CHART_GRIDLINES.getValue()); } else { ((XYPlot) this.chart.getPlot()).setRangeGridlinesVisible(false); } } if (getXLabel(scope) != null && !getXLabel(scope).isEmpty()) { domainAxis.setLabel(getXLabel(scope)); } if (getYLabel(scope) != null && !getYLabel(scope).isEmpty()) { rangeAxis.setLabel(getYLabel(scope)); } if (secondaxis) { if (getY2Label(scope) != null && !getY2Label(scope).isEmpty()) { range2Axis.setLabel(getY2Label(scope)); } } if (this.series_label_position.equals("none")) { (this.chart).getLegend().setVisible(false); } if (!this.getXTickValueVisible(scope)) { domainAxis.setTickMarksVisible(false); domainAxis.setTickLabelsVisible(false); } } @Override public void setSerieMarkerShape(final IScope scope, final String serieid, final String markershape) { final AbstractXYItemRenderer newr = (AbstractXYItemRenderer) this.getOrCreateRenderer(scope, serieid); if (newr instanceof XYLineAndShapeRenderer) { final XYLineAndShapeRenderer serierenderer = (XYLineAndShapeRenderer) getOrCreateRenderer(scope, serieid); if (markershape != null) { if (markershape.equals(ChartDataStatement.MARKER_EMPTY)) { serierenderer.setSeriesShapesVisible(0, false); } else { Shape myshape = defaultmarkers[0]; if (markershape.equals(ChartDataStatement.MARKER_CIRCLE)) { myshape = defaultmarkers[1]; } else if (markershape.equals(ChartDataStatement.MARKER_UP_TRIANGLE)) { myshape = defaultmarkers[2]; } else if (markershape.equals(ChartDataStatement.MARKER_DIAMOND)) { myshape = defaultmarkers[3]; } else if (markershape.equals(ChartDataStatement.MARKER_HOR_RECTANGLE)) { myshape = defaultmarkers[4]; } else if (markershape.equals(ChartDataStatement.MARKER_DOWN_TRIANGLE)) { myshape = defaultmarkers[5]; } else if (markershape.equals(ChartDataStatement.MARKER_HOR_ELLIPSE)) { myshape = defaultmarkers[6]; } else if (markershape.equals(ChartDataStatement.MARKER_RIGHT_TRIANGLE)) { myshape = defaultmarkers[7]; } else if (markershape.equals(ChartDataStatement.MARKER_VERT_RECTANGLE)) { myshape = defaultmarkers[8]; } else if (markershape.equals(ChartDataStatement.MARKER_LEFT_TRIANGLE)) { myshape = defaultmarkers[9]; } serierenderer.setSeriesShape(0, myshape); } } } else if (newr instanceof XYShapeRenderer) { final XYShapeRenderer serierenderer = (XYShapeRenderer) getOrCreateRenderer(scope, serieid); if (markershape != null) { if (markershape.equals(ChartDataStatement.MARKER_EMPTY)) { serierenderer.setSeriesShape(0, null); } else { Shape myshape = defaultmarkers[0]; if (markershape.equals(ChartDataStatement.MARKER_CIRCLE)) { myshape = defaultmarkers[1]; } else if (markershape.equals(ChartDataStatement.MARKER_UP_TRIANGLE)) { myshape = defaultmarkers[2]; } else if (markershape.equals(ChartDataStatement.MARKER_DIAMOND)) { myshape = defaultmarkers[3]; } else if (markershape.equals(ChartDataStatement.MARKER_HOR_RECTANGLE)) { myshape = defaultmarkers[4]; } else if (markershape.equals(ChartDataStatement.MARKER_DOWN_TRIANGLE)) { myshape = defaultmarkers[5]; } else if (markershape.equals(ChartDataStatement.MARKER_HOR_ELLIPSE)) { myshape = defaultmarkers[6]; } else if (markershape.equals(ChartDataStatement.MARKER_RIGHT_TRIANGLE)) { myshape = defaultmarkers[7]; } else if (markershape.equals(ChartDataStatement.MARKER_VERT_RECTANGLE)) { myshape = defaultmarkers[8]; } else if (markershape.equals(ChartDataStatement.MARKER_LEFT_TRIANGLE)) { myshape = defaultmarkers[9]; } serierenderer.setSeriesShape(0, myshape); } } } } @Override public void setUseSize(final IScope scope, final String name, final boolean b) { // TODO Auto-generated method stub final AbstractXYItemRenderer newr = (AbstractXYItemRenderer) this.getOrCreateRenderer(scope, name); if (newr instanceof myXYErrorRenderer) { ((myXYErrorRenderer) newr).setUseSize(scope, b); } } @Override protected void initRenderer(final IScope scope) { // TODO Auto-generated method stub final XYPlot plot = (XYPlot) this.chart.getPlot(); defaultrenderer = new myXYErrorRenderer(); plot.setRenderer((myXYErrorRenderer) defaultrenderer); } @Override public void setUseXSource(final IScope scope, final IExpression expval) { // if there is something to do to use custom X axis } @Override public void setUseXLabels(final IScope scope, final IExpression expval) { // if there is something to do to use custom X axis final XYPlot pp = (XYPlot) chart.getPlot(); ((NumberAxis) pp.getDomainAxis()).setNumberFormatOverride(new NumberFormat() { @Override public StringBuffer format(final double number, final StringBuffer toAppendTo, final FieldPosition pos) { final int ind = chartdataset.XSeriesValues.indexOf(number); if (ind >= 0) { return new StringBuffer("" + chartdataset.Xcategories.get(ind)); } return new StringBuffer(""); } @Override public StringBuffer format(final long number, final StringBuffer toAppendTo, final FieldPosition pos) { return new StringBuffer("n" + number); // return new StringBuffer(String.format("%s", number)); } @Override public Number parse(final String source, final ParsePosition parsePosition) { return null; } }); } @Override public void initChart(final IScope scope, final String chartname) { super.initChart(scope, chartname); final XYPlot pp = (XYPlot) chart.getPlot(); pp.setDomainGridlinePaint(axesColor); pp.setRangeGridlinePaint(axesColor); pp.setDomainCrosshairPaint(axesColor); pp.setRangeCrosshairPaint(axesColor); pp.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0)); pp.setDomainCrosshairVisible(false); pp.setRangeCrosshairVisible(false); pp.getDomainAxis().setAxisLinePaint(axesColor); pp.getDomainAxis().setTickLabelFont(getTickFont()); pp.getDomainAxis().setLabelFont(getLabelFont()); if (textColor != null) { pp.getDomainAxis().setLabelPaint(textColor); pp.getDomainAxis().setTickLabelPaint(textColor); } NumberAxis axis = (NumberAxis) pp.getRangeAxis(); axis = formatYAxis(scope, axis); pp.setRangeAxis(axis); if (ytickunit > 0) { ((NumberAxis) pp.getRangeAxis()).setTickUnit(new NumberTickUnit(ytickunit)); pp.setRangeGridlinesVisible(true); } else pp.setRangeGridlinesVisible(GamaPreferences.Displays.CHART_GRIDLINES.getValue()); // resetAutorange(scope); if (getType() == ChartOutput.SERIES_CHART) { if (xlabel == null) xlabel = "time"; } if (getType() == ChartOutput.XY_CHART) { } if (getType() == ChartOutput.SCATTER_CHART) { } if (!this.getXTickValueVisible(scope)) { pp.getDomainAxis().setTickMarksVisible(false); pp.getDomainAxis().setTickLabelsVisible(false); } } @Override public void getModelCoordinatesInfo(final int xOnScreen, final int yOnScreen, final IDisplaySurface g, final Point positionInPixels, final StringBuilder sb) { final int x = xOnScreen - positionInPixels.x; final int y = yOnScreen - positionInPixels.y; final ChartEntity entity = info.getEntityCollection().getEntity(x, y); // getChart().handleClick(x, y, info); if (entity instanceof XYItemEntity) { final XYDataset data = ((XYItemEntity) entity).getDataset(); final int index = ((XYItemEntity) entity).getItem(); final int series = ((XYItemEntity) entity).getSeriesIndex(); final double xx = data.getXValue(series, index); final double yy = data.getYValue(series, index); final XYPlot plot = (XYPlot) getJFChart().getPlot(); final ValueAxis xAxis = plot.getDomainAxis(series); final ValueAxis yAxis = plot.getRangeAxis(series); final boolean xInt = xx % 1 == 0; final boolean yInt = yy % 1 == 0; String xTitle = xAxis.getLabel(); if (StringUtils.isBlank(xTitle)) { xTitle = "X"; } String yTitle = yAxis.getLabel(); if (StringUtils.isBlank(yTitle)) { yTitle = "Y"; } sb.append(xTitle).append(" ").append(xInt ? (int) xx : String.format("%.2f", xx)); sb.append(" | ").append(yTitle).append(" ").append(yInt ? (int) yy : String.format("%.2f", yy)); return; } else if (entity instanceof PieSectionEntity) { final String title = ((PieSectionEntity) entity).getSectionKey().toString(); final PieDataset data = ((PieSectionEntity) entity).getDataset(); final int index = ((PieSectionEntity) entity).getSectionIndex(); final double xx = data.getValue(index).doubleValue(); final boolean xInt = xx % 1 == 0; sb.append(title).append(" ").append(xInt ? (int) xx : String.format("%.2f", xx)); return; } else if (entity instanceof CategoryItemEntity) { final Comparable<?> columnKey = ((CategoryItemEntity) entity).getColumnKey(); final String title = columnKey.toString(); final CategoryDataset data = ((CategoryItemEntity) entity).getDataset(); final Comparable<?> rowKey = ((CategoryItemEntity) entity).getRowKey(); final double xx = data.getValue(rowKey, columnKey).doubleValue(); final boolean xInt = xx % 1 == 0; sb.append(title).append(" ").append(xInt ? (int) xx : String.format("%.2f", xx)); return; } } }