📄 attributevisualizationpanel.java
字号:
int sum=0;
for(int k=0; k<histBarClassCounts[0].length; k++)
sum += histBarClassCounts[0][k];
return ("<html><center><font face=Dialog size=-1>"
+sum+"<br>["
+Utils.doubleToString(bar+m_barRange*temp,3)+", "+Utils.doubleToString((bar+m_barRange*(temp+1)),3)
+"]</font></center></html>");
}
else if( temp < histBarClassCounts.length ) {
int sum=0;
for(int k=0; k<histBarClassCounts[temp].length; k++)
sum+=histBarClassCounts[temp][k];
return ("<html><center><font face=Dialog size=-1>"
+sum+"<br>("
+Utils.doubleToString(bar+m_barRange*temp,3)+", "+Utils.doubleToString((bar+m_barRange*(temp+1)),3)
+"]</font></center></html>");
}
}
}
else {
barWidth = ((this.getWidth()-6)/histBarCounts.length)<1 ? 1:((this.getWidth()-6)/histBarCounts.length);
x = 3;
if( (this.getWidth() - (x + histBarCounts.length*barWidth)) > 5 )
x += (this.getWidth() - (x + histBarCounts.length*barWidth))/2;
heightRatio = (this.getHeight()-(float)fm.getHeight())/maxValue;
if( ev.getX()-x >= 0) {
int temp = (int)((ev.getX()-x)/(barWidth+0.0000000001));
if(temp == 0)
return ("<html><center><font face=Dialog size=-1>"
+histBarCounts[0]+"<br>["
+Utils.doubleToString(bar+m_barRange*temp,3)+", "+Utils.doubleToString((bar+m_barRange*(temp+1)),3)
+"]</font></center></html>");
else if( temp < histBarCounts.length )
return ("<html><center><font face=Dialog size=-1>"
+histBarCounts[temp]+"<br>("
+Utils.doubleToString(bar+m_barRange*temp,3)+", "+Utils.doubleToString((bar+m_barRange*(temp+1)),3)
+"]</font></center></html>");
}
}
}
return "";
}
/**
* Paints this component
*
* @param g The graphics object for this component
*/
public void paintComponent(Graphics g) {
g.clearRect(0,0,this.getWidth(), this.getHeight());
if(as!=null) {
if(threadRun==false) {
int buttonHeight=0;
if(m_colorAttrib!=null)
buttonHeight = m_colorAttrib.getHeight()+m_colorAttrib.getLocation().y;
if(as.nominalCounts != null) {
float heightRatio, intervalWidth;
int x=0, y=0, barHeight, barWidth;
if((classIndex >= 0) && (m_data.attribute(classIndex).isNominal())) {
intervalWidth = (this.getWidth()/(float)histBarClassCounts.length);
if(intervalWidth>5)
barWidth = (int)Math.floor(intervalWidth*0.8F);
else
barWidth = 1;
x = x + (int)( (Math.floor(intervalWidth*0.1F))<1 ? 1:(Math.floor(intervalWidth*0.1F)) );
if( this.getWidth() -
(x + histBarClassCounts.length*barWidth
+(int)( (Math.floor(intervalWidth*0.2F))<1 ?
1:(Math.floor(intervalWidth*0.2F)) )*histBarClassCounts.length) > 5 )
x += (this.getWidth() -
(x + histBarClassCounts.length*barWidth +
(int)( (Math.floor(intervalWidth*0.2F))<1 ?
1:(Math.floor(intervalWidth*0.2F)) )*histBarClassCounts.length))/2;
int sum=0;
for(int i=0; i<histBarClassCounts.length; i++) {
heightRatio = (this.getHeight()-(float)fm.getHeight()-buttonHeight)/maxValue;
y=this.getHeight();
for(int j=0; j<histBarClassCounts[i].length; j++) {
sum = sum + histBarClassCounts[i][j];
y = y-Math.round(histBarClassCounts[i][j]*heightRatio);
g.setColor( (Color)m_colorList.elementAt(j) );
g.fillRect(x, y, barWidth, Math.round(histBarClassCounts[i][j]*heightRatio));
g.setColor(Color.black);
}
if(fm.stringWidth(Integer.toString(sum))<intervalWidth)
g.drawString(Integer.toString(sum), x, y-1);
x = x+barWidth+(int)( (Math.floor(intervalWidth*0.2F))<1 ? 1:(Math.floor(intervalWidth*0.2F)) );
sum=0;
}
}
else { //else if class attribute is numeric
intervalWidth = (this.getWidth()/(float)histBarCounts.length);
if(intervalWidth>5)
barWidth = (int)Math.floor(intervalWidth*0.8F);
else
barWidth = 1;
x = x + (int)( (Math.floor(intervalWidth*0.1F))<1 ? 1:(Math.floor(intervalWidth*0.1F)) );
if( this.getWidth() -
(x + histBarCounts.length*barWidth
+(int)( (Math.floor(intervalWidth*0.2F))<1 ? 1:(Math.floor(intervalWidth*0.2F)) )*histBarCounts.length) > 5 )
x += (this.getWidth() -
(x + histBarCounts.length*barWidth +
(int)( (Math.floor(intervalWidth*0.2F))<1 ? 1:(Math.floor(intervalWidth*0.2F)) )*histBarCounts.length))/2;
for(int i=0; i<histBarCounts.length; i++) {
heightRatio = (this.getHeight()-(float)fm.getHeight()-buttonHeight)/maxValue;
y = this.getHeight()-Math.round(histBarCounts[i]*heightRatio);
g.fillRect(x, y, barWidth, Math.round(histBarCounts[i]*heightRatio));
if(fm.stringWidth(Integer.toString(histBarCounts[i]))<intervalWidth)
g.drawString(Integer.toString(histBarCounts[i]), x, y-1);
x = x+barWidth+(int)( (Math.floor(intervalWidth*0.2F))<1 ? 1:(Math.floor(intervalWidth*0.2F)) );
}
}
}
//else {
//g.clearRect(0, 0, this.getWidth(), this.getHeight());
//g.drawString("Calculating. Please Wait...",
// this.getWidth()/2 - fm.stringWidth("Calculating. Please Wait...")/2,
// this.getHeight()/2-fm.getHeight()/2);
//}
//}
else if(as.numericStats != null) {
if(histBarClassCounts!=null || histBarCounts!=null) {
//threadRun==false && (histBarClassCounts!=null || histBarCounts!=null)) {
float heightRatio, intervalWidth;
int x=0, y=0, barWidth;
if((classIndex >=0) && (m_data.attribute(classIndex).isNominal())) {
barWidth = ((this.getWidth()-6)/histBarClassCounts.length)<1 ? 1:((this.getWidth()-6)/histBarClassCounts.length);
x = 3;
if( (this.getWidth() - (x + histBarClassCounts.length*barWidth)) > 5 )
x += (this.getWidth() - (x + histBarClassCounts.length*barWidth))/2;
for(int i=0; i<histBarClassCounts.length; i++) {
heightRatio = (this.getHeight()-(float)fm.getHeight()-buttonHeight-19)/maxValue;
y = this.getHeight()-19;
int sum = 0;
for(int j=0; j<histBarClassCounts[i].length; j++) {
y = y-Math.round(histBarClassCounts[i][j]*heightRatio);
//System.out.println("Filling x:"+x+" y:"+y+" width:"+barWidth+" height:"+(histBarClassCounts[i][j]*heightRatio));
g.setColor( (Color)m_colorList.elementAt(j) );
if(barWidth>1)
g.fillRect(x, y, barWidth, Math.round(histBarClassCounts[i][j]*heightRatio));
else if((histBarClassCounts[i][j]*heightRatio)>0)
g.drawLine(x, y, x, y+Math.round(histBarClassCounts[i][j]*heightRatio));
g.setColor(Color.black);
sum = sum + histBarClassCounts[i][j];
}
if(fm.stringWidth(" "+Integer.toString(sum))<barWidth)
g.drawString(" "+Integer.toString(sum), x, y-1);
x = x+barWidth;
}
x = 3;
if( (this.getWidth() - (x + histBarClassCounts.length*barWidth)) > 5 )
x += (this.getWidth() - (x + histBarClassCounts.length*barWidth))/2;
g.drawLine(x, this.getHeight()-17,
(barWidth==1) ? x+barWidth*histBarClassCounts.length-1:x+barWidth*histBarClassCounts.length,
this.getHeight()-17); //axis line
g.drawLine(x, this.getHeight()-16, x, this.getHeight()-12); //minimum line
g.drawString(Utils.doubleToString(as.numericStats.min, 2),
x,
this.getHeight()-12+fm.getHeight()); //minimum value
g.drawLine(x+(barWidth*histBarClassCounts.length)/2,
this.getHeight()-16,
x+(barWidth*histBarClassCounts.length)/2,
this.getHeight()-12); //median line
g.drawString(Utils.doubleToString(as.numericStats.max/2+as.numericStats.min/2, 2),
x+(barWidth*histBarClassCounts.length)/2
-fm.stringWidth(Utils.doubleToString(as.numericStats.max/2+as.numericStats.min/2, 2))/2,
this.getHeight()-12+fm.getHeight()); //median value
g.drawLine( (barWidth==1) ? x+barWidth*histBarClassCounts.length-1:x+barWidth*histBarClassCounts.length,
this.getHeight()-16,
(barWidth==1) ? x+barWidth*histBarClassCounts.length-1:x+barWidth*histBarClassCounts.length,
this.getHeight()-12); //maximum line
g.drawString(Utils.doubleToString(as.numericStats.max, 2),
(barWidth==1) ?
x+barWidth*histBarClassCounts.length-fm.stringWidth(Utils.doubleToString(as.numericStats.max, 2))-1:
x+barWidth*histBarClassCounts.length-fm.stringWidth(Utils.doubleToString(as.numericStats.max, 2)),
this.getHeight()-12+fm.getHeight()); //maximum value
}
else { //if class attribute is numeric
barWidth = ((this.getWidth()-6)/histBarCounts.length)<1 ? 1:((this.getWidth()-6)/histBarCounts.length);
x = 3;
if( (this.getWidth() - (x + histBarCounts.length*barWidth)) > 5 )
x += (this.getWidth() - (x + histBarCounts.length*barWidth))/2;
for(int i=0; i<histBarCounts.length; i++) {
heightRatio = (this.getHeight()-(float)fm.getHeight()-buttonHeight-19)/maxValue;
y = this.getHeight()-Math.round(histBarCounts[i]*heightRatio)-19;
//System.out.println("Filling x:"+x+" y:"+y+" width:"+barWidth+" height:"+(histBarCounts[i]*heightRatio));
if(barWidth>1)
g.drawRect(x, y, barWidth, Math.round(histBarCounts[i]*heightRatio));
else if((histBarCounts[i]*heightRatio)>0)
g.drawLine(x, y, x, y+Math.round(histBarCounts[i]*heightRatio));
if(fm.stringWidth(" "+Integer.toString(histBarCounts[i]))<barWidth)
g.drawString(" "+Integer.toString(histBarCounts[i]), x, y-1);
x = x+barWidth;
}
x = 3;
if( (this.getWidth() - (x + histBarCounts.length*barWidth)) > 5 )
x += (this.getWidth() - (x + histBarCounts.length*barWidth))/2;
g.drawLine(x, this.getHeight()-17,
(barWidth==1) ? x+barWidth*histBarCounts.length-1:x+barWidth*histBarCounts.length,
this.getHeight()-17); //axis line
g.drawLine(x, this.getHeight()-16, x, this.getHeight()-12); //minimum line
g.drawString(Utils.doubleToString(as.numericStats.min, 2),
x,
this.getHeight()-12+fm.getHeight()); //minimum value
g.drawLine(x+(barWidth*histBarCounts.length)/2,
this.getHeight()-16,
x+(barWidth*histBarCounts.length)/2,
this.getHeight()-12); //median line
g.drawString(Utils.doubleToString(as.numericStats.max/2+as.numericStats.min/2, 2),
x+(barWidth*histBarCounts.length)/2
-fm.stringWidth(Utils.doubleToString(as.numericStats.max/2+as.numericStats.min/2, 2))/2,
this.getHeight()-12+fm.getHeight()); //median value
g.drawLine( (barWidth==1) ? x+barWidth*histBarCounts.length-1:x+barWidth*histBarCounts.length,
this.getHeight()-16,
(barWidth==1) ? x+barWidth*histBarCounts.length-1:x+barWidth*histBarCounts.length,
this.getHeight()-12); //maximum line
g.drawString(Utils.doubleToString(as.numericStats.max, 2),
(barWidth==1) ?
x+barWidth*histBarCounts.length-fm.stringWidth(Utils.doubleToString(as.numericStats.max, 2))-1:
x+barWidth*histBarCounts.length-fm.stringWidth(Utils.doubleToString(as.numericStats.max, 2)),
this.getHeight()-12+fm.getHeight()); //maximum value
}
//System.out.println("barWidth:"+barWidth+" histBarCount:"+histBarCounts.length);
}
} else {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.drawString("Attribute is neither numeric nor nominal.",
this.getWidth()/2 - fm.
stringWidth("Attribute is neither numeric nor nominal.")/2,
this.getHeight()/2-fm.getHeight()/2);
}
}
else { //if still calculating the plot
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.drawString("Calculating. Please Wait...",
this.getWidth()/2 - fm.stringWidth("Calculating. Please Wait...")/2,
this.getHeight()/2-fm.getHeight()/2);
}
}
}
/**
* 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( JFrame.EXIT_ON_CLOSE );
jf.setVisible(true);
}
else
System.out.println("Usage: java AttributeVisualizationPanel [arff file] [index of attribute]");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -