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