如何用jfreechart做曲线图(转)

原文:http://blog.chinaunix.net/uid-20964486-id-1831502.html

1、首先需要下载JFreeChart包,目前最新的是jfreechart-1.0.10.jar,然后将下载的包放到WEB-INF/LIB/下面。

2、配置。web.xml文件中增加如下配置:

 

1  <servlet>
2           <servlet-name>DisplayChart</servlet-name>
3           <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
4 </servlet>
5 <servlet-mapping>
6           <servlet-name>DisplayChart</servlet-name>
7           <url-pattern>/DisplayChart</url-pattern>
8 </servlet-mapping>

 

 

3、使用。做好上面的工作后就可以使用JFreeChart了。这里我们实现使用它来做曲线图,然后在web中显示。

3-1、首先需要创建数据集合,也就是指定需要用图标显示的数据是哪些。如果是做时间曲线,则数据集合的创建方法如下:

    dataset = new TimeSeriesCollection();//时间曲线数据集合

3-2、创建数据源。

    TimeSeries s1 = new TimeSeries("历史曲线", Second.class);//创建时间数据源,每一个

                                                             //TimeSeries在图上是一条曲线

                                                             //Second.class指横轴最小间隔为秒

   s1.add(new Second(10,10,10,10,10,2009),15.5);//添加时间2009-10-10 10:10:10,纵坐标值为15.5

   s1.add(new Second(11,10,10,10,10,2009),16.5);//添加时间2009-10-10 10:10:11,纵坐标值为16.5

   s1.add(new Second(12,10,10,10,10,2009),13.5);//添加时间2009-10-10 10:10:12,纵坐标值为13.5

3-3、将数据源添加到数据集合中。

   dataset.addSeries(s1);

 

4、创建好数据源后,就接着创建JFreeChart对象,JFreeChart对象 主要可以实现对显示界面进行设置。

  JFreeChart chart = ChartFactory.createTimeSeriesChart( //创建JFreeChart对象
 "JFreeChart时间曲线序列图", // title 
 "日期", // x-axis label 
 "值", // y-axis label 
 dataset, // data (注:就是我们上面生成的数据集合)
 true, // create legend? 
 true, // generate tooltips? 
 false // generate URLs? 
 );

//设置JFreeChart的显示属性,对图形外部部分进行调整 
chart.setBackgroundPaint(Color.gray);//设置曲线图背景色

//设置字体大小,形状 
Font font = new Font("宋体", Font.BOLD, 16); 
TextTitle title = new TextTitle("趋势分析图", font); //标题
chart.setTitle(title);

//副标题 
TextTitle subtitle = new TextTitle("副标题 ", new Font("黑体", Font.BOLD, 12)); //定义副标题
chart.addSubtitle(subtitle); 
chart.setTitle(title); //标题

XYPlot plot = (XYPlot) chart.getPlot();//获取图形的画布 
plot.setBackgroundPaint(Color.lightGray);//设置网格背景色 
plot.setDomainGridlinePaint(Color.green);//设置网格竖线(Domain轴)颜色 
plot.setRangeGridlinePaint(Color.white);//设置网格横线颜色 
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));//设置曲线图与xy轴的距离 
plot.setDomainCrosshairVisible(true); 
plot.setRangeCrosshairVisible(true); 
XYItemRenderer r = plot.getRenderer();

if (r instanceof XYLineAndShapeRenderer) 
{ 
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r; 
renderer.setBaseShapesVisible(true); 
renderer.setBaseShapesFilled(true); 
} 
//设置Y轴 
NumberAxis numAxis = (NumberAxis) plot.getRangeAxis(); 
NumberFormat numFormater = NumberFormat.getNumberInstance(); 
numFormater.setMinimumFractionDigits(2); 
numAxis.setNumberFormatOverride(numFormater); 
//设置提示信息 
StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator( 
"历史信息{1} 16:00,{2})", new SimpleDateFormat("MM-dd"),numFormater); 
//设置X轴(日期轴) 
DateAxis axis = (DateAxis) plot.getDomainAxis(); 
axis.setDateFormatOverride(new SimpleDateFormat("MM-dd")); 
ChartRenderingInfo info = new ChartRenderingInfo( 
new StandardEntityCollection()); 
try 
{ 
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 350, info, 
session);//生成图片 
// Write the image map to the PrintWriter 
ChartUtilities.writeImageMap(pw, fileName, info, false); 
} 
catch (IOException e) 
{ 
e.printStackTrace(); 
} 
pw.flush(); 
return fileName;//返回生成图片的文件名 
}

将上诉代码封装在一个取名叫LineXYChart.java 的类中。

具体实现如下:

package gtmobject;

import java.awt.Color; 
import java.awt.Font; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.text.NumberFormat; 
import java.text.SimpleDateFormat; 
import java.util.List;

import javax.servlet.http.HttpSession; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartRenderingInfo; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.DateAxis; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.entity.StandardEntityCollection; 
import org.jfree.chart.labels.StandardXYToolTipGenerator; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.chart.servlet.ServletUtilities; 
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle; 
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.ui.RectangleInsets;

/** 
* 曲线图的绘制 
*/ 
public class LineXYChart 
{ 
/** 
* 返回生成图片的文件名 
* @param session 
* @param pw 
* @return 生成图片的文件名 
*/ 
private TimeSeriesCollection dataset = null;
public String getLineXYChart(HttpSession session, PrintWriter pw) 
{ 
XYDataset dataset = this.dataset;//建立数据集 
String fileName = null; 
//建立JFreeChart 
JFreeChart chart = ChartFactory.createTimeSeriesChart( 
"JFreeChart时间曲线序列图", // title 
"日期", // x-axis label 
"值", // y-axis label 
dataset, // data 
true, // create legend? 
true, // generate tooltips? 
false // generate URLs? 
); 
//设置JFreeChart的显示属性,对图形外部部分进行调整 
chart.setBackgroundPaint(Color.gray);//设置曲线图背景色 
//设置字体大小,形状 
Font font = new Font("宋体", Font.BOLD, 16); 
TextTitle title = new TextTitle("趋势分析图", font); 
chart.setTitle(title); 
//副标题 
TextTitle subtitle = new TextTitle("", new Font("黑体", Font.BOLD, 12)); //定义副标题
chart.addSubtitle(subtitle); 
chart.setTitle(title); //标题 
//设置图示标题字符 
//TimeSeries s1 = new TimeSeries("历史曲线", Day.class);该中文字符 
LegendTitle legengTitle = chart.getLegend(); 
legengTitle.setItemFont(font); 
XYPlot plot = (XYPlot) chart.getPlot();//获取图形的画布 
plot.setBackgroundPaint(Color.lightGray);//设置网格背景色 
plot.setDomainGridlinePaint(Color.green);//设置网格竖线(Domain轴)颜色 
plot.setRangeGridlinePaint(Color.white);//设置网格横线颜色 
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));//设置曲线图与xy轴的距离 
plot.setDomainCrosshairVisible(true); 
plot.setRangeCrosshairVisible(true); 
XYItemRenderer r = plot.getRenderer(); 
if (r instanceof XYLineAndShapeRenderer) 
{ 
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r; 
renderer.setBaseShapesVisible(true); 
renderer.setBaseShapesFilled(true); 
} 
//设置Y轴 
NumberAxis numAxis = (NumberAxis) plot.getRangeAxis(); 
NumberFormat numFormater = NumberFormat.getNumberInstance(); 
numFormater.setMinimumFractionDigits(2); 
numAxis.setNumberFormatOverride(numFormater); 
//设置提示信息 
StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator( 
"历史信息{1} 16:00,{2})", new SimpleDateFormat("MM-dd"),numFormater); 
//设置X轴(日期轴) 
DateAxis axis = (DateAxis) plot.getDomainAxis(); 
axis.setDateFormatOverride(new SimpleDateFormat("MM-dd")); 
ChartRenderingInfo info = new ChartRenderingInfo( 
new StandardEntityCollection()); 
try 
{ 
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 350, info, 
session);//生成图片 
// Write the image map to the PrintWriter 
ChartUtilities.writeImageMap(pw, fileName, info, false); 
} 
catch (IOException e) 
{ 
e.printStackTrace(); 
} 
pw.flush(); 
return fileName;//返回生成图片的文件名 
} 
/** 
* 建立生成图形所需的数据集 
* @return 返回数据集 
*/ 
public void createDateSet(List date,List vl) 
{ 
dataset = new TimeSeriesCollection();//时间曲线数据集合 
TimeSeries s1 = new TimeSeries("历史曲线", Second.class);//创建时间数据源,每一个//TimeSeries在图上是一条曲线 
//s1.add(new Day(day,month,year),value),添加数据点信息 
String strdate=null;
int mh;
int dy;
int hr;
int mt;
int sd;
int yr;
for(int i=0;i<date.size();i++)
{
 if(dateJudge(String.valueOf(date.get(i))))//判断是否为日期
 {
  try{
  yr=Integer.parseInt(String.valueOf(date.get(i)).substring(0,4));//年
  strdate=String.valueOf(date.get(i)).substring(5);
  mh=Integer.parseInt(howGet(strdate,"-"));//月 判断日期的格式来截取数值,如‘2009-9-9 9:9:0’ 和‘2009-09-09 09:09:00‘
  strdate=substr(strdate,"-");
  dy=Integer.parseInt(howGet(strdate," "));//日
  strdate=substr(strdate," ");
  hr=Integer.parseInt(howGet(strdate,":"));//小时
  strdate=substr(strdate,":");
  mt=Integer.parseInt(howGet(strdate,":"));//分钟
  strdate=substr(strdate,":");
  sd=Integer.parseInt(strdate);//秒
  s1.add(new Second(sd,mt,hr,dy,mh,yr),Float.parseFloat(String.valueOf(vl.get(i))));
  }
  catch(Exception e)
  {
   e.printStackTrace(); 
  }
 }
 
}
this.dataset.addSeries(s1); 
}

public boolean dateJudge(String strDate)//判断是否为日期
{
 boolean flag=false;
 if(strDate.indexOf("-")>0)
 {
  strDate=strDate.substring(strDate.indexOf("-")+1);
  if(strDate.indexOf("-")>0)
  {
   strDate=strDate.substring(strDate.indexOf("-")+1);
   if(strDate.indexOf(" ")>0)
   {
    strDate=strDate.substring(strDate.indexOf(" ")+1);
    if(strDate.indexOf(":")>0)
    {   
     strDate=strDate.substring(strDate.indexOf(":")+1);  
                    if(strDate.indexOf(":")>0)
                    {
                     flag=true;
         return flag;                    
                    }     
    }
   }
  }
 }
 return flag;
}
public String howGet(String need,String sign)
{   
 switch(need.indexOf(sign))
 {
 case 1:
  need=need.substring(0,1);
        break;
 case 2:
  need=need.substring(0,2);
  break;
 default:
  need=null;
     break;
 } 
 return need;
}
public String substr(String datestr,String sign)
{
 switch(datestr.indexOf(sign))
 {
 case 1:
  datestr=datestr.substring(2);
  break;
 case 2:
  datestr=datestr.substring(3);
  break;
 default:
  datestr=null;
     break;
 }  
 return datestr;
}
} 
该类的createDateSet(List date,List vl) 实现的是从data中获取时间日期数据,从vl中获取值。

getLineXYChart(HttpSession session, PrintWriter pw) 实现对显示图形界面的设置。

5、最后一步就是实现对刚刚生成的曲线图形在web上显示出来,如何让生成的图形在web中显示出来了?这个实现的方法是先在服务器端根据刚刚createDateSet(List date,List vl)得到的数据和getLineXYChart(HttpSession session, PrintWriter pw)对图形的设置最后生成该图形,然后在客户端获得该生成图形的URL下载到客户端显示出来。具体实现代码如下:

<%@ page contentType="text/html;charset=GBK" %>

<%@ page import    = "LineXYChart类的URL" %>

<html>

<head>

</head>

<body>

LineXYChart xyChart=new LineXYChart();//创建LineXYChart 对象。

       xyChart.createDateSet(dt,vl);//添加数据集合
          String fileName=xyChart.getLineXYChart(session,new PrintWriter(out));//创建画布并设置
          String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;

//获取生成的图形的URL;
     %>
     <br/>
       <P ALIGN="CENTER"> 
            <img src="<%=graphURL %>" id=img name=img width=600 height=350 border=0 usemap="<%=fileName %>"> 
         </P> 

</body>

</html>

转载于:https://www.cnblogs.com/jiangyaqiong/p/3414755.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值