package cn.com.widemex.bi.test;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import java.io.File;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import cn.com.widemex.bi.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimePeriodValues;
import org.jfree.data.time.TimePeriodValuesCollection;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import cn.com.widemex.bi.spc.overview.service.GydqxService;
import cn.com.widemex.bi.spc.overview.service.IGydqxService;
import cn.com.widemex.bi.util.AppContextHelper;
public class ChartfTest {
/**
* 创建PieChart
*
*/
public static void pieChart() {
DefaultPieDataset dataset = new DefaultPieDataset();
//塞数据
dataset.setValue("1", 20.0);
dataset.setValue("2", 30);
dataset.setValue("3", 40);
JFreeChart chart = ChartFactory.createPieChart("", dataset, false,false,false);
ChartFrame frame = new ChartFrame("", chart);
frame.show(true);
}
/**
* 创建barChart图
*
*/
public static void barChart() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1, "row 1", "column 1");
dataset.addValue(2, "row 1", "column 2");
dataset.addValue(3, "row 2", "column 1");
dataset.addValue(4, "row 2", "column 2");
JFreeChart chart = ChartFactory.createBarChart("bar", "CATEGORY", "value", dataset, PlotOrientation.VERTICAL, false, false, false);
ChartFrame frame = new ChartFrame("bar chart", chart);
frame.show(true);
}
/**
* 使用CategoryDataset, CategoryPlot生成点线图
*
*/
public static void lineChart() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1, "row 1", "col 1");
dataset.addValue(2, "row 1", "col 2");
dataset.addValue(3, "row 1", "col 3");
dataset.addValue(4, "row 1", "col 4");
dataset.addValue(3, "row 2", "col 1");
dataset.addValue(4, "row 2", "col 2");
dataset.addValue(2, "row 2", "col 3");
dataset.addValue(1, "row 2", "col 4");
JFreeChart chart = ChartFactory.createLineChart("line chart", "count", "value", dataset, PlotOrientation.VERTICAL, false, false, false);
LineAndShapeRenderer renderer=(LineAndShapeRenderer)((CategoryPlot)chart.getPlot()).getRenderer();
renderer.setSeriesShape(0,new Ellipse2D.Double(-2, -2, 4, 4));
renderer.setSeriesShapesVisible(0,true);//第一条线数据点可见
ChartFrame frame = new ChartFrame("line chart", chart);
frame.setSize(200,200);
frame.show(true);
}
/**
* 利用XYSeries和XYPlot来生成点线图
*
*/
public static void lineChart1() {
//生成每条线的数据
XYSeries series1 = new XYSeries("one");
series1.add(1, 1);
series1.add(2, 2);
series1.add(3, 3);
XYSeries series2 = new XYSeries("two");
series2.add(5, 5);
series2.add(3,4);
//把所有线的数据集合在一个数据集中
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(series1);
dataset.addSeries(series2);
JFreeChart chart = ChartFactory.createXYLineChart("line chart", "count", "value", dataset, PlotOrientation.VERTICAL, false, false, false);
System.out.println(chart.getPlot());
//XYLineAndShapeRenderer xylineandshaperenderer=new XYLineAndShapeRenderer();
//xyplot.setRenderer(xylineandshaperenderer);
ChartFrame frame = new ChartFrame("line chart", chart);
frame.setSize(200,200);
frame.setVisible(true);
}
/**
* 时间序列图
*
*/
public static void timeChart()throws Exception {
//TimeSeries timeseries1 = new TimeSeries("Minute", Minute.class);
TimePeriodValues timeperiod1 = new TimePeriodValues("服务器A在线用户数量");
TimePeriodValues timeperiod2 = new TimePeriodValues("服务器B在线用户数量");
TimePeriodValues timeperiod3 = new TimePeriodValues("服务器C在线用户数量");
//TimeSeriesCollection dataset = new TimeSeriesCollection();
//根据当前时间取得横轴坐标,时间间隔为1小时
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
// 这里改为根据自己程序得到的需要显示的时间点和对应的数据的集合;
//List objectList1 = dao.getList1();
//List objectList2 = dao.getList2();
// 使用循环,把x轴,y轴的值赋给timeseries1
for (int i =0;i<12;i++) {
int hours = i+10;
for(int j=0;j<10;j++)
{
int minutes=(j+1)*5;
int count = 10+j;
// 将每一对数据(时间,数值)添加到数据集合1(曲线对象1)中
timeperiod1.add(new Minute(minutes,hours, day, month, year),count);
}
}
for (int i =0;i<12;i++) {
int hours = i+10;
for(int j=0;j<12;j++)
{
int minutes=(j+1)*5;
int count = 10+j;
// 将每一对数据(时间,数值)添加到数据集合1(曲线对象1)中
timeperiod2.add(new Minute(minutes,hours, day, month, year),20);
}
}
for (int i =0;i<12;i++) {
int hours = i+10;
for(int j=0;j<12;j++)
{
int minutes=(j+1)*5;
int count = 10+j;
// 将每一对数据(时间,数值)添加到数据集合1(曲线对象1)中
timeperiod3.add(new Minute(minutes,hours, day, month, year),15);
}
}
TimePeriodValuesCollection dataset = new TimePeriodValuesCollection();
dataset.addSeries(timeperiod1);
dataset.addSeries(timeperiod2);
dataset.addSeries(timeperiod3);
//x轴上的刻度点代表的是时间点而不是时间段
//最开始我没有设置这个属性,结果画出来的图,老是差半格不能在这个刻度的时候准确显示,往后移了半格,就是因为JFreeChart默认这个刻度是
//一个时间段,它把这个刻度和下个刻度的中间点认为是显示数据点最佳位置。
dataset.setDomainIsPointsInTime(true);
JFreeChart chart = ChartFactory.createTimeSeriesChart("time", "时间(HH:mm)", "访问次数", dataset, true, false, false);
XYPlot xyplot = (XYPlot)chart.getPlot();
xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色
//xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离
xyplot.setDomainGridlinePaint(Color.white); //网格线纵向颜色
xyplot.setRangeGridlinePaint(Color.white); //网格线横向颜色
//数据点的调整
//获得曲线渲染类
//XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
XYLineAndShapeRenderer xylineandshaperenderer=new XYLineAndShapeRenderer();
xyplot.setRenderer(xylineandshaperenderer);
xylineandshaperenderer.setSeriesPaint(0, Color.green);//设置第一条曲线颜色
xylineandshaperenderer.setSeriesPaint(1, Color.red); //设置第二条曲线颜色
xylineandshaperenderer.setSeriesPaint(2, Color.blue);//设置第三条曲线颜色
xylineandshaperenderer.setSeriesShape(0,new Ellipse2D.Double(-2, -2, 4, 4));//设置第一条曲线数据点的图形
xylineandshaperenderer.setSeriesOutlinePaint(0,Color.black);//设置第一条曲线数据点画图型的颜色
xylineandshaperenderer.setSeriesFillPaint(0,Color.cyan);//设置第一条曲线数据点填充色
xylineandshaperenderer.setSeriesShapesVisible(0,true);//第一条线数据点可见
xylineandshaperenderer.setUseOutlinePaint(true);//设置是否画曲线数据点的轮廓图形
xylineandshaperenderer.setUseFillPaint(true); //设置是否填充曲线数据点
xylineandshaperenderer.setSeriesToolTipGenerator(0,new StandardXYToolTipGenerator("{0}({1},{2})",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),new DecimalFormat("##,00")));
xylineandshaperenderer.setXDataFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//xylineandshaperenderer.setSeries(0,true);
//xylineandshaperenderer.setDrawSeriesLineAsPath(true);
xylineandshaperenderer.setBaseLinesVisible(true);
xylineandshaperenderer.setRecordRectangleDataValueObject(0);
//使用xyplot.getRangeAxis()得到纵轴,xyplot.getDomainAxis()得到横轴,得到后可以根据实际情况造型为自己所需要的类型。
//我的图表纵轴为数值类型,横轴为时间类型,使用如下方式
NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();
DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();
//设置y显示方式
numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
double rangetick = 5D;
numAxis.setTickUnit(new NumberTickUnit(rangetick)); //y轴单位间隔为5
//设置x轴显示方式
dateaxis.setAutoTickUnitSelection(false);//x轴的数据标签是否自动确定
dateaxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));//x轴的日期显示格式
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MINUTE,60));//x轴单位间隔为60分中
ChartUtilities.saveChartAsJPEG(new File("d://chart.jpg"),chart,500,400);
List list=xylineandshaperenderer.getRectangleDataValueObjects(0);
System.out.println("count:"+list.size());
cn.com.widemex.bi.jfree.chart.data.xy.RectangleDataValueObject obj=null;
for(int i=0;i<list.size();i++)
{
obj=(cn.com.widemex.bi.jfree.chart.data.xy.RectangleDataValueObject)list.get(i);
System.out.println(obj.getRectangle().getX()+","+obj.getRectangle().getY()+","+
obj.getRectangle().getWidth()+","+obj.getRectangle().getHeight()+";"+
obj.getXAxisValue()+","+obj.getYAxisValue());
}
//ChartFrame frame = new ChartFrame("time chart", chart);
//frame.setSize(500,400);
//frame.show(true);
}
public static void main(String[] strs) {
try {
ArrayList list=new ArrayList();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date date1=format.parse("2008-01-01 10:30:25");
list.add(date1);
java.util.Date date2=format.parse("2008-01-02 13:10:25");
list.add(date2);
java.util.Date date3=format.parse("2008-01-02 10:30:25");
list.add(date3);
java.util.Date date4=format.parse("2008-01-01 13:10:25");
list.add(date4);
Collections.sort(list,new Comparator(){
public int compare(Object arg1, Object arg2) {
int r=0;
java.util.Date o1=(java.util.Date)arg1;
java.util.Date o2=(java.util.Date)arg2;
if(o1.before(o2)){
r=1;
}else{
r=-1;
}
return r;
}
});
for(int i=0;i<list.size();i++){
System.out.println(format.format((java.util.Date)list.get(i)));
}
}catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}