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

📄 attributevisualizationpanel.java

📁 Java 编写的多种数据挖掘算法 包括聚类、分类、预处理等
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                y = y-Math.round(m_histBarClassCounts[i][j]*heightRatio);                //selecting the colour corresponding to the current class.                g.setColor( (Color)m_colorList.elementAt(j) );                g.fillRect(x, y, barWidth,                            Math.round(m_histBarClassCounts[i][j]*heightRatio));                g.setColor(Color.black);              }              //drawing the bar count at the top of the bar if it is less than              //interval width. draw it 1px up to avoid touching the bar.              if(m_fm.stringWidth(Integer.toString(sum))<intervalWidth)                g.drawString(Integer.toString(sum), x, y-1);              //advancing x to the next bar by adding bar width and padding              //of both the bars (i.e. RHS padding of the bar just drawn and LHS              //padding of the new bar).              x = x+barWidth+(int)( (Math.floor(intervalWidth*0.2F))<1 ?                                      1:(Math.floor(intervalWidth*0.2F)) );              //reseting sum for the next bar.              sum=0;            }                        }          //else if class attribute is numeric or not set then draw black bars.          else {            intervalWidth =  (this.getWidth()/(float)m_histBarCounts.length);                        //same as in the case of nominal class (see inside of if stmt             //corresponding to the current else above).            if(intervalWidth>5)              barWidth = (int)Math.floor(intervalWidth*0.8F);            else              barWidth = 1;                        //same as in the case of nominal class (see inside of if stmt             //corresponding to the current else above).            x = x + (int)( (Math.floor(intervalWidth*0.1F))<1 ?                            1:(Math.floor(intervalWidth*0.1F)) );                        //same as in the case of nominal class            if( this.getWidth() - (m_histBarCounts.length*barWidth+                                  (int)( (Math.floor(intervalWidth*0.2F))<1 ?                                          1:(Math.floor(intervalWidth*0.2F)) ) *                                   m_histBarCounts.length) > 2 ) {              x += (this.getWidth() -(m_histBarCounts.length*barWidth +                                      (int)((Math.floor(intervalWidth*0.2F))<1 ?                                            1:(Math.floor(intervalWidth*0.2F)))*                                     m_histBarCounts.length))/2;            }                        for(int i=0; i<m_histBarCounts.length; i++) {              //calculating the proportion of the height of the component               //compared to the maxValue in our attribute.              heightRatio = (this.getHeight()-(float)m_fm.getHeight() -                              buttonHeight) / m_maxValue;              y = this.getHeight()-Math.round(m_histBarCounts[i]*heightRatio);              g.fillRect(x, y, barWidth,                          Math.round(m_histBarCounts[i]*heightRatio));              //draw the bar count if it's width is smaller than intervalWidth.              //draw it 1px above to avoid touching the bar.              if(m_fm.stringWidth(Integer.toString(m_histBarCounts[i])) <                                     intervalWidth)                g.drawString(Integer.toString(m_histBarCounts[i]), x, y-1);              //Advance x to the next bar by adding bar-width and padding              //of the bars (RHS padding of current bar & LHS padding of next               //bar).              x = x+barWidth+(int)( (Math.floor(intervalWidth*0.2F))<1 ?                                      1:(Math.floor(intervalWidth*0.2F)) );            }          }                  } //<--end if m_as.nominalCount!=null        //if the current attribute is numeric then draw a histogram.        else if(m_as.numericStats != null &&                 (m_histBarClassCounts!=null || m_histBarCounts!=null)) {          float heightRatio, intervalWidth;          int x=0, y=0,  barWidth;                    //If the class attribute is set and is not numeric then draw coloured           //subbars for the histogram bars          if((m_classIndex >=0) &&              (m_data.attribute(m_classIndex).isNominal())) {                        //There is a padding of 3px on each side of the histogram.            barWidth = ((this.getWidth()-6)/m_histBarClassCounts.length)<1 ?                        1 : ((this.getWidth()-6)/m_histBarClassCounts.length);                        //initializing x to start at the start of the 1st bar after padding.            x = 3;            //Adding appropriate value to x to account for a "centered"             //histogram            if( (this.getWidth() -                 (x + m_histBarClassCounts.length*barWidth)) > 5 ) {              //We take the current value of x (histogram's RHS padding) and add              //the barWidths of all the bars to it to us the size of               //our histogram. We subtract that from the width of the panel               //giving us the extra space that would be left if the histogram is              //drawn and divide that by 2 to get the midpoint of that extra              //space. That space is then added to our x, hence making the               //histogram centered.              x += ( this.getWidth() -                     (x + m_histBarClassCounts.length*barWidth) ) / 2;            }                        for(int i=0; i<m_histBarClassCounts.length; i++) {              //Calculating height ratio. Leave space of 19 for an axis line at               //the bottom              heightRatio = (this.getHeight()-(float)m_fm.getHeight() -                              buttonHeight-19) / m_maxValue;              y = this.getHeight()-19;              //This would hold the count of the bar (sum of sub-bars).              int sum = 0;              for(int j=0; j<m_histBarClassCounts[i].length; j++) {                y = y-Math.round(m_histBarClassCounts[i][j]*heightRatio);                //System.out.println("Filling x:"+x+" y:"+y+" width:"+barWidth+                //                   " height:"+                //                   (m_histBarClassCounts[i][j]*heightRatio));                //selecting the color corresponding to our class                g.setColor( (Color)m_colorList.elementAt(j) );                //drawing the bar if its width is greater than 1                if(barWidth>1)                  g.fillRect(x, y,                              barWidth,                              Math.round(m_histBarClassCounts[i][j]*heightRatio));                //otherwise drawing a line                else if((m_histBarClassCounts[i][j]*heightRatio)>0)                  g.drawLine(x, y, x,                           y+Math.round(m_histBarClassCounts[i][j]*heightRatio));                g.setColor(Color.black);                sum = sum + m_histBarClassCounts[i][j];              }              //Drawing bar count on the top of the bar if it is < barWidth              if(m_fm.stringWidth(" "+Integer.toString(sum))<barWidth)                g.drawString(" "+Integer.toString(sum), x, y-1);              //Moving x to the next bar              x = x+barWidth;            }                        //Now drawing the axis line at the bottom of the histogram            //initializing x again to the start of the plot            x = 3;            if( (this.getWidth() -                 (x + m_histBarClassCounts.length*barWidth)) > 5 )              x += (this.getWidth() -                    (x + m_histBarClassCounts.length*barWidth))/2;                        g.drawLine(x, this.getHeight()-17,                       (barWidth==1)?x+barWidth*m_histBarClassCounts.length-1 :                                      x+barWidth*m_histBarClassCounts.length,                       this.getHeight()-17); //axis line -- see footnote 2.            g.drawLine(x, this.getHeight()-16,                        x, this.getHeight()-12); //minimum line            g.drawString(Utils.doubleToString(m_as.numericStats.min, 2),                         x,                         this.getHeight()-12+m_fm.getHeight()); //minimum value            g.drawLine(x+(barWidth*m_histBarClassCounts.length)/2,                       this.getHeight()-16,                       x+(barWidth*m_histBarClassCounts.length)/2,                       this.getHeight()-12); //median line            //Drawing median value. X position for drawing the value is: from             //start of the plot take the mid point and subtract from it half            //of the width of the value to draw.            g.drawString(Utils.doubleToString(m_as.numericStats.max/2+m_as.numericStats.min/2, 2),                         x+(barWidth*m_histBarClassCounts.length)/2 -                            m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max/2+m_as.numericStats.min/2, 2))/2,                         this.getHeight()-12+m_fm.getHeight()); //median value            g.drawLine((barWidth==1) ? x+barWidth*m_histBarClassCounts.length-1:                                       x+barWidth*m_histBarClassCounts.length,                       this.getHeight()-16,                       (barWidth==1) ? x+barWidth*m_histBarClassCounts.length-1:                                       x+barWidth*m_histBarClassCounts.length,                       this.getHeight()-12); //maximum line            g.drawString(Utils.doubleToString(m_as.numericStats.max, 2),                         (barWidth==1) ?              x+barWidth*m_histBarClassCounts.length-m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max, 2))-1:              x+barWidth*m_histBarClassCounts.length-m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max, 2)),              this.getHeight()-12+m_fm.getHeight()); //maximum value -- see 2.          }          else {  //if class attribute is numeric            //There is a padding of 3px on each side of the histogram.            barWidth = ((this.getWidth()-6)/m_histBarCounts.length) < 1 ?                         1:((this.getWidth()-6)/m_histBarCounts.length);            //Same as above. Pls inside of the if stmt.            x = 3;            if( (this.getWidth() - (x + m_histBarCounts.length*barWidth)) > 5 )              x += (this.getWidth() - (x + m_histBarCounts.length*barWidth))/2;                        //Same as above            for(int i=0; i<m_histBarCounts.length; i++) {              //calculating the ration of the component's height compared to               //the maxValue in our current attribute. Leaving 19 pixels to              //draw the axis at the bottom of the histogram.              heightRatio = (this.getHeight()-(float)m_fm.getHeight() -                              buttonHeight-19) / m_maxValue;              y = this.getHeight() -                   Math.round(m_histBarCounts[i]*heightRatio)-19;              //System.out.println("Filling x:"+x+" y:"+y+" width:"+barWidth+              //                   " height:"+(m_histBarCounts[i]*heightRatio));              //same as in the if stmt above              if(barWidth>1)                g.drawRect(x, y, barWidth,                            Math.round(m_histBarCounts[i]*heightRatio));              else if((m_histBarCounts[i]*heightRatio)>0)                g.drawLine(x, y,                            x, y+Math.round(m_histBarCounts[i]*heightRatio));              if(m_fm.stringWidth(" "+Integer.toString(m_histBarCounts[i])) <                     barWidth)                g.drawString(" "+Integer.toString(m_histBarCounts[i]), x, y-1);                            x = x+barWidth;            }                        //Now drawing the axis at the bottom of the histogram            x = 3;            if( (this.getWidth() - (x + m_histBarCounts.length*barWidth)) > 5 )              x += (this.getWidth() - (x + m_histBarCounts.length*barWidth))/2;                        //This is exact the same as in the if stmt above. See the inside of            //the stmt for details            g.drawLine(x, this.getHeight()-17,                       (barWidth==1) ? x+barWidth*m_histBarCounts.length-1 :                                        x+barWidth*m_histBarCounts.length,                       this.getHeight()-17); //axis line            g.drawLine(x, this.getHeight()-16,                        x, this.getHeight()-12); //minimum line            g.drawString(Utils.doubleToString(m_as.numericStats.min, 2),                         x,                         this.getHeight()-12+m_fm.getHeight()); //minimum value            g.drawLine(x+(barWidth*m_histBarCounts.length)/2,                       this.getHeight()-16,                       x+(barWidth*m_histBarCounts.length)/2,                       this.getHeight()-12); //median line            g.drawString(Utils.doubleToString(m_as.numericStats.max/2+m_as.numericStats.min/2, 2),                         x+(barWidth*m_histBarCounts.length)/2 -                            m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max/2+m_as.numericStats.min/2, 2))/2,                         this.getHeight()-12+m_fm.getHeight()); //median value            g.drawLine((barWidth==1) ? x+barWidth*m_histBarCounts.length-1 :                                         x+barWidth*m_histBarCounts.length,                       this.getHeight()-16,                       (barWidth==1) ? x+barWidth*m_histBarCounts.length-1 :                                        x+barWidth*m_histBarCounts.length,                       this.getHeight()-12); //maximum line            g.drawString(Utils.doubleToString(m_as.numericStats.max, 2),                         (barWidth==1) ?               x+barWidth*m_histBarCounts.length-m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max, 2))-1 :               x+barWidth*m_histBarCounts.length-m_fm.stringWidth(Utils.doubleToString(m_as.numericStats.max, 2)),              this.getHeight()-12+m_fm.getHeight()); //maximum value          }          //System.out.println("barWidth:"+barWidth+          //                   " histBarCount:"+m_histBarCounts.length);                  } else {          g.clearRect(0, 0, this.getWidth(), this.getHeight());          g.drawString("Attribute is neither numeric nor nominal.",          this.getWidth()/2 - m_fm.          stringWidth("Attribute is neither numeric nor nominal.")/2,          this.getHeight()/2-m_fm.getHeight()/2);        }      } //<--end if of calculation thread      else {   //if still calculation thread is running plot        g.clearRect(0, 0, this.getWidth(), this.getHeight());        g.drawString("Calculating. Please Wait...",        this.getWidth()/2 - m_fm.stringWidth("Calculating. Please Wait...")/2,        this.getHeight()/2-m_fm.getHeight()/2);      }    } //<--end if(m_as==null) this means   }      /**   * Main method to test this class from command line   *   * @param args The arff file and the index of the attribute to use   */  public static void main(String [] args) {    if(args.length!=3) {      final JFrame jf = new JFrame("AttribVisualization");      AttributeVisualizationPanel ap = new AttributeVisualizationPanel();      try {        Instances ins = new Instances( new FileReader(args[0]) );        ap.setInstances(ins);        System.out.println("Loaded: "+args[0]+                           "\nRelation: "+ap.m_data.relationName()+                           "\nAttributes: "+ap.m_data.numAttributes());        ap.setAttribute( Integer.parseInt(args[1]) );      }      catch(Exception ex) { ex.printStackTrace(); System.exit(-1); }      System.out.println("The attributes are: ");      for(int i=0; i<ap.m_data.numAttributes(); i++)        System.out.println(ap.m_data.attribute(i).name());            jf.setSize(500, 300);      jf.getContentPane().setLayout( new BorderLayout() );      jf.getContentPane().add(ap, BorderLayout.CENTER );      jf.setDefaultCloseOperation( jf.EXIT_ON_CLOSE );      jf.setVisible(true);    }    else      System.out.println("Usage: java AttributeVisualizationPanel"+                         " [arff file] [index of attribute]");  }}/* * t =(int) Math.ceil((float)( *              (m_data.instance(k).value(m_attribIndex)-m_as.numericStats.min) *                           / barRange)); * 1.  * This equation gives a value between (i-1)+smallfraction and i if the  * attribute m_attribIndex for the current instances lies in the ith * interval. We then increment the value of our i-1th field of our  * histogram/barplot array.  * If, for example, barRange=3 then, apart from the 1st  * interval, each interval i has values in the range  * (minValue+3*i-1, minValue+3*i]. The 1st interval has range  * [minValue, minValue+i]. Hence it can be seen in the code we specifically  * handle t=0 separately. * *//** * (barWidth==1)?x+barWidth*m_histBarClassCounts.length-1 :  *                                    x+barWidth*m_histBarClassCounts.length * 2.  * In the case barWidth==1 we subtract 1 otherwise the line become one pixel * longer than the actual size of the histogram */

⌨️ 快捷键说明

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