⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classpanel.java

📁 MacroWeka扩展了著名数据挖掘工具weka
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
       m_precisionC = 1;
     }
    
     maxStringC = Utils.doubleToString(m_minC,
				       nondecimal+1+m_precisionC
				       ,m_precisionC);
     if (m_labelMetrics != null) {
       if (m_labelMetrics.stringWidth(maxStringC) > m_HorizontalPad) {
	 m_HorizontalPad = m_labelMetrics.stringWidth(maxStringC);
       }
     }

    setOn(true);
    this.repaint();
  }
    
  /**
   * Renders the legend for a nominal colouring attribute
   * @param gx the graphics context
   */
  protected void paintNominal(Graphics gx) {
    setFonts(gx);



    int numClasses;

    numClasses = m_Instances.attribute(m_cIndex).numValues();

    int maxLabelLen = 0;
    int idx=0;
    int legendHeight;
    int w = this.getWidth();
    int hf = m_labelMetrics.getAscent();


    for (int i=0;i<numClasses;i++) {
      if (m_Instances.attribute(m_cIndex).value(i).length() > 
	  maxLabelLen) {
	maxLabelLen = m_Instances.
	  attribute(m_cIndex).value(i).length();
	idx = i;
      }
    }
      
    maxLabelLen = m_labelMetrics.stringWidth(m_Instances.
					     attribute(m_cIndex).value(idx));
    

    if (((w-(2*m_HorizontalPad))/(maxLabelLen+5)) >= numClasses) {
      legendHeight = 1;
    } else {
      legendHeight = 2;
    }
	
    int x = m_HorizontalPad;
    int y = 1 + hf;

    // do the first row
    int ci, mp;
    Color pc;
    int numToDo = ((legendHeight==1) ? numClasses : (numClasses/2));
    for (int i=0;i<numToDo;i++) {
     
      gx.setColor((Color)m_colorList.elementAt(i));
      // can we fit the full label or will each need to be trimmed?
      if ((numToDo * maxLabelLen) > (w-(m_HorizontalPad*2))) {
	String val;
	val = m_Instances.attribute(m_cIndex).value(i);

	int sw = m_labelMetrics.stringWidth(val);
	int rm=0;
	// truncate string if necessary
	if (sw > ((w-(m_HorizontalPad*2)) / (numToDo))) {
	  int incr = (sw / val.length());
	  rm = (sw -  ((w-(m_HorizontalPad*2)) / numToDo)) / incr;
	  if (rm <= 0) {
	    rm = 0;
	  }
	  val = val.substring(0,val.length()-rm);
	  sw = m_labelMetrics.stringWidth(val);
	}
	NomLabel jj = new NomLabel(val, i);
	jj.setFont(gx.getFont());

	jj.setSize(m_labelMetrics.stringWidth(jj.getText()),
		   m_labelMetrics.getAscent() + 4);
	this.add(jj);
	jj.setLocation(x, y);
	jj.setForeground((Color)m_colorList.
			 elementAt(i % m_colorList.size()));

	x += sw + 2;
      } else {
	
	NomLabel jj;
	jj = new NomLabel(m_Instances.attribute(m_cIndex).value(i), i);

	jj.setFont(gx.getFont());

	jj.setSize(m_labelMetrics.stringWidth(jj.getText()),
		   m_labelMetrics.getAscent() + 4);
	this.add(jj);
	jj.setLocation(x, y);
	jj.setForeground((Color)m_colorList.
			 elementAt(i % m_colorList.size()));

  

	x += ((w-(m_HorizontalPad*2)) / numToDo);
      }	  
    }

    x = m_HorizontalPad;
    y = 1+ hf + 5 +hf;
    for (int i=numToDo;i<numClasses;i++) {
      
      gx.setColor((Color)m_colorList.elementAt(i));
      if (((numClasses-numToDo+1) * maxLabelLen) > 
	  (w - (m_HorizontalPad*2))) {
	String val;
	val = m_Instances.attribute(m_cIndex).value(i);

	int sw = m_labelMetrics.stringWidth(val);
	int rm=0;
	// truncate string if necessary
	if (sw > ((w-(m_HorizontalPad*2)) / (numClasses-numToDo+1))) {
	  int incr = (sw / val.length());
	  rm = (sw -  ((w-(m_HorizontalPad*2)) / (numClasses-numToDo))) 
	    / incr;
	  if (rm <= 0) {
	    rm = 0;
	  }
	  val = val.substring(0,val.length()-rm);
	  sw = m_labelMetrics.stringWidth(val);
	}
	//this is the clipped string
	NomLabel jj = new NomLabel(val, i);
	jj.setFont(gx.getFont());

	jj.setSize(m_labelMetrics.stringWidth(jj.getText()),
		   m_labelMetrics.getAscent() + 4);

	this.add(jj);
	jj.setLocation(x, y);
	jj.setForeground((Color)m_colorList.
			 elementAt(i % m_colorList.size()));
	
	x += sw +2;
      } else {
	//this is the full string
	NomLabel jj;
	jj = new NomLabel(m_Instances.attribute(m_cIndex).value(i), i);

	jj.setFont(gx.getFont());

	jj.setSize(m_labelMetrics.stringWidth(jj.getText()),
		   m_labelMetrics.getAscent() + 4);
	this.add(jj);
	jj.setLocation(x, y);
	jj.setForeground((Color)m_colorList.
			 elementAt(i % m_colorList.size()));

	x += ((w - (m_HorizontalPad*2)) / (numClasses-numToDo));
      }	  
    }

  }

  /**
   * Renders the legend for a numeric colouring attribute
   * @param gx the graphics context
   */
  protected void paintNumeric(Graphics gx) {

    setFonts(gx);
    if (m_HorizontalPad == 0) {
      setCindex(m_cIndex);
    }

    int w = this.getWidth();
    double rs = 15;
    double incr = 240.0 / (double)(w-(m_HorizontalPad*2));
    int hf = m_labelMetrics.getAscent();
      
    for (int i=m_HorizontalPad;i<
	   (w-m_HorizontalPad);i++) {
      Color c = new Color((int)rs,150,(int)(255-rs));
      gx.setColor(c);
      gx.drawLine(i,0,
		  i,0+m_spectrumHeight);
      rs += incr;
    }

    int whole = (int)Math.abs(m_maxC);
    double decimal = Math.abs(m_maxC) - whole;
    int nondecimal;
    nondecimal = (whole > 0) 
      ? (int)(Math.log(whole) / Math.log(10))
      : 1;
    
    m_precisionC = (decimal > 0) 
      ? (int)Math.abs(((Math.log(Math.abs(m_maxC)) / 
			Math.log(10))))+2
      : 1;
    if (m_precisionC > VisualizeUtils.MAX_PRECISION) {
      m_precisionC = 1;
    }

    String maxStringC = Utils.doubleToString(m_maxC,
					     nondecimal+1+m_precisionC
					     ,m_precisionC);

	
    int mswc = m_labelMetrics.stringWidth(maxStringC);
    int tmsc = mswc;
    if (w > (2 * tmsc)) {
      gx.setColor(Color.black);
      gx.drawLine(m_HorizontalPad,
		  (m_spectrumHeight+5),
		  w-m_HorizontalPad,
		  (m_spectrumHeight+5));

      gx.drawLine(w-m_HorizontalPad,
		  (m_spectrumHeight+5),
		  w-m_HorizontalPad,
		  (m_spectrumHeight+5+m_tickSize));

      gx.drawString(maxStringC, 
		    (w-m_HorizontalPad)-(mswc/2),
		    (m_spectrumHeight+5+m_tickSize+hf));

      gx.drawLine(m_HorizontalPad,
		  (m_spectrumHeight+5),
		  m_HorizontalPad,
		  (m_spectrumHeight+5+m_tickSize));

      whole = (int)Math.abs(m_minC);
      decimal = Math.abs(m_minC) - whole;
      nondecimal = (whole > 0) 
	? (int)(Math.log(whole) / Math.log(10))
	: 1;
      
      m_precisionC = (decimal > 0) 
	? (int)Math.abs(((Math.log(Math.abs(m_minC)) / 
			  Math.log(10))))+2
	: 1;

      if (m_precisionC > VisualizeUtils.MAX_PRECISION) {
	m_precisionC = 1;
      }
      
      maxStringC = Utils.doubleToString(m_minC,
					nondecimal+1+m_precisionC
					,m_precisionC);

      mswc = m_labelMetrics.stringWidth(maxStringC);
      gx.drawString(maxStringC, 
		    m_HorizontalPad-(mswc/2),
		    (m_spectrumHeight+5+m_tickSize+hf));

      // draw the middle value if there is space
      if (w > (3 * tmsc)) {
	double mid = m_minC+((m_maxC-m_minC)/2.0);
	gx.drawLine(m_HorizontalPad+((w-(2*m_HorizontalPad))/2),
		    (m_spectrumHeight+5),
		    m_HorizontalPad+((w-(2*m_HorizontalPad))/2),
		    (m_spectrumHeight+5+m_tickSize));

	whole = (int)Math.abs(mid);
	decimal = Math.abs(mid) - whole;
	nondecimal = (whole > 0) 
	  ? (int)(Math.log(whole) / Math.log(10))
	  : 1;
	
	m_precisionC = (decimal > 0) 
	  ? (int)Math.abs(((Math.log(Math.abs(mid)) / 
			    Math.log(10))))+2
	  : 1;
	if (m_precisionC > VisualizeUtils.MAX_PRECISION) {
	  m_precisionC = 1;
	}
	
	maxStringC = Utils.doubleToString(mid,
					  nondecimal+1+m_precisionC
					  ,m_precisionC);

	mswc = m_labelMetrics.stringWidth(maxStringC);
	gx.drawString(maxStringC,
		      m_HorizontalPad+((w-(2*m_HorizontalPad))/2)-(mswc/2),
		      (m_spectrumHeight+5+m_tickSize+hf));
      }
    }
  }

  /**
   * Renders this component
   * @param gx the graphics context
   */
  public void paintComponent(Graphics gx) {
    super.paintComponent(gx);
    if (m_isEnabled) {
      if (m_isNumeric) {
	m_oldWidth = -9000;   //done so that if change back to nom, it will
	//work
	this.removeAll();
	paintNumeric(gx);
      } else {
	if (m_Instances != null && 
	    m_Instances.numInstances() > 0 && 
	    m_Instances.numAttributes() > 0) {
	  if (m_oldWidth != this.getWidth()) {
	    this.removeAll();
	    m_oldWidth = this.getWidth();
	    paintNominal(gx);
	  }
	}
      }
    }
  }

  /**
   * Main method for testing this class.
   * @param args first argument must specify an arff file. Second can
   * specify an optional index to colour labels on
   */
  public static void main(String [] args) {
    try {
      if (args.length < 1) {
	System.err.println("Usage : weka.gui.visualize.ClassPanel <dataset> "
			   +"[class col]");
	System.exit(1);
      }
      final javax.swing.JFrame jf = 
	new javax.swing.JFrame("Weka Explorer: Class");
      jf.setSize(500,100);
      jf.getContentPane().setLayout(new BorderLayout());
      final ClassPanel p2 = new ClassPanel();
      jf.getContentPane().add(p2, BorderLayout.CENTER);
      jf.addWindowListener(new java.awt.event.WindowAdapter() {
	  public void windowClosing(java.awt.event.WindowEvent e) {
	    jf.dispose();
	    System.exit(0);
	  }
	});
	
      if (args.length >= 1) {
	System.err.println("Loading instances from " + args[0]);
	java.io.Reader r = new java.io.BufferedReader(
			   new java.io.FileReader(args[0]));
	Instances i = new Instances(r);
	i.setClassIndex(i.numAttributes()-1);
	p2.setInstances(i);
      }
      if (args.length > 1) {
	p2.setCindex((Integer.parseInt(args[1]))-1);
      } else {
	p2.setCindex(0);
      }
      jf.setVisible(true);
    } catch (Exception ex) {
      ex.printStackTrace();
      System.err.println(ex.getMessage());
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -