JFreeChart运用

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

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

  <servlet>
          
<servlet-name>DisplayChart</servlet-name>
          
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
          
<servlet-name>DisplayChart</servlet-name>
          
<url-pattern>/DisplayChart</url-pattern>
</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 vom;
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 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.Day;
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 生成图片的文件名
*/
public String getLineXYChart(HttpSession session, PrintWriter pw)
{
XYDataset dataset = this.createDateSet();//建立数据集
String fileName = null;
//建立JFreeChart
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"JFreeChart时间曲线序列图", // title
"Date", // x-axis label
"Price", // y-axis label
dataset, // data
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
//设置JFreeChart的显示属性,对图形外部部分进行调整
chart.setBackgroundPaint(Color.orange);//设置曲线图背景色
//设置字体大小,形状
Font font = new Font("宋体", Font.BOLD, 16);
TextTitle title = new TextTitle("JFreeChart时间曲线序列图", 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);
renderer.setShapesVisible(true);//设置曲线是否显示数据点
}
//设置Y轴
NumberAxis numAxis = (NumberAxis) plot.getRangeAxis();
NumberFormat numFormater = NumberFormat.getNumberInstance();
numFormater.setMinimumFractionDigits(2);
numAxis.setNumberFormatOverride(numFormater);
// numAxis.setAutoRangeIncludesZero(true); // 设置刻度必须从0开始


//设置提示信息
StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator(
"历史信息{1} 16:00,{2})", new SimpleDateFormat("MM-dd"),numFormater);
r.setToolTipGenerator(tipGenerator);

//设置X轴(日期轴)
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
try
{
fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, 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 返回数据集
*/
private XYDataset createDateSet()
{
TimeSeriesCollection dataset = new TimeSeriesCollection();//时间曲线数据集合
TimeSeries s1 = new TimeSeries("历史曲线", Day.class);//创建时间数据源,每一个//TimeSeries在图上是一条曲线
TimeSeries s2 = new TimeSeries("现在", Day.class);
//s1.add(new Day(day,month,year),value),添加数据点信息

s1.add(new Day(1, 2, 2006), 123.51);
s1.add(new Day(2, 2, 2006), 122.1);
s1.add(new Day(3, 2, 2006), 120.86);
s1.add(new Day(4, 2, 2006), 122.50);
s1.add(new Day(5, 2, 2006), 123.12);
s1.add(new Day(6, 2, 2006), 123.9);
s1.add(new Day(7, 2, 2006), 124.47);
s1.add(new Day(8, 2, 2006), 124.08);
s1.add(new Day(9, 2, 2006), 123.55);
s1.add(new Day(10, 2, 2006), 122.53);


s2.add(new Day(1, 2, 2006), 124.50);
s2.add(new Day(2, 2, 2006), 124.50);
s2.add(new Day(3, 2, 2006), 124.50);
s2.add(new Day(4, 2, 2006), 124.50);
s2.add(new Day(5, 2, 2006), 124.50);
s2.add(new Day(6, 2, 2006), 124.50);
s2.add(new Day(7, 2, 2006), 124.50);
s2.add(new Day(8, 2, 2006), 124.50);
s2.add(new Day(9, 2, 2006), 124.50);
s2.add(new Day(10, 2, 2006), 124.50);
dataset.addSeries(s2);
dataset.addSeries(s1);
dataset.setDomainIsPointsInTime(true);
return dataset;
}
}

 

 

 

该类的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=gb2312" pageEncoding="GB2312"%>
<%@ page import="vom.LineXYChart"%>
<%@ page import = "java.io.PrintWriter" %>
<%
LineXYChart xyChart=new LineXYChart();
String fileName=xyChart.getLineXYChart(session,new PrintWriter(out));
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;
%>
<html>
</head>
<title> JFreeChart使用例子</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="<%= fileName %>">
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值