/*
 * StemAndLeafPlotDialog.java
 *
 * Created on December 2, 2008, 3:38 PM
 */

package org.statcato.dialogs.graph;

import org.statcato.*;
import org.statcato.spreadsheet.*;
import org.statcato.utils.HelperFunctions;
import org.statcato.utils.NumDataset;
import org.statcato.graph.StemAndLeafPlot;
import org.statcato.statistics.BasicStatistics;
import java.util.*;


/**
 * A dialog for creating stem-and-leaf plots.
 * 
 * @author Margaret Yau
 * @version %I%, %G%
 * @since 1.0
 */
public class StemAndLeafPlotDialog extends StatcatoDialog {
    
    /** Creates new form StemAndLeafPlotDialog */
    public StemAndLeafPlotDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        this.app = (Statcato) parent;
        ParentSpreadsheet = app.getSpreadsheet();
        initComponents();
        
        ParentSpreadsheet.populateColumnsList(InputVarList);
        ParentSpreadsheet.populateComboBox(GroupByComboBox);
        
        getRootPane().setDefaultButton(OKButton);
        setHelpFile("graph-stemplot");
        name = "Stem-and-Leaf Plot";
        description = "For creating stem-and-leaf-plots, which " +
                "divide each data value into a stem and a leaf " +
                "and show the leaves corresponding to each distinct " +
                "stem in the data set in a tabular fashion.";
        helpStrings.add("Select the columns containing data values. " +
                "Control-click to select multiple variables. ");
        helpStrings.add("Enter the leaf unit (must be equal to 10x, " +
                "where x is an integer).");
        helpStrings.add("Select the Exclude outliers checkbox to exclude " +
                "the outliers from the plot.");
        helpStrings.add("Select the Display stems that have no leaves " +
                "checkbox to display the stems with no leaves.");
        pack();
    }
    
    /**
     * Updates elements on the dialog so that they have the most
     * current values.  Called by {@link #setVisible} to make
     * sure the dialog displays current values when made visible again.
     * 
     * @see #setVisible(boolean)
     */
    @Override
    public void updateElements() {
        updateComboBox(GroupByComboBox);
        updateColumnsList(InputVarList);        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel2 = new javax.swing.JPanel();
        OutlierCheckBox = new javax.swing.JCheckBox();
        jLabel3 = new javax.swing.JLabel();
        LeafUnitTextField = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        DisplayCheckBox = new javax.swing.JCheckBox();
        jPanel1 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        InputVarList = new javax.swing.JList();
        GroupByComboBox = new javax.swing.JComboBox();
        OKButton = new javax.swing.JButton();
        CancelButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Stem-and-Leaf Plot");

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Graph Options"));

        OutlierCheckBox.setSelected(true);
        OutlierCheckBox.setText("Exclude outliers");

        jLabel3.setText("Leaf unit:");

        jLabel5.setText("e.g. With a leaf unit of 1, the leaf of 23 is 3.
\nWith a leaf unit of 0.1, the leaf of 5.6 is 6."); jLabel6.setText("[automatic if left blank]"); DisplayCheckBox.setSelected(true); DisplayCheckBox.setText("Display stems that have no leaves"); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGap(40, 40, 40) .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel2Layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(OutlierCheckBox) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(LeafUnitTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel6)) .addComponent(DisplayCheckBox)))) .addContainerGap(25, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(LeafUnitTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel6)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(OutlierCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(DisplayCheckBox) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Graph Variables")); jLabel4.setText("Grouped By Categories in: [optional]"); jLabel2.setText("Ctrl-click to select multiple variables"); jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N jLabel1.setText("Graph Variables:"); jScrollPane1.setViewportView(InputVarList); GroupByComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { GroupByComboBoxItemStateChanged(evt); } }); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jLabel1) .addComponent(jLabel2) .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(GroupByComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 118, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(GroupByComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); OKButton.setText("OK"); OKButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { OKButtonActionPerformed(evt); } }); CancelButton.setText("Cancel"); CancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { CancelButtonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addGap(83, 83, 83) .addComponent(OKButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(CancelButton))) .addContainerGap(10, Short.MAX_VALUE)) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {CancelButton, OKButton}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(OKButton) .addComponent(CancelButton)) .addContainerGap()) ); pack(); }//
//GEN-END:initComponents private void GroupByComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_GroupByComboBoxItemStateChanged }//GEN-LAST:event_GroupByComboBoxItemStateChanged private void OKButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OKButtonActionPerformed app.compoundEdit = new DialogEdit("stem-and-leaf plot"); // get selected input variables Object[] SelectedColumns = InputVarList.getSelectedValues(); int[] columnNumbers = ParentSpreadsheet.convertColumnLabelsToNumbers(SelectedColumns); // check that at least one input variable is selected if (columnNumbers.length == 0) { app.showErrorDialog("Select at least one input variable."); return; } String text = ""; // check if using a group by variable String byVarLabel = GroupByComboBox.getSelectedItem().toString(); int byVarColNum = -1; // BY variable column number Vector byVarColVector = null; // BY variable column vector boolean hasByVar = false; NumDataset dataset = new NumDataset(); if (!byVarLabel.equals("")) { // has BY variable text += "Group By variable: " + byVarLabel + "
"; hasByVar = true; byVarColNum = ParentSpreadsheet.parseColumnNumber(byVarLabel); byVarColVector = ParentSpreadsheet.getColumn(byVarColNum); byVarColVector = HelperFunctions.removeNullCells(byVarColVector); } // build dataset text += "Graph variables: "; for (int i = 0; i < columnNumbers.length; ++i) { Vector StrColumnVector = ParentSpreadsheet.getColumn(columnNumbers[i]); String columnLabel = (String) SelectedColumns[i]; text += columnLabel + " "; // get input column of doubles Vector ColumnVector = HelperFunctions.ConvertInputVectorToDoubles(StrColumnVector); ColumnVector = HelperFunctions.removeNullValues(ColumnVector); if (ColumnVector == null) { app.showErrorDialog("Invalid input column " + columnLabel + ": all data must be numbers."); return; } if (hasByVar) { if (ColumnVector.size() != byVarColVector.size()) { app.showErrorDialog("There must be one category label for " + "each data value."); return; } dataset.addDataVectorWithByVarLabels(ColumnVector, byVarColVector); } else dataset.add(ColumnVector, columnLabel); } double leafUnit = -1; if (!LeafUnitTextField.getText().equals("")) { // get leaf unit from text field try { double u = Double.parseDouble(LeafUnitTextField.getText()); if (u <= 0 || Math.log10(u) - Math.floor(Math.log10(u)) != 0) { throw new NumberFormatException(); } leafUnit = u; } catch (NumberFormatException e) { app.showErrorDialog("Enter a valid number for the leaf unit."); return; } } text += "
"; Vector> data = dataset.getValues(); Vector labels = dataset.getLabels(); for (int i = 0; i < data.size(); ++i) { text += "
Graph Variable: " + labels.elementAt(i) + "
"; // remove outliers if (OutlierCheckBox.isSelected()) { Vector outliers = BasicStatistics.removeOutliers(data.elementAt(i)); text += "Outliers: " + HelperFunctions.printDoubleVectorToString(outliers) + "
"; } StemAndLeafPlot plot = new StemAndLeafPlot(data.elementAt(i), leafUnit); plot.displayEmptyStem = DisplayCheckBox.isSelected(); text += "Leaf units: " + plot.getLeafUnits() + "
"; text += plot; } app.addLogParagraph("Stem-and-Leaf Plot", text); app.compoundEdit.end(); app.addCompoundEdit(app.compoundEdit); setVisible(false); }//GEN-LAST:event_OKButtonActionPerformed private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed setVisible(false); }//GEN-LAST:event_CancelButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton CancelButton; private javax.swing.JCheckBox DisplayCheckBox; private javax.swing.JComboBox GroupByComboBox; private javax.swing.JList InputVarList; private javax.swing.JTextField LeafUnitTextField; private javax.swing.JButton OKButton; private javax.swing.JCheckBox OutlierCheckBox; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration//GEN-END:variables }

Ads help maintain this website.