/* * Licensed Materials - Property of Perforce Software, Inc. * © Copyright Perforce Software, Inc. 2014, 2021 * © Copyright IBM Corp. 2009, 2014 * © Copyright ILOG 1996, 2009 * All Rights Reserved. * * Note to U.S. Government Users Restricted Rights: * The Software and Documentation were developed at private expense and * are "Commercial Items" as that term is defined at 48 CFR 2.101, * consisting of "Commercial Computer Software" and * "Commercial Computer Software Documentation", as such terms are * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4, * as applicable. */ import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.SwingUtilities; import ilog.views.chart.IlvChart; import ilog.views.chart.IlvChartLayout; import ilog.views.chart.IlvLegend; import ilog.views.chart.data.IlvCombinedDataSet; import ilog.views.chart.data.IlvDataSet; import ilog.views.chart.data.IlvDefaultDataSource; import ilog.views.chart.event.DataSetContentsEvent; import ilog.views.chart.util.IlvArrays; import ilog.views.util.IlvProductUtil; public class DataSetCombination extends JFrame { /** * A data set that combines the y values of several other data sets. */ public static abstract class YOperatorDataSet extends IlvCombinedDataSet { /** * Creates a new <code>YOperatorDataSet</code> with the specified name. */ public YOperatorDataSet(String name) { setName(name); } /** * Returns the data resulting from an operation on the specified series. */ protected abstract double getData(double[] values); /** * Returns the y value of the data point at the specified index. */ Override public double getYData(int idx) { int count = getDataSetCount(); double[] values = new double[count]; for (int i = 0; i < count; ++i) values[i] = getDataSet(i).getYData(idx); return getData(values); } /** * Returns the x value of the data point at the specified index. */ Override public double getXData(int idx) { return getDataSet(0).getXData(idx); } /** * Called when one of the data sets referenced by this object has been * modified. */ Override protected void dataSetContentsChanged(DataSetContentsEvent evt) { super.dataSetContentsChanged(evt); int count = getDataCount(); if (evt.getType() != DataSetContentsEvent.FULL_UPDATE && count == 0) // Not // enough // data // yet. return; if (evt.getType() == DataSetContentsEvent.DATA_ADDED && evt.getFirstIdx() != count) return; // Wait for data to be added to all original data sets. // Send a new event with this data set as source. fireDataSetContentsEvent(new DataSetContentsEvent(this, evt)); } } /** * A combined data set that computes the mean value of a given category. */ public static class Average extends YOperatorDataSet { /** * Creates a new <code>AverageCombinedDataSet</code> object. * * @param name * The name of this data set. * @param dataSets * The referenced data sets. */ public Average(String name, IlvDataSet[] dataSets) { super(name); setDataSets(dataSets); } /** * Returns the average value of the specified series. */ Override protected double getData(double[] values) { double total = 0.; for (int i = 0; i < values.length; ++i) { total += values[i]; } return total / values.length; } } static final int COUNT = 101; public DataSetCombination() { super("Computing a Data Set From Other Data Sets"); setDefaultCloseOperation(EXIT_ON_CLOSE); IlvChart chart = new IlvChart(); IlvDefaultDataSource ds = new IlvDefaultDataSource( new double[][] { IlvArrays.randomValues(COUNT, 0, 50), IlvArrays.randomValues(COUNT, 0, 50), IlvArrays.randomValues(COUNT, 0, 50) }, -1, new String[] { "Data Set 1", "Data Set 2", "Data Set 3" }, null); ds.addDataSet(new Average("Average", ds.getDataSets())); chart.setDataSource(ds); chart.addLegend(new IlvLegend(), IlvChartLayout.SOUTH_BOTTOM); getContentPane().setLayout(new BorderLayout()); getContentPane().add(chart, BorderLayout.CENTER); setSize(500, 400); } public static void main(String[] args) { // This sample uses JViews Charts features. When deploying an // application that includes this code, you need to be in possession // of a Perforce JViews Charts Deployment license. IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Charts_Deployment); SwingUtilities.invokeLater(new Runnable() { Override public void run() { DataSetCombination frame = new DataSetCombination(); frame.setVisible(true); } }); } }