📄 matrixpanel.java
字号:
gbc.gridwidth = gbc.RELATIVE; p1.add(rseedLb, gbc); gbc.weightx = 0; gbc.gridwidth = gbc.REMAINDER; gbc.weightx=1; p1.add(rseedTxt, gbc); gbc.insets = new Insets(8,2,0,2); gbc.weightx=0; p1.add(percentLb, gbc); gbc.insets = new Insets(0,2,2,2); gbc.gridwidth = gbc.RELATIVE; p1.add(percent2Lb, gbc); gbc.gridwidth = gbc.REMAINDER; gbc.weightx=1; p1.add(percentTxt, gbc); gbc.insets = new Insets(8,2,2,2); if(m_data.attribute(m_classAttrib.getSelectedIndex()).isNominal()) { JPanel p2 = new JPanel( gbl ); p2.add(origDist, gbc); p2.add(unifDist, gbc); p2.setBorder( BorderFactory.createTitledBorder("Class Distribution") ); p1.add(p2, gbc); } JPanel p3 = new JPanel( gbl ); gbc.fill = gbc.HORIZONTAL; gbc.gridwidth = gbc.REMAINDER; gbc.weightx = 1; gbc.weighty = 0; p3.add(p1, gbc); gbc.insets = new Insets(8,4,8,4); p3.add(doneBt, gbc); jd.getContentPane().setLayout( new BorderLayout() ); jd.getContentPane().add(p3, BorderLayout.NORTH); jd.pack(); jd.setLocation( m_resampleBt.getLocationOnScreen().x, m_resampleBt.getLocationOnScreen().y-jd.getHeight() ); jd.show(); } }); 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_sizeD = m_sizeLb.getPreferredSize(); m_resampleBt.setPreferredSize( m_selAttrib.getPreferredSize() ); gbc.fill = gbc.HORIZONTAL; gbc.anchor = gbc.NORTHWEST; gbc.insets = new Insets(2,2,2,2); p4.add(m_sizeLb, gbc); gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER; p4.add(m_cellSize, gbc); gbc.weightx=0; gbc.gridwidth = gbc.RELATIVE; p4.add( new JLabel("Jitter: "), gbc); gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER; p4.add(m_jitter, gbc); p4.add(m_classAttrib, gbc); gbc.gridwidth = gbc.REMAINDER; gbc.weightx=1; gbc.fill = gbc.NONE; p3.add(m_updateBt, gbc); p3.add(m_selAttrib, gbc); gbc.gridwidth = gbc.RELATIVE; gbc.weightx = 0; gbc.fill = gbc.VERTICAL; gbc.anchor = gbc.WEST; p3.add(m_resampleBt, gbc); gbc.gridwidth = gbc.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 = gbc.NORTHWEST; gbc.fill = gbc.HORIZONTAL; gbc.weightx=1; gbc.gridwidth = gbc.RELATIVE; optionsPanel.add(p4, gbc); gbc.gridwidth = gbc.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_plotsPanel = new Plot(); m_plotsPanel.setLayout(null); m_plotsPanel.setFont( new java.awt.Font("Dialog", java.awt.Font.BOLD, 11) ); m_js.getHorizontalScrollBar().setUnitIncrement( 10 ); m_js.getVerticalScrollBar().setUnitIncrement( 10 ); m_js.setViewportView( m_plotsPanel ); 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(); double minC=0, maxC=0; m_data.setClassIndex(m_classIndex); /** Resampling **/ if(Double.parseDouble(m_resamplePercent.getText())<100) { try { if( m_data.attribute(m_classIndex).isNominal() ) { weka.filters.supervised.instance.Resample r = new weka.filters.supervised.instance.Resample(); r.setRandomSeed( Integer.parseInt(m_rseed.getText()) ); r.setSampleSizePercent( Double.parseDouble(m_resamplePercent.getText()) ); if(origDist.isSelected()) r.setBiasToUniformClass(0); else r.setBiasToUniformClass(1); r.setInputFormat(m_data); inst = weka.filters.Filter.useFilter(m_data, r); } else { weka.filters.unsupervised.instance.Resample r = new weka.filters.unsupervised.instance.Resample(); r.setRandomSeed( Integer.parseInt(m_rseed.getText()) ); r.setSampleSizePercent( Double.parseDouble(m_resamplePercent.getText()) ); r.setInputFormat(m_data); inst = weka.filters.Filter.useFilter(m_data, r); } } catch(Exception ex) { System.out.println("Error occurred while sampling"); ex.printStackTrace(); } } m_points = new int[inst.numInstances()][inst.numAttributes()]; m_pointColors = new int[inst.numInstances()]; m_missing = new boolean[inst.numInstances()][inst.numAttributes()]; m_type = new int[2][inst.numAttributes()]; 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[inst.numAttributes()], max=0; double ratio[] = new double[inst.numAttributes()]; double cellSize = m_cellSize.getValue(), temp1=0, temp2=0; for(int j=0; j<inst.numAttributes(); j++) { int i; for(i=0; i<inst.numInstances(); i++) { min[j] = max = 0; if(!(inst.instance(i).isMissing(j))) { min[j] = max = inst.instance(i).value(j); break; } } for( i=i; i<inst.numInstances(); i++ ) { if(!(inst.instance(i).isMissing(j))) { if(inst.instance(i).value(j) < min[j]) min[j] = inst.instance(i).value(j); if(inst.instance(i).value(j) > max) max = inst.instance(i).value(j); } } ratio[j] = cellSize / (max - min[j]); } for(int j=0; j<inst.numAttributes(); j++) { if(inst.attribute(j).isNominal() || inst.attribute(j).isString()) { m_type[0][j] = 1; m_type[1][j] = inst.attribute(j).numValues(); temp1 = cellSize/(double)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(j)); if(inst.instance(i).isMissing(j)) m_missing[i][j] = true; //represents missing value } } 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(j) -min[j])*ratio[j]); if(inst.instance(i).isMissing(j)) m_missing[i][j] = true; //represents missing value } } } 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; default: type = " (???)"; } tempAttribNames[i] = new String("Colour: "+m_data.attribute(i).name()+" "+type); m_classAttrib.addItem(tempAttribNames[i]); } m_classAttrib.setSelectedIndex( tempAttribNames.length-1 ); m_attribList.setListData(tempAttribNames); m_attribList.setSelectionInterval(0, tempAttribNames.length-1); } /** Calculates the percentage to resample */ public void setPercent() { if(m_data.numInstances() > 700) { String percnt = Double.toString(500D/m_data.numInstances()*100); if( percnt.indexOf('.')+3 < percnt.length() ) { m_resamplePercent.setText(percnt.substring(0, percnt.indexOf('.')-1)+ percnt.substring(percnt.indexOf('.'), percnt.indexOf('.')+3) ); } else 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -