Step 1 : Data Sampling
There are two sources of data, the first one is the real world data such as stock price.
The second one is from a mathematical equation, for example, we may plot a graph for the equation
y=x2
If we limit x in the range of 0 to 6, we would take 7 sample points and have the following sequence of data :
x={0,1,2,3,4,5,6}
y={0,1,4,9,16,25,36}
Since the data is evenly spaced along the x-dimension, we can ignore the x sequence and just focused on the y sequence. To input the sequence to our program, we prepare a data file known as data.txt. The file can be created using any text editor. The data file contains 7 rows with one data value in each row.
Contents of data.txt as follows :
0 1 4 9 16 25 36
Step 2 : read the data
Once the data is ready, we must read it from the data file into our program. The data will be stored in a double[] array. File reading is done by the API in the BufferedReader class.
Step 3 : scaling
Suppose we are plotting a graph in a panel with size 600x300 pixels. To evenly distribute the 7 data points along the x direction, the gap between every data point will be 100 pixels. That is, the x-coordinates in pixels will be (0,100,200,300,400,500,600).
In this case, the scaling factor will be 100, which can be calculated from the following formula :
xScale = PANEL_WIDTH/(NUMBER_OF_DATA_POINT-1)
= 600 / (7-1)
= 600 / 6
= 100
The scaling factor in the y-dimension can be calculated as
yScale = PANEL_HEIGHT/(MAX_DATA-MIN_DATA)
= 300 / (36-0)
= 8.333
Step 4 : Ploting the data point
We will use a red circle to plot the data point. This can be done by the fillOval API
Step 5 : Connecting the data points
Just use the drawLine() API will do.
Full Source Code
/******************************************************************************
* File : Visualizer.java
* Author : http://java.macteki.com/
* Description :
* Visualize a sequence of data by ploting a graph just like the MS excel.
* Requirement : data.txt which contains the sequence of data.
* Tested with : JDK 1.6
******************************************************************************/
class Visualizer extends javax.swing.JPanel
{
double[] data=null;
double minData=1e308, maxData=-1e308;
void readData() throws Exception
{
String filename="data.txt";
java.io.BufferedReader br=new java.io.BufferedReader(
new java.io.FileReader(filename));
// count number of lines
int count=0;
String line="";
while ((line=br.readLine())!=null) count++;
br.close();
double[] a=new double[count];
this.data=a;
// re-open the file
br=new java.io.BufferedReader(
new java.io.FileReader(filename));
// read data line by line and store them in an array
count=0;
while ((line=br.readLine())!=null)
{
double y=Double.parseDouble(line);
a[count++]=y;
if (y<minData) minData=y;
if (y>maxData) maxData=y;
}
}
// this will be called automatically when the panel is displayed
public void paintComponent(java.awt.Graphics gr)
{
if (data==null) return;
gr.setColor(java.awt.Color.GRAY);
gr.fillRect(0,0,getWidth(),getHeight());
int width=getWidth();
int height=getHeight();
double xScale = (double) width/(double)(data.length-1);
double yScale = (double) height/(double) (maxData-minData);
double xp=-999,yp=0; // previous point
for (int i=0;i<data.length;i++)
{
double x=i*xScale;
double y=(data[i]-minData)*yScale;
y=height-y; // top-down transformation
gr.setColor(java.awt.Color.RED);
gr.fillOval((int)x-5,(int)y-5,10,10);
// connect previous point with current point
gr.setColor(java.awt.Color.BLUE);
if (xp!=-999) gr.drawLine((int)xp,(int)yp,(int)x,(int)y);
xp=x; yp=y;
}
}
public static void main(String[] args) throws Exception
{
javax.swing.JFrame window=new javax.swing.JFrame();
window.setTitle("Macteki Data Visualizer");
window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
Visualizer panel=new Visualizer();
window.add(panel);
panel.setPreferredSize(new java.awt.Dimension(600,300));
panel.readData();
window.pack();
window.setVisible(true);
}
}
No comments:
Post a Comment