📄 plot2d.java
字号:
? (int)Math.abs(((Math.log(Math.abs(m_minX)) /
Math.log(10))))+2
: 1;
if (precisionXmin > VisualizeUtils.MAX_PRECISION) {
precisionXmin = 1;
}
String minStringX = Utils.doubleToString(m_minX,
nondecimal+1+precisionXmin,
precisionXmin);
mswx = m_labelMetrics.stringWidth(maxStringX);
int precisionYmax = 1;
int precisionYmin = 1;
int precisionYmid = 1;
whole = (int)Math.abs(m_maxY);
decimal = Math.abs(m_maxY) - whole;
nondecimal = (whole > 0)
? (int)(Math.log(whole) / Math.log(10))
: 1;
precisionYmax = (decimal > 0)
? (int)Math.abs(((Math.log(Math.abs(m_maxY)) /
Math.log(10))))+2
: 1;
if (precisionYmax > VisualizeUtils.MAX_PRECISION) {
precisionYmax = 1;
}
String maxStringY = Utils.doubleToString(m_maxY,
nondecimal+1+precisionYmax
,precisionYmax);
whole = (int)Math.abs(m_minY);
decimal = Math.abs(m_minY) - whole;
nondecimal = (whole > 0)
? (int)(Math.log(whole) / Math.log(10))
: 1;
precisionYmin = (decimal > 0)
? (int)Math.abs(((Math.log(Math.abs(m_minY)) /
Math.log(10))))+2
: 1;
if (precisionYmin > VisualizeUtils.MAX_PRECISION) {
precisionYmin = 1;
}
String minStringY = Utils.doubleToString(m_minY,
nondecimal+1+precisionYmin
,precisionYmin);
if (m_plotInstances.attribute(m_yIndex).isNumeric()) {
mswy = (m_labelMetrics.stringWidth(maxStringY) >
m_labelMetrics.stringWidth(minStringY))
? m_labelMetrics.stringWidth(maxStringY)
: m_labelMetrics.stringWidth(minStringY);
mswy += m_labelMetrics.stringWidth("M");
} else {
mswy = m_labelMetrics.stringWidth("MM");
}
m_YaxisStart = m_axisPad;
m_XaxisStart = 0+m_axisPad+m_tickSize+mswy;
m_XaxisEnd = w-m_axisPad-(mswx/2);
m_YaxisEnd = h-m_axisPad-(2 * hf)-m_tickSize;
// draw axis
gx.setColor(m_axisColour);
if (m_plotInstances.attribute(m_xIndex).isNumeric()) {
if (w > (2 * mswx)) {
gx.drawString(maxStringX,
m_XaxisEnd-(mswx/2),
m_YaxisEnd+hf+m_tickSize);
mswx = m_labelMetrics.stringWidth(minStringX);
gx.drawString(minStringX,
(m_XaxisStart-(mswx/2)),
m_YaxisEnd+hf+m_tickSize);
// draw the middle value
if (w > (3 * mswx) &&
(m_plotInstances.attribute(m_xIndex).isNumeric())) {
double mid = m_minX+((m_maxX-m_minX)/2.0);
whole = (int)Math.abs(mid);
decimal = Math.abs(mid) - whole;
nondecimal = (whole > 0)
? (int)(Math.log(whole) / Math.log(10))
: 1;
precisionXmid = (decimal > 0)
? (int)Math.abs(((Math.log(Math.abs(mid)) /
Math.log(10))))+2
: 1;
if (precisionXmid > VisualizeUtils.MAX_PRECISION) {
precisionXmid = 1;
}
String maxString = Utils.doubleToString(mid,
nondecimal+1+precisionXmid,
precisionXmid);
int sw = m_labelMetrics.stringWidth(maxString);
double mx = m_XaxisStart+((double)(m_XaxisEnd-m_XaxisStart)/2.0);
gx.drawString(maxString,
(int)(mx-(((double)sw)/2.0)),
m_YaxisEnd+hf+m_tickSize);
gx.drawLine((int)mx,m_YaxisEnd,(int)mx,m_YaxisEnd+m_tickSize);
}
}
} else {
int numValues = m_plotInstances.attribute(m_xIndex).numValues();
int div = (numValues % 2 > 0) ? (numValues/2)+1 : (numValues/2);
int maxXStringWidth = (m_XaxisEnd - m_XaxisStart) / numValues;
for (int i=0;i<numValues;i++) {
String val = m_plotInstances.attribute(m_xIndex).value(i);
int sw = m_labelMetrics.stringWidth(val);
int rm;
// truncate string if necessary
if (sw > maxXStringWidth) {
int incr = (sw / val.length());
rm = (sw - maxXStringWidth) / incr;
if (rm == 0) {
rm = 1;
}
val = val.substring(0,val.length()-rm);
sw = m_labelMetrics.stringWidth(val);
}
if (i == 0) {
gx.drawString(val,(int)convertToPanelX(i),
m_YaxisEnd+hf+m_tickSize);
} else if (i == numValues -1) {
if ((i % 2) == 0) {
gx.drawString(val,
m_XaxisEnd-sw,
m_YaxisEnd+hf+m_tickSize);
} else {
gx.drawString(val,
m_XaxisEnd-sw,
m_YaxisEnd+(2*hf)+m_tickSize);
}
} else {
if ((i % 2) == 0) {
gx.drawString(val,
(int)convertToPanelX(i)-(sw/2),
m_YaxisEnd+hf+m_tickSize);
} else {
gx.drawString(val,
(int)convertToPanelX(i)-(sw/2),
m_YaxisEnd+(2*hf)+m_tickSize);
}
}
gx.drawLine((int)convertToPanelX(i),
m_YaxisEnd,
(int)convertToPanelX(i),
m_YaxisEnd+m_tickSize);
}
}
// draw the y axis
if (m_plotInstances.attribute(m_yIndex).isNumeric()) {
if (h > (2 * hf)) {
gx.drawString(maxStringY,
m_XaxisStart-mswy-m_tickSize,
m_YaxisStart+(hf));
gx.drawString(minStringY,
(m_XaxisStart-mswy-m_tickSize),
m_YaxisEnd);
// draw the middle value
if (w > (3 * hf) &&
(m_plotInstances.attribute(m_yIndex).isNumeric())) {
double mid = m_minY+((m_maxY-m_minY)/2.0);
whole = (int)Math.abs(mid);
decimal = Math.abs(mid) - whole;
nondecimal = (whole > 0)
? (int)(Math.log(whole) / Math.log(10))
: 1;
precisionYmid = (decimal > 0)
? (int)Math.abs(((Math.log(Math.abs(mid)) /
Math.log(10))))+2
: 1;
if (precisionYmid > VisualizeUtils.MAX_PRECISION) {
precisionYmid = 1;
}
String maxString = Utils.doubleToString(mid,
nondecimal+1+precisionYmid,
precisionYmid);
int sw = m_labelMetrics.stringWidth(maxString);
double mx = m_YaxisStart+((double)(m_YaxisEnd-m_YaxisStart)/2.0);
gx.drawString(maxString,
m_XaxisStart-sw-m_tickSize-1,
(int)(mx+(((double)hf)/2.0)));
gx.drawLine(m_XaxisStart-m_tickSize,(int)mx,m_XaxisStart,(int)mx);
}
}
} else {
int numValues = m_plotInstances.attribute(m_yIndex).numValues();
int div = ((numValues % 2) == 0) ? (numValues/2) : (numValues/2+1);
int maxYStringHeight = (m_YaxisEnd - m_XaxisStart) / div;
int sw = m_labelMetrics.stringWidth("M");
for (int i=0;i<numValues;i++) {
// can we at least print 2 characters
if (maxYStringHeight >= (2*hf)) {
String val = m_plotInstances.attribute(m_yIndex).value(i);
int numPrint = ((maxYStringHeight/hf) > val.length()) ?
val.length() :
(maxYStringHeight/hf);
for (int j=0;j<numPrint;j++) {
String ll = val.substring(j,j+1);
if (val.charAt(j) == '_' || val.charAt(j) == '-') {
ll = "|";
}
if (i == 0) {
gx.drawString(ll,m_XaxisStart-sw-m_tickSize-1,
(int)convertToPanelY(i)
-((numPrint-1)*hf)
+(j*hf)
+(hf/2));
} else if (i == (numValues-1)) {
if ((i % 2) == 0) {
gx.drawString(ll,m_XaxisStart-sw-m_tickSize-1,
(int)convertToPanelY(i)
+(j*hf)
+(hf/2));
} else {
gx.drawString(ll,m_XaxisStart-(2*sw)-m_tickSize-1,
(int)convertToPanelY(i)
+(j*hf)
+(hf/2));
}
} else {
if ((i % 2) == 0) {
gx.drawString(ll,m_XaxisStart-sw-m_tickSize-1,
(int)convertToPanelY(i)
-(((numPrint-1)*hf)/2)
+(j*hf)
+(hf/2));
} else {
gx.drawString(ll,m_XaxisStart-(2*sw)-m_tickSize-1,
(int)convertToPanelY(i)
-(((numPrint-1)*hf)/2)
+(j*hf)
+(hf/2));
}
}
}
}
gx.drawLine(m_XaxisStart-m_tickSize,
(int)convertToPanelY(i),
m_XaxisStart,
(int)convertToPanelY(i));
}
}
gx.drawLine(m_XaxisStart,
m_YaxisStart,
m_XaxisStart,
m_YaxisEnd);
gx.drawLine(m_XaxisStart,
m_YaxisEnd,
m_XaxisEnd,
m_YaxisEnd);
if (m_XaxisStart != mxs || m_XaxisEnd != mxe ||
m_YaxisStart != mys || m_YaxisEnd != mye) {
m_plotResize = true;
}
}
/**
* Add more colours to the colour map
*/
private void extendColourMap(int highest) {
//System.err.println("Extending colour map");
for (int i = m_colorList.size(); i < highest; i++) {
Color pc = m_DefaultColors[i % 10];
int ija = i / 10;
ija *= 2;
for (int j=0;j<ija;j++) {
pc = pc.brighter();
}
m_colorList.addElement(pc);
}
}
/**
* Renders this component
* @param gx the graphics context
*/
public void paintComponent(Graphics gx) {
super.paintComponent(gx);
if (m_plotInstances != null
&& m_plotInstances.numInstances() > 0
&& m_plotInstances.numAttributes() > 0) {
if (m_plotCompanion != null) {
m_plotCompanion.prePlot(gx);
}
m_JRand = new Random(m_JitterVal);
paintAxis(gx);
if (m_axisChanged || m_plotResize) {
int x_range = m_XaxisEnd - m_XaxisStart;
int y_range = m_YaxisEnd - m_YaxisStart;
if (x_range < 10) {
x_range = 10;
}
if (y_range < 10) {
y_range = 10;
}
m_drawnPoints = new int[x_range + 1][y_range + 1];
fillLookup();
m_plotResize = false;
m_axisChanged = false;
}
paintData(gx);
}
}
/**
* Main method for testing this class
* @param args arguments
*/
public static void main(String [] args) {
try {
if (args.length < 1) {
System.err.println("Usage : weka.gui.visualize.Plot2D "
+"<dataset> [<dataset> <dataset>...]");
System.exit(1);
}
final javax.swing.JFrame jf =
new javax.swing.JFrame("Weka Explorer: Visualize");
jf.setSize(500,400);
jf.getContentPane().setLayout(new BorderLayout());
final Plot2D p2 = new Plot2D();
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);
}
});
p2.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if ((e.getModifiers() & InputEvent.BUTTON1_MASK) ==
InputEvent.BUTTON1_MASK) {
p2.searchPoints(e.getX(), e.getY(), false);
} else {
p2.searchPoints(e.getX(), e.getY(), true);
}
}
});
jf.setVisible(true);
if (args.length >= 1) {
for (int j = 0; j < args.length; j++) {
System.err.println("Loading instances from " + args[j]);
java.io.Reader r = new java.io.BufferedReader(
new java.io.FileReader(args[j]));
Instances i = new Instances(r);
i.setClassIndex(i.numAttributes()-1);
PlotData2D pd1 = new PlotData2D(i);
if (j == 0) {
pd1.setPlotName("Master plot");
p2.setMasterPlot(pd1);
p2.setXindex(2);
p2.setYindex(3);
p2.setCindex(i.classIndex());
} else {
pd1.setPlotName("Plot "+(j+1));
pd1.m_useCustomColour = true;
pd1.m_customColour = (j % 2 == 0) ? Color.red : Color.blue;
p2.addPlot(pd1);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
System.err.println(ex.getMessage());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -