Java/Advanced Graphics/Chart
Содержание
Animation Line Chart
<source lang="java">
import java.awt.*; import java.applet.*; import java.net.URL; import java.util.*; import graph.*; /*************************************************************************
- Applet example2
- Version 1.0 January 1996
-
- Copyright (C) 1996 Leigh Brookshaw
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- This is a simple applet that creates a Scroll Chart using the
- Graph2D class library
-
- /
public class example2 extends Applet {
Graph2D graph; Label title; DataSet data1 = new DataSet(); CalculateData cd1; Axis yaxis_right;
/*
- In milliseconds how often do we want to add a new data point.
- /
int period = 500;
/*
- Maximum number of points to display before scrolling the data
- /
int maximum = 25; URL markersURL;
/*
- Initialize the applet. The Parameters passed are the title of the plot
- the marker file to use and the update period in milliseconds
- /
public void init() { int i; int j;
/*
- Get the passed parameters
- /
String st = "TITLE"; String mfile = "marker.txt"; period = 10;//Integer.parseInt(getParameter("PERIOD"));
/*
- Create the Graph instance and modify the default behaviour
- /
graph = new Graph2D(); graph.zerocolor = new Color(0,255,0); graph.borderTop = 50; graph.borderBottom = 50;
/*
- Create the Title
- /
title = new Label(st, Label.CENTER); title.setFont(new Font("TimesRoman",Font.PLAIN,25)); setLayout( new BorderLayout() ); add("North", title); add("Center", graph);
/*
- Load a file containing Marker definitions
- /
try { markersURL = this.getClass().getResource(mfile); graph.setMarkers(new Markers(markersURL)); } catch(Exception e) { System.out.println("Failed to create Marker URL!"); }
/*
- Modify the default Data behaviour
- /
data1.linecolor = new Color(255,0,0); data1.marker = 1; data1.markercolor = new Color(100,100,255);
/*
- Setup the Axis. Attach it to the Graph2D instance, and attach the data
- to it.
- /
yaxis_right = graph.createAxis(Axis.RIGHT); yaxis_right.attachDataSet(data1); yaxis_right.setLabelFont(new Font("Helvetica",Font.PLAIN,20)); graph.attachDataSet(data1);
/*
- Calculate the data asynchronously using a new Thread.
- /
cd1 = new CalculateData(data1,graph,period,maximum); cd1.start(); } public static void main(String[] a){ javax.swing.JFrame f = new javax.swing.JFrame(); Applet app = new example2(); app.init(); f.getContentPane().add (app); f.pack(); f.setSize (new Dimension (500, 500)); f.setVisible(true); }
}
/*
- Here is the Thread class to calculate the data and append it to the existing
- data set.
- This class is easily modified to get the data from a server
- or the local machine. Currently the data is Random.
- /
class CalculateData extends Thread { // local copy of the update period in milliseconds
int p = 1000; DataSet d; Graph2D g;
// local copy of the maximum number of points.
int m = 25; Random random = new Random();
public CalculateData(DataSet ds, Graph2D g, int p, int m) { this.d = ds; this.g = g; if(p > 100 ) this.p = p; if(m > 0 ) this.m = m; } public void run() { int i =0; double data[] = new double[2]; int count = 0; if(d == null) return; setPriority(Thread.MIN_PRIORITY);
while(true) { count++; if(count >= m) d.delete(0,0); data[1] = (2.0*random.nextDouble() - 1.0)*15.0; data[0] = count; try { d.append(data,1); } catch (Exception e) { System.out.println("Error appending Data!"); } d.yaxis.maximum = 15.0; d.yaxis.minimum = -15.0;
// To avoid flashing try and repaint halfway through the sleep
g.repaint(p/2); try { sleep(p); } catch(Exception e) { } } }
}
</source>
A rudimentary bar chart class
<source lang="java">
import java.awt.*; import java.util.*; import javax.swing.*; import no.geosoft.cc.geometry.Geometry; import no.geosoft.cc.graphics.*;
/**
* G demo program. Demonstrates: **
-
*
- A rudimentory bar chart class *
- Rendering techniques *
* * @author
A rudimentary chart library
<source lang="java">
import java.util.Iterator; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; import javax.swing.*; import no.geosoft.cc.geometry.Geometry; import no.geosoft.cc.util.NiceNumbers; import no.geosoft.cc.util.NiceNumber; import no.geosoft.cc.graphics.*;
/**
* G demo program. Demonstrates: **
-
*
- A rudimentary chart library *
- The use of multiple scenes *
- World extent usage *
- Zooming and scrolling *
- Nice number generation *
* * @author
bar-graph drawable
<source lang="java">
/**
* * LibSparkline : a free Java sparkline chart library * * * Project Info: http://reporting.pentaho.org/libsparkline/ * * (C) Copyright 2008, by Larry Ogrodnek, Pentaho Corporation and Contributors. * * This library is free software; you can redistribute it and/or modify it under the terms * of the Apache License 2.0. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the Apache License 2.0 along with this library; * if not, a online version is available at http://www.apache.org/licenses/ * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------ * BarGraphDrawable.java * ------------ */
import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D;
/**
* A very fast and very simple bar-graph drawable. This code is based on the BarGraph class writen by Larry Ogrodnek * but instead of producing a low-resolution image, this class writes the content into a Graphics2D context. * * @author Thomas Morgner */
public class BarGraphDrawable {
private static final int DEFAULT_SPACING = 2; private static final Color DEFAULT_COLOR = Color.gray; private static final Color DEFAULT_HIGH_COLOR = Color.black; private static final Color DEFAULT_LAST_COLOR = Color.red; private Number[] data; private Color color; private Color highColor; private Color lastColor; private Color background; private int spacing; /** * Creates a default bargraph drawable with some sensible default colors and spacings. */ public BarGraphDrawable() { this.highColor = BarGraphDrawable.DEFAULT_HIGH_COLOR; this.lastColor = BarGraphDrawable.DEFAULT_LAST_COLOR; this.color = BarGraphDrawable.DEFAULT_COLOR; this.spacing = BarGraphDrawable.DEFAULT_SPACING; } /** * Returns the numeric data for the drawable or null, if the drawable has no data. * * @return the data. */ public Number[] getData() { return data; } /** * Defines the numeric data for the drawable or null, if the drawable has no data. * * @param data the data (can be null). */ public void setData(final Number[] data) { this.data = data; } /** * Returns the main color for the bars. * * @return the main color for the bars, never null. */ public Color getColor() { return color; } /** * Defines the main color for the bars. * * @param color the main color for the bars, never null. */ public void setColor(final Color color) { if (color == null) { throw new NullPointerException(); } this.color = color; } /** * Returns the color for the highest bars. This property is optional and the high-color can be null. * * @return the color for the higest bars, or null if high bars should not be marked specially. */ public Color getHighColor() { return highColor; } /** * Defines the color for the highest bars. This property is optional and the high-color can be null. * * @param highColor the color for the higest bars, or null if high bars should not be marked specially. */ public void setHighColor(final Color highColor) { this.highColor = highColor; } /** * Returns the color for the last bar. This property is optional and the last-bar-color can be null. * * @return the color for the last bar in the graph, or null if last bars should not be marked specially. */ public Color getLastColor() { return lastColor; } /** * Defines the color for the last bar. This property is optional and the last-bar-color can be null. * * @param lastColor the color for the last bar in the graph, or null if last bars should not be marked specially. */ public void setLastColor(final Color lastColor) { this.lastColor = lastColor; } /** * Returns the color for the background of the graph. This property can be null, in which case the bar * will have a transparent background. * * @return color for the background or null, if the graph has a transparent background color. */ public Color getBackground() { return background; } /** * Defines the color for the background of the graph. This property can be null, in which case the bar * will have a transparent background. * * @param background the background or null, if the graph has a transparent background color. */ public void setBackground(final Color background) { this.background = background; } /** * Returns the spacing between the bars. * * @return the spacing between the bars. */ public int getSpacing() { return spacing; } /** * Defines the spacing between the bars. * * @param spacing the spacing between the bars. */ public void setSpacing(final int spacing) { this.spacing = spacing; } /** * Draws the bar-graph into the given Graphics2D context in the given area. This method will not draw a graph * if the data given is null or empty. * * @param g2 the graphics context on which the bargraph should be rendered. * @param drawArea the area on which the bargraph should be drawn. */ public void draw(Graphics2D g2, Rectangle2D drawArea) { if (g2 == null) { throw new NullPointerException(); } if (drawArea == null) { throw new NullPointerException(); } final int height = (int) drawArea.getHeight(); if (height <= 0) { return; } Graphics2D g = (Graphics2D) g2.create(); g.translate(drawArea.getX(), drawArea.getY()); if (background != null) { g.setBackground(background); g.clearRect(0, 0, (int) drawArea.getWidth(), height); } if (data == null || data.length == 0) { g.dispose(); return; } final float d = getDivisor(data, height); final int a = computeAverage(data); final int spacing1 = getSpacing(); final int w = ((int) drawArea.getWidth() - (spacing1 * data.length)) / data.length; int x = 0; final int y = 0; final double vHeight = drawArea.getHeight(); final Rectangle2D.Double bar = new Rectangle2D.Double(); for (int index = 0; index < data.length; index++) { Number i = data[index]; if (i == null) { continue; } final int h = (int) (i.floatValue() / d); final int intVal = i.intValue(); if (index == (data.length - 1) && lastColor != null) { g.setPaint(lastColor); } else if (intVal < a || (highColor == null)) { g.setPaint(color); } else { g.setPaint(highColor); } bar.setRect(x, y + (vHeight - h), w, intVal / d); g.fill(bar); x += (w + spacing1); } g.dispose(); } /** * Computes the average for all numbers in the array. * * @param data the numbers for which the average should be computed. * @return the average. */ private static int computeAverage(final Number[] data) { int total = 0; int length = 0; for (int index = 0; index < data.length; index++) { Number i = data[index]; if (i == null) { continue; } total += i.intValue(); length += 1; } return (total / length); } /** * Computes the scale factor to scale the given numeric data into the target * height. * * @param data * the numeric data. * @param height * the target height of the graph. * @return the scale factor. */ public static float getDivisor(final Number[] data, final int height) { if (data == null) { throw new NullPointerException("Data array must not be null."); } if (height < 1) { throw new IndexOutOfBoundsException("Height must be greater or equal to 1"); } float max = Float.MIN_VALUE; float min = Float.MAX_VALUE; for (int index = 0; index < data.length; index++) { Number i = data[index]; if (i == null) { continue; } final float numValue = i.floatValue(); if (numValue < min) { min = numValue; } if (numValue > max) { max = numValue; } } if (max <= min) { return 1.0f; } if (height == 1) { return 0; } return (max - min) / (height - 1); }
}
</source>
Chart based on Graph library
<source lang="java">
import java.awt.*; import java.applet.*; import java.net.URL; import java.util.*; import graph.*; /*************************************************************************
- Applet example3
- Version 1.0 January 1996
-
- Copyright (C) 1996 Leigh Brookshaw
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- This applet demonstrates the interactive event handling of
- the G2Dint class
-
- /
public class example3 extends Applet {
LoadData dynamic; G2Dint graph; Label title; DataSet data1; Axis xaxis; Axis yaxis;
public void init() { int i; int j;
/*
- Get the title of the plot and the data URL as parsed parameters
- /
String st = "TITLE"; String data = "elliptical.data";
/*
- Instantiate the Graph class and the LoadData class
- /
graph = new G2Dint(); dynamic = new LoadData(); graph.borderTop = 30; graph.borderBottom = 10; graph.borderRight = 40; graph.setDataBackground(new Color(50,50,200)); graph.setGraphBackground(new Color(0,200,255));
/*
- Build the title and place it at the top of the graph
- /
graph.setFont(new Font("TimesRoman",Font.PLAIN,25)); title = new Label(st, Label.CENTER); title.setFont(new Font("TimesRoman",Font.PLAIN,25)); setLayout( new BorderLayout() ); add("North", title); add("Center", graph);
/*
- Start a new thread and load the data
- /
try { data1 = dynamic.loadDataSet(this.getClass().getResource(data), graph); } catch (Exception e) { System.out.println("Failed to load data file!"); }
/*
- Specify the data line color
- /
data1.linecolor = new Color(255,255,0);
/*
- Instantiate the xaxis and attach the dataset.
- /
xaxis = graph.createXAxis(); xaxis.attachDataSet(data1); xaxis.setTitleText("Wavelength_(angstroms)"); xaxis.setTitleColor(Color.magenta); xaxis.setTitleFont(new Font("TimesRoman",Font.ITALIC,25)); xaxis.setLabelFont(new Font("Helvetica",Font.PLAIN,20));
/*
- Instantiate the yaxis and attach the dataset.
- /
yaxis = graph.createYAxis(); yaxis.attachDataSet(data1); yaxis.setTitleText("Flux"); yaxis.setTitleColor(Color.magenta); yaxis.setTitleFont(new Font("TimesRoman",Font.ITALIC,25)); yaxis.setLabelFont(new Font("Helvetica",Font.PLAIN,20));
} public static void main(String[] a){ javax.swing.JFrame f = new javax.swing.JFrame(); Applet app = new example3(); app.init(); f.getContentPane().add (app); f.pack(); f.setSize (new Dimension (500, 500)); f.setVisible(true); }
}
</source>
Pie Chart
<source lang="java">
import java.awt.*; import java.util.*; import javax.swing.*; import no.geosoft.cc.geometry.Geometry; import no.geosoft.cc.graphics.*;
/**
* G demo program. Demonstrates: **
-
*
- A rudimentary pie chart class *
- Annotation techniques *
- Example geometry generation *
* * @author
Scroll Chart
<source lang="java">
import java.awt.*; import java.applet.*; import java.net.URL; import java.util.*; import graph.*; /*************************************************************************
- Applet example2a
- Version 1.0 August 1996
-
- Copyright (C) 1996 Leigh Brookshaw
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- This is a simple applet that creates a Scroll Chart using the
- Graph2D class library and double buffering
-
- /
public class example2a extends Applet implements Runnable {
Graph2D graph; Label title; DataSet data1 = new DataSet(); Axis yaxis_right; Image osi = null; Graphics osg = null; int iwidth = 0; int iheight = 0; Thread runner = null; Random random = new Random(); int count = 0;
/*
- In milliseconds how often do we want to add a new data point.
- /
int period = 500;
/*
- Maximum number of points to display before scrolling the data
- /
int maximum = 25; URL markersURL;
/*
- Initialize the applet. The Parameters passed are the title of the plot
- the marker file to use and the update period in milliseconds
- /
public void init() { int i; int j;
/*
- Get the passed parameters
- /
String st = "TITLE"; String mfile = "marker.txt"; period = 10;
/*
- Create the Graph instance and modify the default behaviour
- /
graph = new Graph2D(); graph.zerocolor = new Color(0,255,0); graph.borderTop = 50; graph.borderBottom = 50; graph.setDataBackground(Color.black);
/*
- Create the Title
- /
title = new Label(st, Label.CENTER); title.setFont(new Font("TimesRoman",Font.PLAIN,25)); setLayout( new BorderLayout() ); add("North", title); add("Center", graph);
/*
- Load a file containing Marker definitions
- /
try { markersURL = this.getClass().getResource(mfile); graph.setMarkers(new Markers(markersURL)); } catch(Exception e) { System.out.println("Failed to create Marker URL!"); }
/*
- Modify the default Data behaviour
- /
data1.linecolor = new Color(255,0,0); data1.marker = 1; data1.markercolor = new Color(100,100,255);
/*
- Setup the Axis. Attach it to the Graph2D instance, and attach the data
- to it.
- /
yaxis_right = graph.createAxis(Axis.RIGHT); yaxis_right.attachDataSet(data1); yaxis_right.setLabelFont(new Font("Helvetica",Font.PLAIN,20)); graph.attachDataSet(data1);
} public void start() { if(runner == null) { runner = new Thread(this); runner.start(); } }
public void stop() { if(runner != null) { runner.stop(); runner = null; } }
public void run() { int i =0; double data[] = new double[2]; Graphics g; while(true) {
count++; if(count >= maximum) data1.delete(0,0); data[1] = (2.0*random.nextDouble()-1.0)*50.0; data[0] = count; try { data1.append(data,1); } catch (Exception e) { System.out.println("Error appending Data!"); } data1.yaxis.maximum = 50.0; data1.yaxis.minimum = -50.0; g = graph.getGraphics(); if( osi == null || iwidth != graph.size().width || iheight != graph.size().height ) { iwidth = graph.size().width; iheight = graph.size().height; osi = graph.createImage(iwidth,iheight); osg = osi.getGraphics(); } osg.setColor(this.getBackground()); osg.fillRect(0,0,iwidth,iheight); osg.setColor(g.getColor()); osg.clipRect(0,0,iwidth,iheight);
graph.update(osg); g.drawImage(osi,0,0,graph);
try { Thread.sleep(period); } catch(Exception e) { } } } public static void main(String[] a){ javax.swing.JFrame f = new javax.swing.JFrame(); Applet app = new example2(); app.init(); f.getContentPane().add (app); f.pack(); f.setSize (new Dimension (500, 500)); f.setVisible(true); }
}
</source>