/*
* DemographicPlotPanel.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;
/**
* A panel that displays demographic plot
*
* @author Andrew Rambaut
* @author Alexei Drummond
* @version $Id: DemographicPlotPanel.java,v 1.4 2006/11/22 23:49:37 rambaut Exp $
*/
public class DemographicPlotPanel 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.D xData = null;
private Variate.D yDataMean = null;
private Variate.D yDataMedian = null;
private Variate.D yDataUpper = null;
private Variate.D yDataLower = null;
private double timeMedian = -1;
private double timeMean = -1;
private double timeUpper = -1;
private double timeLower = -1;
/**
* Creates new DemographicPlotPanel
*
* @param frame the parent frame
*/
public DemographicPlotPanel(final JFrame frame) {
setMinimumSize(new Dimension(300, 150));
setLayout(new BorderLayout());
JToolBar toolBar = new JToolBar();
toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
toolBar.setFloatable(false);
JLabel label = new JLabel("Show:");
label.setLabelFor(meanMedianComboBox);
toolBar.add(label);
toolBar.add(meanMedianComboBox);
JButton chartSetupButton = new JButton("Setup Axes");
toolBar.add(new JToolBar.Separator(new Dimension(8, 8)));
toolBar.add(chartSetupButton);
toolBar.add(new JToolBar.Separator(new Dimension(8, 8)));
toolBar.add(solidIntervalCheckBox);
toolBar.add(new JToolBar.Separator(new Dimension(8, 8)));
meanMedianComboBox.setFont(UIManager.getFont("SmallSystemFont"));
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();
}
}
);
}
public void setupPlot(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) {
this.xData = xData;
this.yDataMean = yDataMean;
this.yDataMedian = yDataMedian;
this.yDataUpper = yDataUpper;
this.yDataLower = yDataLower;
this.timeMean = timeMean;
this.timeMedian = timeMedian;
this.timeUpper = timeUpper;
this.timeLower = timeLower;
if (xData == null) {
demoChart.removeAllPlots();
chartPanel.setTitle("");
chartPanel.setXAxisTitle("");
chartPanel.setYAxisTitle("");
return;
}
chartPanel.setTitle(title);
updatePlots();
chartPanel.setXAxisTitle("Time");
chartPanel.setYAxisTitle("Population Size");
}
public void updatePlots() {
demoChart.removeAllPlots();
if (solidIntervalCheckBox.isSelected()) {
AreaPlot areaPlot = new AreaPlot(xData, yDataUpper, xData, yDataLower);
areaPlot.setLineColor(new Color(0x9999FF));
demoChart.addPlot(areaPlot);
} else {
LinePlot plot = new LinePlot(xData, yDataLower);
plot.setLineStyle(new BasicStroke(1.0F), new Color(0x9999FF));
demoChart.addPlot(plot);
plot = new LinePlot(xData, yDataUpper);
plot.setLineStyle(new BasicStroke(1.0F), new Color(0x9999FF));
demoChart.addPlot(plot);
}
LinePlot linePlot;
if (meanMedianComboBox.getSelectedItem().equals("Median")) {
linePlot = new LinePlot(xData, yDataMedian);
} else {
linePlot = new LinePlot(xData, 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 (timeMean > 0.0 && timeMedian > 0.0) {
Variate.D x1 = new Variate.D();
if (meanMedianComboBox.getSelectedItem().equals("Median")) {
x1.add(timeMedian);
x1.add(timeMedian);
} else {
x1.add(timeMean);
x1.add(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 (timeLower > 0.0) {
Variate.D x2 = new Variate.D();
x2.add(timeLower);
x2.add(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 (timeUpper > 0.0) {
Variate.D x3 = new Variate.D();
x3.add(timeUpper);
x3.add(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);
}
validate();
repaint();
}
public JComponent getExportableComponent() {
return chartPanel;
}
}