package jeql.command.chart; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import jeql.api.row.Row; import jeql.api.row.RowIterator; import jeql.api.row.RowUtil; import jeql.api.row.SchemaUtil; import jeql.api.table.Table; import jeql.std.function.ValFunction; import jeql.style.StyleConstants; import jeql.util.TypeUtil; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardXYItemLabelGenerator; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.data.xy.DefaultXYDataset; import org.jfree.data.xy.XYDataset; public class XYChart extends BaseChart { private List xyItems; public XYChart(String chartType) { } public JFreeChart createChart() throws Exception { JFreeChart chart = createChart(createDataset(param.getFirstDataTable())); return chart; } private XYDataset createDataset(Table tbl) { DefaultXYDataset dataset = new DefaultXYDataset(); if (tbl == null) return dataset; int xIndex = findColumnIndex(tbl, DATA_COL_X, DATA_COL_KEY, 0); /** * If only one column, use it for Y */ if (tbl.getRows().getSchema().size() == 1) xIndex = -1; int yIndex = findRangeIndex(tbl, DATA_COL_Y, DATA_COL_VALUE, xIndex); int lblIndex = findColumnIndex(tbl, StyleConstants.LABEL); xyItems = scanXY(tbl, xIndex, yIndex, lblIndex); double[][] xy = extractXYArray(xyItems); dataset.addSeries(param.getSeriesKey(0), xy); return dataset; } private List scanXY(Table tbl, int xIndex, int yIndex, int lblIndex) { List xyItems = new ArrayList(); int rowCount = 0; for (RowIterator i = tbl.getRows().iterator(); ; ) { Row row = i.next(); if (row == null) break; // default X value is the row count double x = rowCount++; if (xIndex >= 0) x = TypeUtil.toDouble(row.getValue(xIndex)); double y = TypeUtil.toDouble(row.getValue(yIndex)); String label = RowUtil.getString(lblIndex, row, null); xyItems.add(new XYItem(x, y, label)); } return xyItems; } private static double[][] extractXYArray(List xyPairs) { double[][] xy = new double[2][xyPairs.size()]; int index = 0; for (Iterator i = xyPairs.iterator(); i.hasNext(); ) { XYItem item = (XYItem) i.next(); xy[0][index] = item.getX(); xy[1][index] = item.getY(); index++; } return xy; } public String getChartType() { String chartType = param.chartType; return chartType; } /** * Creates a chart. * * @param dataset the dataset. * * @return A chart. */ private JFreeChart createChart(XYDataset dataset) { String chartType = getChartType(); JFreeChart chart = null; if (chartType == CHART_TYPE_XY && param.isFilled) chart = ChartFactory.createXYAreaChart( param.title, // chart title param.axisXTitle, param.axisYTitle, dataset, // data param.plotOrientation, param.showLegend, // include legend false, // no tooltips false // no URLs ); else if (chartType == CHART_TYPE_XY) chart = ChartFactory.createXYLineChart( param.title, // chart title param.axisXTitle, param.axisYTitle, dataset, // data param.plotOrientation, param.showLegend, // include legend false, // no tooltips false // no URLs ); else if (chartType == CHART_TYPE_XY_STEP && param.isFilled) chart = ChartFactory.createXYStepAreaChart( param.title, // chart title param.axisXTitle, param.axisYTitle, dataset, // data param.plotOrientation, param.showLegend, // include legend false, // no tooltips false // no URLs ); else if (chartType == CHART_TYPE_XY_STEP) chart = ChartFactory.createXYStepChart( param.title, // chart title param.axisXTitle, param.axisYTitle, dataset, // data param.plotOrientation, param.showLegend, // include legend false, // no tooltips false // no URLs ); else if (chartType == CHART_TYPE_POLAR) chart = ChartFactory.createPolarChart( param.title, // chart title dataset, // data param.showLegend, // include legend false, // no tooltips false // no URLs ); // show item labels for XY charts if (chartType != CHART_TYPE_POLAR) { XYItemRenderer rend = (XYItemRenderer) chart.getXYPlot().getRenderer(); rend.setBaseItemLabelGenerator(new XYLabelItemGenerator(xyItems)); //rend.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator()); rend.setBaseItemLabelsVisible(true); // rr.setPlotShapes(true); } return chart; } }