现在的位置: 首页 > 综合 > 正文

jfreechart采用TimeSeriesChart并更改热点内容

2013年08月22日 ⁄ 综合 ⁄ 共 8556字 ⁄ 字号 评论关闭

 

/**
 * 
 */
package com.huaxia.bank.test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleInsets;

/**
 * @author cuiran
 *
 */
public class TimeSeriesTest  {

	  public final static String MONTH = "MONTH";
	  public final static String DAY = "DAY";
	  public final static String HOUR = "HOUR";
	  
	  private JFreeChart rChart = null;     //图表对象
	  public String chartTitle = "";        //图表标题
	  public String chartXdesc = "";        //X轴标题
	  public String chartYdesc = "";        //Y轴标题
	  public String chartSeriesDesc = "";   //曲线说明
	  public String chartSeriesDesc1 = "";   //曲线说明
	  public int graphWidth = 600;          //默认宽度
	  public int graphHigh = 400;           //默认高度
	  public String timeFormat = "MM/yyyy"; // 按日:MM-dd ,按小时:hh:mm

	  // 用于标志用户选择的是按哪种查询统计周期类型(年、月、天、小时).
	  // 年:YEAR, 月:MONTH, 天:DAY, 小时:HOUR
	  public String periodType = "";

	  // 用于确定时间间隔
	  public int dateInterval = 1;
	  
	  //统计结果数据集
	  TimeSeriesCollection statDataset = new TimeSeriesCollection();
	  
	  TimeSeries monthSeries = null;  //月份统计图数据集合
	  TimeSeries monthSeries1 = null;  //月份统计图数据集合
	  TimeSeries daySeries = null;    //天数统计图数据集合
	  TimeSeries hourSeries = null;   //小时统计图数据集合
	  
	  
	
	  public void createTread(){
		    setTimeSeriesStatType();
	  }
	 
	  /**
	   * 创建趋势图表
	   * @return JFreeChart 图表对象JFreeChart
	   */
	  private JFreeChart createTrendChart(){
	    JFreeChart _freeChart = ChartFactory.createTimeSeriesChart(chartTitle, chartXdesc, chartYdesc, 
	        getTimeSeriesStatDataSet(), true, true, true);
	    _freeChart.setBackgroundPaint(Color.white);
	    
	    XYPlot _xyplot = _freeChart.getXYPlot();
	    
	    _xyplot.setOrientation(PlotOrientation.VERTICAL);
	    
	    _xyplot.setBackgroundPaint(Color.lightGray);
	    _xyplot.setDomainGridlinePaint(Color.white);
	    _xyplot.setRangeGridlinePaint(Color.white);
	   
	    _xyplot.setAxisOffset(new RectangleInsets(1.0, 2.0, 2.0, 10.0));
	   XYItemRenderer renderer= _xyplot.getRenderer();

	   DateFormat df=new SimpleDateFormat("yyyy年MM月");
	   NumberFormat nf= NumberFormat.getNumberInstance();
	   StandardXYToolTipGenerator toolg=new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,df,nf);
	   
	   renderer.setToolTipGenerator(toolg);
//	   
	   
	    DateAxis dateaxis = (DateAxis) _xyplot.getDomainAxis();
	    if (periodType.equalsIgnoreCase("MONTH")){
	      if (dateInterval > 0) {
	        dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, dateInterval));
	      }
	    }else if (periodType.equalsIgnoreCase("DAY")){
	      if (dateInterval > 0) {
	        dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, dateInterval));
	      }
	    }else if (periodType.equalsIgnoreCase("HOUR")){
	      if (dateInterval > 0) {
	        dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.HOUR, dateInterval));
	      }
	    }
	    
	    dateaxis.setDateFormatOverride(new SimpleDateFormat(timeFormat));
	    
	    return _freeChart;
	  }
	  
	  /**
	   * 增加走势图数据
	   * @param periodType 区间类型
	   * @param year  年份
	   * @param month 月份
	   * @param day   日期
	   * @param hour  时间
	   * @param statData 统计数据
	   */
	  public void addTimeSeriesUnitData(int year, int month,int statData) {
	    if (periodType.equalsIgnoreCase("MONTH")){
	      if (monthSeries == null){
	        monthSeries = new TimeSeries(chartSeriesDesc,Month.class);
	      }
	      monthSeries.add(new Month(month, year), statData);

	      System.out.println("月");
	    }else if (periodType.equalsIgnoreCase("DAY")){
	      if (daySeries == null){
	        daySeries = new TimeSeries(chartSeriesDesc, Day.class);
	      }
//	      daySeries.add(new Day(day, month, year), statData);
	    }else if (periodType.equalsIgnoreCase("HOUR")){
	      if (hourSeries == null){
	        hourSeries = new TimeSeries(chartSeriesDesc, Hour.class);
	      }
//	      hourSeries.add(new Hour(hour, day, month, year), statData);
	    }
	  }
	  /**
	   * 增加走势图数据
	   * @param periodType 区间类型
	   * @param year  年份
	   * @param month 月份
	   * @param day   日期
	   * @param hour  时间
	   * @param statData 统计数据
	   */
	  public void addTimeSeriesUnitDataAll(int year, int month,int statData) {
	    if (periodType.equalsIgnoreCase("MONTH")){
	      if (monthSeries1 == null){
	    	  monthSeries1 = new TimeSeries(chartSeriesDesc1,Month.class);
	      }
	      monthSeries1.add(new Month(month, year), statData);

	      System.out.println("月");
	    }else if (periodType.equalsIgnoreCase("DAY")){
	      if (daySeries == null){
	        daySeries = new TimeSeries(chartSeriesDesc1, Day.class);
	      }
//	      daySeries.add(new Day(day, month, year), statData);
	    }else if (periodType.equalsIgnoreCase("HOUR")){
	      if (hourSeries == null){
	        hourSeries = new TimeSeries(chartSeriesDesc1, Hour.class);
	      }
//	      hourSeries.add(new Hour(hour, day, month, year), statData);
	    }
	  }
	  /**
	   * 设置走势图统计的区间类型
	   * @param periodType 区间类型
	   */
	  private void setTimeSeriesStatType() {
	    if (periodType.equalsIgnoreCase("MONTH")){
	      statDataset.addSeries(monthSeries);
	      statDataset.addSeries(monthSeries1);
	    }else if (periodType.equalsIgnoreCase("DAY")){
	      statDataset.addSeries(daySeries);
	    }else if (periodType.equalsIgnoreCase("HOUR")){
	      statDataset.addSeries(hourSeries);
	    }
	  }
	  
	  /**
	   * 获得时序图的统计数据
	   * @return XYDataset 统计数据
	   */
	  private XYDataset getTimeSeriesStatDataSet() {
	    statDataset.setDomainIsPointsInTime(true);
	    return statDataset;
	  }

	  public int getDateInterval() {
	    return dateInterval;
	  }
	   //字体配置方法(解决中文问题)
	    private static void configFont(JFreeChart chart) {
	        // 配置字体
	        Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
	        Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
	        Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
	        Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
	        XYPlot plot =  chart.getXYPlot();// 图形的绘制结构对象
	       
	        // 图片标题
	        chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));

	        // 底部
//	        chart.getLegend().setItemFont(kfont);
	     // 横轴框里的标题字体
	        chart.getLegend().setItemFont(kfont);
	        // 横轴列表字体
	        plot.getDomainAxis().setTickLabelFont(kfont);
	        // 横轴小标题字体
	        plot.getDomainAxis().setLabelFont(kfont);

	        // Y 轴
	        ValueAxis rangeAxis = plot.getRangeAxis();
	        rangeAxis.setLabelFont(yfont);
	        rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
	        rangeAxis.setTickLabelFont(yfont);

	    }
	  public void setDateInterval(int dateInterval) {
	    this.dateInterval = dateInterval;
	  }
	  public static void main(String arhs[]){
		  TimeSeriesTest trendChart = new TimeSeriesTest();
		  trendChart.chartTitle = "一年走势图";
		  trendChart.chartSeriesDesc = "确认数量";
		  trendChart.chartSeriesDesc1 = "风险数量";
		  trendChart.chartXdesc = "月份";
		  trendChart.chartYdesc = "数量";
		  trendChart.graphHigh = 400;
		  trendChart.graphWidth = 600;
		  trendChart.timeFormat = "yyyy年MM月";
		  trendChart.periodType = TimeSeriesTest.MONTH;
		  
		  double baseData = 100.0;
		  double rData = baseData;
		  
		  trendChart.addTimeSeriesUnitData(2011, 11,25);
		  trendChart.addTimeSeriesUnitData(2011, 12,45);
		  trendChart.addTimeSeriesUnitData(2012, 1, 50);
		  trendChart.addTimeSeriesUnitData(2012, 2,  80);
		  trendChart.addTimeSeriesUnitData(2012, 3, 30);
		  trendChart.addTimeSeriesUnitData(2012, 4,  10);
		  
		  trendChart.addTimeSeriesUnitDataAll(2011, 11,45);
		  trendChart.addTimeSeriesUnitDataAll(2011, 12,65);
		  trendChart.addTimeSeriesUnitDataAll(2012, 1, 70);
		  trendChart.addTimeSeriesUnitDataAll(2012, 2,  90);
		  trendChart.addTimeSeriesUnitDataAll(2012, 3, 50);
		  trendChart.addTimeSeriesUnitDataAll(2012, 4, 40);
		  
		  
		  trendChart.createTread();
		  JFreeChart chart =trendChart.createTrendChart();
		  trendChart.configFont(chart);
		  final ChartFrame preview = new ChartFrame("一年走势图",chart);
		    preview.addWindowListener(new WindowAdapter() {

		         public void windowClosing(final WindowEvent event) {

		           preview.dispose();

		         }

		       });

		       preview.pack();

		       //调整预览窗口的大小和位置,适合屏幕,并且居中

//		       Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//
//		       preview.setSize(screenSize.width,screenSize.height-50);//适合屏幕,50表示把工具栏要考虑在内
//
//		       Dimension frameSize = preview.getSize();
//
//		       if (frameSize.height > screenSize.height) {
//
//		         frameSize.height = screenSize.height;
//
//		       }
//
//		       if (frameSize.width > screenSize.width) {
//
//		         frameSize.width = screenSize.width;
//
//		       }
//
//		       preview.setLocation( (screenSize.width - frameSize.width) / 2,
//
//		                  (screenSize.height - frameSize.height-50) / 2);



		       //显示报表预览窗口

		       preview.setVisible(true);
	  }

}

运行效果如图:

 

部分代码:

 DateFormat df=new SimpleDateFormat("yyyy年MM月");
	   NumberFormat nf= NumberFormat.getNumberInstance();
	   StandardXYToolTipGenerator toolg=new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,df,nf);
	   
	   renderer.setToolTipGenerator(toolg);

 

加上代码可以显示对应的图点

   XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)_xyplot.getRenderer();
	  //设置网格背景颜色
	    _xyplot.setBackgroundPaint(Color.white);
	  //设置网格竖线颜色
	    _xyplot.setDomainGridlinePaint(Color.pink);
	  //设置网格横线颜色
	    _xyplot.setRangeGridlinePaint(Color.pink);
	  //设置曲线图与xy轴的距离
	    _xyplot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));
	  //设置曲线是否显示数据点
	  xylineandshaperenderer.setBaseShapesVisible(true);
	  //设置曲线显示各数据点的值


 

抱歉!评论已关闭.