📄 matrixpanel.java
字号:
} }); optionsPanel = new JPanel( new GridBagLayout() ); //all the rest of the panels are in here. final JPanel p2 = new JPanel( new BorderLayout() ); //this has class colour panel final JPanel p3 = new JPanel( new GridBagLayout() ); //this has update and select buttons final JPanel p4 = new JPanel( new GridBagLayout() ); //this has the slider bars and combobox GridBagConstraints gbc = new GridBagConstraints(); m_plotLBSizeD = m_plotSizeLb.getPreferredSize(); m_pointLBSizeD = m_pointSizeLb.getPreferredSize(); m_pointSizeLb.setText("PointSize: [1]"); m_pointSizeLb.setPreferredSize( m_pointLBSizeD ); m_resampleBt.setPreferredSize( m_selAttrib.getPreferredSize() ); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.insets = new Insets(2,2,2,2); p4.add(m_plotSizeLb, gbc); gbc.weightx=1; gbc.gridwidth = GridBagConstraints.REMAINDER; p4.add(m_plotSize, gbc); gbc.weightx=0; gbc.gridwidth = GridBagConstraints.RELATIVE; p4.add(m_pointSizeLb, gbc); gbc.weightx=1; gbc.gridwidth = GridBagConstraints.REMAINDER; p4.add(m_pointSize, gbc); gbc.weightx=0; gbc.gridwidth = GridBagConstraints.RELATIVE; p4.add( new JLabel("Jitter: "), gbc); gbc.weightx=1; gbc.gridwidth = GridBagConstraints.REMAINDER; p4.add(m_jitter, gbc); p4.add(m_classAttrib, gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx=1; gbc.fill = GridBagConstraints.NONE; p3.add(m_updateBt, gbc); p3.add(m_selAttrib, gbc); gbc.gridwidth = GridBagConstraints.RELATIVE; gbc.weightx = 0; gbc.fill = GridBagConstraints.VERTICAL; gbc.anchor = GridBagConstraints.WEST; p3.add(m_resampleBt, gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; p3.add(m_resamplePercent, gbc); p2.setBorder(BorderFactory.createTitledBorder("Class Colour")); p2.add(m_cp, BorderLayout.SOUTH); gbc.insets = new Insets(8,5,2,5); gbc.anchor = GridBagConstraints.SOUTHWEST; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx=1; gbc.gridwidth = GridBagConstraints.RELATIVE; optionsPanel.add(p4, gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; optionsPanel.add(p3, gbc); optionsPanel.add(p2, gbc); this.addComponentListener( new ComponentAdapter() { public void componentResized(ComponentEvent cv) { m_js.setMinimumSize( new Dimension(MatrixPanel.this.getWidth(), MatrixPanel.this.getHeight() -optionsPanel.getPreferredSize().height-10)); jp.setDividerLocation( MatrixPanel.this.getHeight()-optionsPanel.getPreferredSize().height-10 ); } }); optionsPanel.setMinimumSize( new Dimension(0,0) ); jp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, m_js, optionsPanel); jp.setOneTouchExpandable(true); jp.setResizeWeight(1); this.setLayout( new BorderLayout() ); this.add(jp, BorderLayout.CENTER); /** Setting up the initial color list **/ for(int i=0; i<m_defaultColors.length-1; i++) m_colorList.addElement(m_defaultColors[i]); /** Initializing internal fields and components **/ m_selectedAttribs = m_attribList.getSelectedIndices(); m_plotsPanel = new Plot(); m_plotsPanel.setLayout(null); m_js.getHorizontalScrollBar().setUnitIncrement( 10 ); m_js.getVerticalScrollBar().setUnitIncrement( 10 ); m_js.setViewportView( m_plotsPanel ); m_js.setColumnHeaderView( m_plotsPanel.getColHeader() ); m_js.setRowHeaderView( m_plotsPanel.getRowHeader() ); final JLabel lb = new JLabel(" Plot Matrix"); lb.setFont(f); lb.setForeground(fontColor); lb.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); m_js.setCorner(JScrollPane.UPPER_LEFT_CORNER, lb); m_cp.setInstances(m_data); m_cp.setBorder(BorderFactory.createEmptyBorder(15,10,10,10)); m_cp.addRepaintNotify(m_plotsPanel); //m_updateBt.doClick(); //not until setting up the instances } /** Initializes internal data fields, i.e. data values, type, missing and color cache arrays */ public void initInternalFields() { Instances inst = m_data; m_classIndex = m_classAttrib.getSelectedIndex(); m_selectedAttribs = m_attribList.getSelectedIndices(); double minC=0, maxC=0; /** Resampling **/ if(Double.parseDouble(m_resamplePercent.getText())<100) { inst = new Instances(m_data, 0, m_data.numInstances()); inst.randomize( new Random(Integer.parseInt(m_rseed.getText())) ); //System.err.println("gettingPercent: " + // Math.round( // Double.parseDouble(m_resamplePercent.getText()) // / 100D * m_data.numInstances() // ) // ); inst = new Instances(inst, 0, (int)Math.round(Double.parseDouble(m_resamplePercent.getText()) / 100D*inst.numInstances()) ); } m_points = new int[inst.numInstances()][m_selectedAttribs.length]; //changed m_pointColors = new int[inst.numInstances()]; m_missing = new boolean[inst.numInstances()][m_selectedAttribs.length+1]; //changed m_type = new int[2]; //[m_selectedAttribs.length]; //changed jitterVals = new int[inst.numInstances()][2]; /** Setting up the color list for non-numeric attribute as well as jittervals**/ if(!(inst.attribute(m_classIndex).isNumeric())) { for(int i=m_colorList.size(); i<inst.attribute(m_classIndex).numValues()+1; i++) { Color pc = m_defaultColors[i % 10]; int ija = i / 10; ija *= 2; for (int j=0;j<ija;j++) { pc = pc.darker(); } m_colorList.addElement(pc); } for(int i=0; i<inst.numInstances(); i++) { //set to black for missing class value which is last colour is default list if(inst.instance(i).isMissing(m_classIndex)) m_pointColors[i] = m_defaultColors.length-1; else m_pointColors[i] = (int) inst.instance(i).value(m_classIndex); jitterVals[i][0] = rnd.nextInt(m_jitter.getValue()+1) - m_jitter.getValue()/2; jitterVals[i][1] = rnd.nextInt(m_jitter.getValue()+1) - m_jitter.getValue()/2; } } /** Setting up color variations for numeric attribute as well as jittervals **/ else { for(int i=0; i<inst.numInstances(); i++) { if(!(inst.instance(i).isMissing(m_classIndex))) { minC = maxC = inst.instance(i).value(m_classIndex); break; } } for(int i=1; i<inst.numInstances(); i++) { if(!(inst.instance(i).isMissing(m_classIndex))) { if(minC > inst.instance(i).value(m_classIndex)) minC = inst.instance(i).value(m_classIndex); if(maxC < inst.instance(i).value(m_classIndex)) maxC = inst.instance(i).value(m_classIndex); } } for(int i=0; i<inst.numInstances(); i++) { double r = (inst.instance(i).value(m_classIndex) - minC) / (maxC - minC); r = (r * 240) + 15; m_pointColors[i] = (int)r; jitterVals[i][0] = rnd.nextInt(m_jitter.getValue()+1) - m_jitter.getValue()/2; jitterVals[i][1] = rnd.nextInt(m_jitter.getValue()+1) - m_jitter.getValue()/2; } } /** Creating local cache of the data values **/ double min[]=new double[m_selectedAttribs.length], max=0; //changed double ratio[] = new double[m_selectedAttribs.length]; //changed double cellSize = m_plotSize.getValue(), temp1=0, temp2=0; for(int j=0; j<m_selectedAttribs.length; j++) { int i; for(i=0; i<inst.numInstances(); i++) { min[j] = max = 0; if(!(inst.instance(i).isMissing(m_selectedAttribs[j]))) { min[j] = max = inst.instance(i).value(m_selectedAttribs[j]); break; } } for( i=i; i<inst.numInstances(); i++ ) { if(!(inst.instance(i).isMissing(m_selectedAttribs[j]))) { if(inst.instance(i).value(m_selectedAttribs[j]) < min[j]) min[j] = inst.instance(i).value(m_selectedAttribs[j]); if(inst.instance(i).value(m_selectedAttribs[j]) > max) max = inst.instance(i).value(m_selectedAttribs[j]); } } ratio[j] = cellSize / (max - min[j]); } boolean classIndexProcessed=false; for(int j=0; j<m_selectedAttribs.length; j++) { if(inst.attribute(m_selectedAttribs[j]).isNominal() || inst.attribute(m_selectedAttribs[j]).isString()) { //m_type[0][j] = 1; m_type[1][j] = inst.attribute(m_selectedAttribs[j]).numValues(); temp1 = cellSize/(double)inst.attribute(m_selectedAttribs[j]).numValues(); //m_type[1][j]; temp2 = temp1/2; for(int i=0; i<inst.numInstances(); i++) { m_points[i][j] = (int) Math.round(temp2+temp1*inst.instance(i).value(m_selectedAttribs[j])); if(inst.instance(i).isMissing(m_selectedAttribs[j])) { m_missing[i][j] = true; //represents missing value if(m_selectedAttribs[j]==m_classIndex) { m_missing[i][m_missing[0].length-1] = true; classIndexProcessed = true; } } } } else { //m_type[0][j] = m_type[1][j] = 0; for(int i=0; i<inst.numInstances(); i++) { m_points[i][j] = (int) Math.round((inst.instance(i).value(m_selectedAttribs[j]) -min[j])*ratio[j]); if(inst.instance(i).isMissing(m_selectedAttribs[j])) { m_missing[i][j] = true; //represents missing value if(m_selectedAttribs[j]==m_classIndex) { m_missing[i][m_missing[0].length-1] = true; classIndexProcessed = true; } } } } } if(inst.attribute(m_classIndex).isNominal() || inst.attribute(m_classIndex).isString()) { m_type[0] = 1; m_type[1] = inst.attribute(m_classIndex).numValues(); } else m_type[0] = m_type[1] = 0; if(classIndexProcessed==false) { //class Index has not been processed as class index is not among the selected attribs for(int i=0; i<inst.numInstances(); i++) { if(inst.instance(i).isMissing(m_classIndex)) m_missing[i][m_missing[0].length-1] = true; } } m_cp.setColours(m_colorList); } /** Sets up the UI's attributes lists */ public void setupAttribLists() { String [] tempAttribNames = new String[m_data.numAttributes()]; String type; m_classAttrib.removeAllItems(); for(int i=0; i<tempAttribNames.length; i++) { switch (m_data.attribute(i).type()) { case Attribute.NOMINAL: type = " (Nom)"; break; case Attribute.NUMERIC: type = " (Num)"; break; case Attribute.STRING: type = " (Str)"; break; case Attribute.DATE: type = " (Dat)"; break; case Attribute.RELATIONAL: type = " (Rel)"; break; default: type = " (???)"; } tempAttribNames[i] = new String("Colour: "+m_data.attribute(i).name()+" "+type); m_classAttrib.addItem(tempAttribNames[i]); } if (m_data.classIndex() == -1) m_classAttrib.setSelectedIndex(tempAttribNames.length - 1); else m_classAttrib.setSelectedIndex(m_data.classIndex()); m_attribList.setListData(tempAttribNames); m_attribList.setSelectionInterval(0, tempAttribNames.length-1); } /** Calculates the percentage to resample */ public void setPercent() { if(m_data.numInstances() > 700) { double percnt = 500D/m_data.numInstances()*100; percnt *= 100; percnt = Math.round(percnt); percnt /= 100; m_resamplePercent.setText(""+percnt); } else m_resamplePercent.setText("100"); } /** This method changes the Instances object of this class to a new one. It also does all the necessary initializations for displaying the panel. This must be called before trying to display the panel. @param newInst The new set of Instances */ public void setInstances(Instances newInst) { m_data = newInst; setPercent(); setupAttribLists(); m_rseed.setText("1"); initInternalFields(); m_cp.setInstances(m_data); m_cp.setCindex(m_classIndex); m_updateBt.doClick(); } /** Main method for testing this class */ public static void main(String [] args) { final JFrame jf = new JFrame("Weka Explorer: MatrixPanel"); final JButton setBt = new JButton("Set Instances"); Instances data = null; try { if(args.length==1) data = new Instances( new BufferedReader( new FileReader(args[0])) ); else { System.out.println("Usage: MatrixPanel <arff file>"); System.exit(-1); } } catch(IOException ex) { ex.printStackTrace(); System.exit(-1); } final MatrixPanel mp = new MatrixPanel(); mp.setInstances(data); setBt.addActionListener( new ActionListener() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -