`
zhaoshg
  • 浏览: 259556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用JfreeChart画曲线走势图

    博客分类:
  • java
阅读更多
import java.awt.Color;
import java.io.IOException;
import java.text.SimpleDateFormat;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.jfree.chart.ChartFactory;
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.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
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.RectangleInsets;
/**
 * 用于将统计结果显示成走势图
 * @author lord
 * 调用方法:
   TrendChart trendChart = new TrendChart();
   trendChart.chartTitle = "走势图";
   trendChart.chartSeriesDesc = "走势曲线";
   trendChart.chartXdesc = "时间";
   trendChart.chartYdesc = "价格";
   trendChart.graphHigh = 400;
   trendChart.graphWidth = 600;
   trendChart.timeFormat = "yyyy-MM";
   trendChart.periodType = TrendChart.DAY;
   ......
   trendChart.addTimeSeriesUnitData(mYear, mMonth, mDay, mHour, (int)rData);
   trendChart.createTrendGraphByServlet(request, response);
 */
public class TrendChart {
  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 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 = 0;
  //统计结果数据集
  TimeSeriesCollection statDataset = new TimeSeriesCollection();
  TimeSeries monthSeries = null;  //月份统计图数据集合
  TimeSeries daySeries = null;    //天数统计图数据集合
  TimeSeries hourSeries = null;   //小时统计图数据集合
  /**
   * 创建Servlet方式走势图表
   * @param req
   * @param res
   * @throws IOException
   */
  public void createTrendGraphByServlet(ServletRequest req, ServletResponse res) throws IOException {
    res.setContentType("image/jpeg");
    setTimeSeriesStatType();
    rChart = createTrendChart();
    ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1, rChart, graphWidth, graphHigh, null);
  }
  /**
   * 创建趋势图表
   * @return JFreeChart 图表对象JFreeChart
   */
  private JFreeChart createTrendChart(){
    JFreeChart _freeChart = ChartFactory.createTimeSeriesChart(chartTitle, chartXdesc, chartYdesc,
        getTimeSeriesStatDataSet(), true, false, false);
    _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));
    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 day, int hour, int statData) {
    if (periodType.equalsIgnoreCase("MONTH")){
      if (monthSeries == null){
        monthSeries = new TimeSeries(chartSeriesDesc, Month.class);
      }
      monthSeries.add(new Month(month, year), statData);
    }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 区间类型
   */
  private void setTimeSeriesStatType() {
    if (periodType.equalsIgnoreCase("MONTH")){
      statDataset.addSeries(monthSeries);
    }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;
  }

  public void setDateInterval(int dateInterval) {
    this.dateInterval = dateInterval;
  }
 

JSP调用代码如下:

 TrendChart trendChart = new TrendChart();
 trendChart.chartTitle = "一年走势图";
 trendChart.chartSeriesDesc = "走势曲线";
 trendChart.chartXdesc = "时间";
 trendChart.chartYdesc = "价格";
 trendChart.graphHigh = 400;
 trendChart.graphWidth = 600;
 trendChart.timeFormat = "yyyy-MM";
 trendChart.periodType = TrendChart.DAY;
 double baseData = 100.0;
 double rData = baseData;
 java.util.Calendar calendar = java.util.Calendar.getInstance();
 calendar.set(2007, 0, 0);
 for (int i = 1; i <= 365; i++){
  rData = rData * (1 + (Math.random() - 0.495) / 10.0);
  calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
  System.out.println(calendar.get(java.util.Calendar.YEAR) + "||" +
   (calendar.get(java.util.Calendar.MONTH) + 1) + "||" + calendar.get(java.util.Calendar.DAY_OF_MONTH) + "||" +
   (calendar.get(java.util.Calendar.HOUR_OF_DAY) + "||" + calendar.get(java.util.Calendar.MINUTE))
  );
  int mYear = calendar.get(java.util.Calendar.YEAR);
  int mMonth = calendar.get(java.util.Calendar.MONTH) + 1;
  int mDay = calendar.get(java.util.Calendar.DAY_OF_MONTH);
  int mHour = calendar.get(java.util.Calendar.HOUR_OF_DAY);
  trendChart.addTimeSeriesUnitData(mYear, mMonth, mDay, mHour, (int)rData);
 }
trendChart.createTrendGraphByServlet(request, response);

 

 

 

显示图结果如下:

  • 大小: 20.4 KB
分享到:
评论

相关推荐

    JFreeChart画曲线图

    在本示例中,我们将重点关注如何使用JFreeChart绘制曲线图,以及如何在数据点上显示具体的数据值。 首先,要使用JFreeChart,你需要在项目中引入其相关的jar文件。这个压缩包中包含的"jfreechartDemo"可能是一个...

    jfreechart各类曲线图JSP代码

    JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。本文将通过引领...

    applet_+_JfreeChart_实现曲线走势图

    本项目结合Applet和JFreeChart,目的是实现在网页上动态展示曲线走势图。 首先,理解Applet的基本概念是必要的。Applet是Java平台早期的一种特性,允许开发者创建可以在浏览器中运行的交互式小程序。为了在网页上...

    java中关于JFreeChart实现实时曲线图

    本文将基于提供的代码片段,深入探讨如何使用JFreeChart实现实时更新的曲线图。 ### 实现原理 在Java中使用JFreeChart创建实时曲线图,主要涉及以下几个关键步骤: 1. **创建时间序列(Time Series)**:时间序列...

    使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP

    《使用JFreeChart生成曲线、柱状图、饼状图、分布图展示到JSP》 JFreeChart是一个强大的Java库,它允许开发者创建各种类型的图表,包括曲线图、柱状图、饼状图和分布图等。在当前JS图表库盛行的时代,JFreeChart...

    java里用JFreeChart画柱状图、折线图、雷达图

    在JFreeChart中,`PolarChartDemo1`类提供了一个示例,创建`StandardPolarItemRenderer`渲染器,通过`PolarPlot`和`PolarAxis`设置数据和轴的属性,然后使用`createPolarChart()`方法构建雷达图。 4. **Test.java**...

    利用jFreeChart做曲线图、饼状图、柱状图

    jFreeChart是java编程语言中一个功能强大、开源免费的图表库,能够生成各种类型的图表,包括曲线图、饼状图、柱状图等。通过jFreeChart,可以快速地生成高质量的图表,以满足不同领域的需求。 jFreeChart核心对象类...

    JSP+JFreeChart 实现曲线图、柱形图

    在IT行业中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而JFreeChart则是一个强大的Java图表库,能够生成各种类型的图表,包括曲线图和柱形图。本项目结合两者,旨在实现数据可视化,使得Web应用可以...

    JfreeChart画双Y轴折线图

    在本篇博客中,"JfreeChart画双Y轴折线图"的主题,将探讨如何使用JFreeChart库来创建具有两个独立Y轴的折线图,这对于显示不同尺度或单位的数据对比非常有用。 首先,我们需要了解JFreeChart的基本结构。JFreeChart...

    JFreeChart画雷达图

    首先,让我们了解如何使用JFreeChart来创建基本的雷达图。在JFreeChart中,你需要创建一个`CategoryDataset`来存储你的数据,这个数据集可以包含多个系列(series)和每个系列中的多个类别(categories)。对于雷达...

    jfreechart曲线图

    要创建一个与Oracle数据库连接的曲线图,首先需要从数据库中获取数据,然后使用JFreeChart将这些数据转化为可视化的图形。 以下是一个简单的步骤概述: 1. **数据获取**:使用JDBC(Java Database Connectivity)...

    jfreechart绘制的风速风向玫瑰图

    本文主要介绍如何使用jfreechart绘制风速风向玫瑰图。 首先,了解jfreechart的基本结构。jfreechart的核心是ChartFactory,它提供了许多种类的图表的工厂方法。例如,createPolarChart方法可以创建一个极坐标图。...

    jfreechart 柱状图、曲线图、饼图经

    JFreeChart是一款强大的Java图形库,它为开发者提供了丰富的图表类型,包括柱状图、曲线图和饼图等,使得在Java应用中展示数据变得更加直观和美观。在本篇文章中,我们将深入探讨如何利用JFreeChart来创建这些图表,...

    JFreeChart实现实时曲线图

    在使用JFreeChart实现实时曲线图之前,需要了解JFreeChart的一些基本概念。JFreeChart是一个基于Java的图表库,提供了丰富的图表类型和自定义功能。下面是一些基本概念: * `JFreeChart`:JFreeChart的核心类,负责...

    java使用JFreeChart制作柱形图

    Java 使用 JFreeChart 创建柱形图是一种常见的数据可视化方法,尤其在数据分析和Web应用程序中。JFreeChart 是一个强大的开源库,它提供了多种图表类型,包括柱形图、饼图、线图等,使得开发者能够方便地将数据转化...

    使用JFREECHART画K线图实例

    没啥说的...比较有用

    用jfreechart实现的动态曲线

    用jfreechart实现动态曲线,有系统产生随机数,然后画出曲线,并能实时显示曲线

    jfreechart 绘制横向立体柱状图

    利用jfreechart绘制的横向立体柱状图,横坐标是数值,纵坐标是数据分类,需要提前引入jfreechart包文件到工程里,才不会报错

    JFREECHART画K线图

    K线图的实例哦,这个好点,那个我乱改拉``

Global site tag (gtag.js) - Google Analytics