📄 matrixpanel.java
字号:
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.setVisible(true);
}
});
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(Resource.srcStr("m_pointSizeLb")+": [1]");
m_pointSizeLb.setPreferredSize( m_pointLBSizeD );
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_plotSizeLb, gbc);
gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER;
p4.add(m_plotSize, gbc);
gbc.weightx=0; gbc.gridwidth = gbc.RELATIVE;
p4.add(m_pointSizeLb, gbc);
gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER;
p4.add(m_pointSize, gbc);
gbc.weightx=0; gbc.gridwidth = gbc.RELATIVE;
p4.add( new JLabel(Resource.srcStr("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(Resource.srcStr("Classcolour")));
p2.add(m_cp, BorderLayout.SOUTH);
gbc.insets = new Insets(8,5,2,5);
gbc.anchor = gbc.SOUTHWEST; 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_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(Resource.srcStr("lb"));
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) {
try {
if(m_data.attribute(m_classIndex).isNominal() ) {
inst = new Instances(m_data); // To save class index
inst.setClassIndex(m_classIndex);
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(inst);
inst = weka.filters.Filter.useFilter(inst, 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()][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;
default:
type = " (???)";
}
tempAttribNames[i] = new String(Resource.srcStr("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;
setPercent();
setupAttribLists();
m_rseed.setText("1");
origDist.setSelected(true);
initInternalFields();
m_cp.setInstances(m_data);
m_cp.setCindex(m_classIndex);
m_updateBt.doClick();
}
public void setDividerLocation(int location)
{
jp.setDividerLocation(location);
}
/**
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(Resource.srcStr("setBt"));
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>");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -