📄 classpanel.java
字号:
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 Knowledge 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 + -