/* * TemporalAnalysisPlotPanel.java * * Copyright (C) 2002-2009 Alexei Drummond and Andrew Rambaut * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.tracer.analysis; import dr.app.gui.chart.*; import dr.stats.Variate; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.util.ArrayList; /** * A panel that displays demographic plot * * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: TemporalAnalysisPlotPanel.java,v 1.2 2006/12/01 09:36:17 rambaut Exp $ */ public class TemporalAnalysisPlotPanel extends JPanel { private JChart demoChart = new JChart(new LinearAxis(Axis.AT_DATA, Axis.AT_DATA), new LogAxis()); private JChartPanel chartPanel = new JChartPanel(demoChart, null, "", ""); private JComboBox meanMedianComboBox = new JComboBox(new String[]{"Median", "Mean"}); private JCheckBox solidIntervalCheckBox = new JCheckBox("Solid interval"); private ChartSetupDialog chartSetupDialog = null; private Variate timeScale = null; /** * Creates new TemporalAnalysisPlotPanel * * @param frame the parent frame */ public TemporalAnalysisPlotPanel(final JFrame frame) { setMinimumSize(new Dimension(300, 150)); setLayout(new BorderLayout()); JToolBar toolBar = new JToolBar(); toolBar.setLayout(new FlowLayout(FlowLayout.LEFT)); toolBar.setFloatable(false); JButton chartSetupButton = new JButton("Axes..."); chartSetupButton.putClientProperty( "Quaqua.Button.style", "placard" ); chartSetupButton.setFont(UIManager.getFont("SmallSystemFont")); toolBar.add(chartSetupButton); JLabel label = new JLabel("Show:"); label.setFont(UIManager.getFont("SmallSystemFont")); label.setLabelFor(meanMedianComboBox); toolBar.add(label); meanMedianComboBox.setFont(UIManager.getFont("SmallSystemFont")); toolBar.add(meanMedianComboBox); toolBar.add(new JToolBar.Separator(new Dimension(8, 8))); solidIntervalCheckBox.setFont(UIManager.getFont("SmallSystemFont")); toolBar.add(solidIntervalCheckBox); add(chartPanel, BorderLayout.CENTER); add(toolBar, BorderLayout.SOUTH); meanMedianComboBox.addItemListener( new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent ev) { updatePlots(); } } ); chartSetupButton.addActionListener( new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent actionEvent) { if (chartSetupDialog == null) { chartSetupDialog = new ChartSetupDialog(frame, false, true, Axis.AT_DATA, Axis.AT_DATA, Axis.AT_DATA, Axis.AT_DATA); } chartSetupDialog.showDialog(demoChart); validate(); repaint(); } } ); solidIntervalCheckBox.addItemListener( new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent ev) { updatePlots(); } } ); chartPanel.setTitle(""); chartPanel.setXAxisTitle("Time"); chartPanel.setYAxisTitle(""); } public void addDemographicPlot(String title, Variate.D xData, Variate.D yDataMean, Variate.D yDataMedian, Variate.D yDataUpper, Variate.D yDataLower, double timeMean, double timeMedian, double timeUpper, double timeLower) { if (timeScale == null) { timeScale = xData; } analysisData.add(new AnalysisData(title, xData, yDataMean, yDataMedian, yDataUpper, yDataLower, timeMean, timeMedian, timeUpper, timeLower)); updatePlots(); setVisible(true); } public void addDensityPlot(String title, Variate.D xData, Variate.D yData) { analysisData.add(new AnalysisData(title, xData, yData)); updatePlots(); setVisible(true); } public void updatePlots() { demoChart.removeAllPlots(); for (AnalysisData analysis : analysisData) { updatePlot(analysis); } validate(); repaint(); } public Variate getTimeScale() { return timeScale; } public java.util.List<AnalysisData> getAnalysisData() { return analysisData; } public void updatePlot(AnalysisData analysis) { if (analysis.yDataUpper != null && analysis.yDataLower != null) { if (solidIntervalCheckBox.isSelected()) { AreaPlot areaPlot = new AreaPlot(analysis.xData, analysis.yDataUpper, analysis.xData, analysis.yDataLower); areaPlot.setLineColor(new Color(0x9999FF)); demoChart.addPlot(areaPlot); } else { LinePlot plot = new LinePlot(analysis.xData, analysis.yDataLower); plot.setLineStyle(new BasicStroke(1.0F), new Color(0x9999FF)); demoChart.addPlot(plot); plot = new LinePlot(analysis.xData, analysis.yDataUpper); plot.setLineStyle(new BasicStroke(1.0F), new Color(0x9999FF)); demoChart.addPlot(plot); } } LinePlot linePlot; if (meanMedianComboBox.getSelectedItem().equals("Median") && analysis.yDataMedian != null) { linePlot = new LinePlot(analysis.xData, analysis.yDataMedian); } else { linePlot = new LinePlot(analysis.xData, analysis.yDataMean); } linePlot.setLineStyle(new BasicStroke(2.0F), Color.black); demoChart.addPlot(linePlot); Variate.D y1 = new Variate.D(); y1.add(demoChart.getYAxis().getMinAxis()); y1.add(demoChart.getYAxis().getMaxAxis()); if (analysis.timeMean > 0.0 && analysis.timeMedian > 0.0) { Variate.D x1 = new Variate.D(); if (meanMedianComboBox.getSelectedItem().equals("Median")) { x1.add(analysis.timeMedian); x1.add(analysis.timeMedian); } else { x1.add(analysis.timeMean); x1.add(analysis.timeMean); } LinePlot linePlot2 = new LinePlot(x1, y1); linePlot2.setLineStyle(new BasicStroke(2F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 0.0F, new float[]{0.5F, 3.0F}, 0.0F), Color.black); demoChart.addPlot(linePlot2); } if (analysis.timeLower > 0.0) { Variate.D x2 = new Variate.D(); x2.add(analysis.timeLower); x2.add(analysis.timeLower); LinePlot linePlot3 = new LinePlot(x2, y1); linePlot3.setLineStyle(new BasicStroke(1.0F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 0.0F, new float[]{0.5F, 2.0F}, 0.0F), Color.black); demoChart.addPlot(linePlot3); } if (analysis.timeUpper > 0.0) { Variate.D x3 = new Variate.D(); x3.add(analysis.timeUpper); x3.add(analysis.timeUpper); LinePlot linePlot4 = new LinePlot(x3, y1); linePlot4.setLineStyle(new BasicStroke(1.0F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 0.0F, new float[]{0.5F, 2.0F}, 0.0F), Color.black); demoChart.addPlot(linePlot4); } } public JComponent getExportableComponent() { return chartPanel; } java.util.List<AnalysisData> analysisData = new ArrayList<AnalysisData>(); class AnalysisData { public AnalysisData(String title, Variate.D xData, Variate.D yDataMean, Variate.D yDataMedian, Variate.D yDataUpper, Variate.D yDataLower, double timeMedian, double timeMean, double timeUpper, double timeLower) { this.title = title; this.isDemographic = true; this.xData = xData; this.yDataMean = yDataMean; this.yDataMedian = yDataMedian; this.yDataUpper = yDataUpper; this.yDataLower = yDataLower; this.timeMedian = timeMedian; this.timeMean = timeMean; this.timeUpper = timeUpper; this.timeLower = timeLower; } public AnalysisData(String title, Variate.D xData, Variate.D yData) { this.title = title; this.isDemographic = false; this.xData = xData; this.yDataMean = yData; } String title; boolean isDemographic; Variate.D xData = null; Variate.D yDataMean = null; Variate.D yDataMedian = null; Variate.D yDataUpper = null; Variate.D yDataLower = null; double timeMedian = -1; double timeMean = -1; double timeUpper = -1; double timeLower = -1; } }