📄 graphs.java
字号:
/*作者:徐朝*/
/*keystonexu@yahoo.com.cn*/
package regression.gui;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
//一个通用绘图类,绘制曲线用
public class Graphs extends Panel {
// 绘制类型:柱形,散点型,表达曲线型
public final static int BAR = 0;
public final static int SCATTER = 1;
private int graphStyle;
/* 边距 */
private final int leftGap = 2;
private final int topGap = 2;
private final int bottomGap = 2;
private int rightGap; // this value is computed
// 保存数据最小值,最大值
private double min, max,max1;
//表示数据
private double[] data;
private double[] data1;
//使用的颜色,格子的颜色和数据的颜色
Color gridColor = new Color(0, 150, 150);
Color dataColor = new Color(0, 0, 0);
// 用来按比例显示数据用
private int hGap; // 数据点之间空间
private int spread; // 最大最小值之差
private double scale; // 比例
private int baseline; // vertical coordinate of baseline
private String messageStr = "";
private String messageStr1 = "";
private String messageStr2 = "";
// 在窗口中的位置
private int top, bottom, left, right;
//传递来数据序列和显示格式
public Graphs(double[] vals, double[] val, int style) {
// 关闭事件
// resize事件
/* addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent ce) {
repaint();
}
}); */
graphStyle = style;
data = vals;
data1 = val;
//对数据排序,以求得最大最小值
double t[] = new double[vals.length];
System.arraycopy(vals, 0, t, 0, vals.length);
Arrays.sort(t);
min = t[0];
max = t[t.length-1];
max1 = t[t.length - 2];
//设置窗口大小
//setSize(new Dimension(200, 120));
}
public void paint(Graphics g) {
Dimension winSize = getSize(); // 窗口大小
g.setColor(Color.white);
g.clearRect(0,0,getSize().width,getSize().height);
Insets ins = getInsets(); // 边
//
FontMetrics fm = g.getFontMetrics();
// 计算右边的距离
rightGap = fm.stringWidth("" + data.length);
//计算整个数据区
left = ins.left + leftGap + fm.charWidth('0');
top = ins.top + topGap + fm.getAscent();
bottom = ins.bottom + bottomGap + fm.getAscent();
right = ins.right + rightGap;
if(min > 0) min = 0;
if(max < 0) max = 0;
/* 计算最大最小值间距离. */
spread = (int) (max - min);
if(spread < 1)
spread = 1;
// 计算缩放比例
scale = (double) (winSize.height - bottom - top) / spread;
//计算x轴
baseline = (int) (winSize.height - bottom + min * scale);
// 计算数据间距
hGap = (winSize.width - left - right) / (data.length-1);
//设置格子颜色
g.setColor(gridColor);
//画x轴
g.drawLine(left, baseline,
left + (data.length-1) * hGap, baseline);
//绘制y轴
if(graphStyle != BAR)
g.drawLine(left, winSize.height-bottom, left, top);
//显示最小,最大值
g.drawString("0", ins.left, baseline+fm.getAscent()/2);
//绘制坐标值
for(int i = 1; i < 10; i++)
{
String data =(new Double(i * 0.1)).toString().substring(0,3);
g.drawString(data,hGap * i + ins.left - 8,baseline + 14);
g.drawLine(hGap * i,baseline,hGap * i,baseline - 3);
}
if(max != 0)
g.drawString("" + max, ins.left, baseline -
(int) (max*scale) - 4);
if(max1 != 0)
g.drawString(("" + max1).substring(0,5),ins.left,baseline- (int)(max1 * scale) -4);
if(min != 0)
g.drawString(("" + min).substring(0,5), ins.left, baseline -
(int) (min*scale)+fm.getAscent());
g.setFont(new Font("宋体",Font.PLAIN,20));
g.drawString(messageStr, 100,30);
g.setFont(new Font("宋体",Font.PLAIN,16));
g.drawString(messageStr1, 100,55);
// 设置数据颜色
g.setColor(dataColor);
//绘制数据
switch(graphStyle) {
case BAR:
bargraph(g);
break;
case SCATTER:
scatter(g,Color.black,data);
if(data1 != null)
scatter(g,Color.blue,data1);
break;
}
}
public void setData(double data1[],double adjustedFitness,
int currentGeneration)
{
this.data1 = data1;
messageStr = "第 " + currentGeneration + " 代";
messageStr1 = "adjusted适应度: " + adjustedFitness ;
repaint();
}
// 绘制直线型
private void bargraph(Graphics g) {
int v;
for(int i=0; i < data.length; i++) {
v = (int) (data[i] * scale);
g.drawLine(i*hGap+left, baseline,
i*hGap+left, baseline - v);
}
}
// 绘制散点
private void scatter(Graphics g,Color color,double[] data) {
int v;
int oldx,oldy,x1,y1;
oldx = left;
oldy = baseline - (int) (data[0] * scale);
g.setColor(color);
for(int i=0; i < data.length; i++)
{
v = (int) (data[i] * scale);
int x = i * hGap + left;
int y = baseline - v;
g.fillRect(x, y, 6, 6);
g.drawLine(oldx,oldy,x,y);
oldx = x;
oldy = y;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -