jfreechart

jfreechart目前最高版本为1.0.0版(http://www.jfree.org/jfreechart/index.html)。可以绘制
pie charts  饼图,bar charts 柱状图,line and area charts曲线图, scatter plots and bubble charts 散列图,time series 时序图,Area Charts区域图, Difference Chart差异图,Step Chart步骤图,Multiple Axis Charts 混合图,Gantt charts甘特图,combination charts 复合图
JFreeChart核心类库介绍:
jfreechart主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形
本身有关,后者与图形显示的数据有关。
核心类主要有:
org.jfree.chart.JFreeChart:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet:数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.XXXAxis:用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender:负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator:用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
对于常用的饼图阖柱状图,比较简单而且网上有很多的文章介绍,在这里就不再一一复述了,
(可以参考这篇文章http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc&me=ccid)
主要说明下另一种常见的报表,时序图,首先声明一个曲线数据****对象和曲线对象

TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();
//声明具体是曲线对象,(可根据实际情况在同一张图中显示多条曲线进行数据比对,根据实际应用情况当超过4条曲线时,就会有些乱。)
TimePeriodValues timeperiod1 = new TimePeriodValues("服务器A在线用户数量");
TimePeriodValues timeperiod2 = new TimePeriodValues("服务器B在线用户数量");
我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();
TimeSeries ts = new TimeSeries();
在生成数据集时(ts.add(new Day(day, month, year),10)))只能生成最小单位为天的横轴所以改用了TimePeriodValuesCollection
//根据当前时间取得横轴坐标,时间间隔为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<objecthash1.size();i++) {
    int hour = objecthash1.getHours();
    int count = objecthash1.getCount();
//将每一对数据(时间,数值)添加到数据****1(曲线对象1)中
    timeseries1.add(new Hour(hour, day, month, year),count);
}
for (int i =0;i<objecthash2.size();i++) {
    int hour = objecthash2.getHours();
    int count = objecthash2.getCount();
//将每一对数据(时间,数值)添加到数据****2(曲线对象2)中
    timeseries2.add(new Hour(hour, day, month, year),count);
}
//将曲线对象添加到曲线数据****对象中
timeseriescollection.addSeries(timeseries1);
timeseriescollection.addSeries(timeseries2);
//绘制报表
String title = "日在线用户统计"; //报表标题
String domain = "时间";    //x轴
String range = "用户在线数量";   //y轴
//创建时间序列图对象
JFreeChart chart = ChartFactory.createTimeSeriesChart(
title,  //报表标题
domain, //报表横轴标签
range,  //报表纵轴标签
timeseriescollection, //数据****
true,  //是否显示图例,在这里如果为true则会在图表的下方显示各条数据曲线的名称和颜色
false, // 是否生成工具
false   // 是否生成URL链接);
//将报表保存为jpg文件
ChartUtilities.saveChartAsJPEG(file, //文件保存物理路径包括路径和文件名
100,   //图片质量
chart, //图表对象
1024,  //图像宽度
768,   //图像高度
null); //显示信息
//将报表直接在页面输出
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);

String title="月在线用户统计";  //标题
String domain="时间(天)";//x轴
String range="用户在线数量";//y轴
TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();
TimePeriodValues timeseries = new TimePeriodValues( "用户数量");
timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);
timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);
timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);
timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);
JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);
当我们生成了一个报表对象时,可能需要根据实际情况来决定报表的横轴和纵轴的数值间隔,显示方式等。
可以用XYPlot xyplot = (XYPlot)chart.getPlot();来得到所有数据点的****。(其它形状图表得到的数据集对象根据实际情况造型)
得到数据点****后,我们就可以设置各条曲线的颜色,和坐标轴的距离,x轴、y轴的显示方式等等属性
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.setDefaultShapesVisible(true);  //数据点可见
xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //设置第一条曲线数据点填充为红色,如果一个图表有多条曲线可分别设置
xylineandshaperenderer.setUseFillPaint(true);    //应用

使用xyplot.getRangeAxis()得到纵轴,xyplot.getDomainAxis()得到横轴,得到后可以根据实际情况造型为自己所需要的类型。
我的图表纵轴为数值类型,横轴为时间类型,使用如下方式
NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();
DateAxis  dateaxis =   (DateAxis)xyplot.getDomainAxis();
//设置y显示方式
numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
double  rangetick = 0.1D;
numAxis.setTickUnit(new NumberTickUnit(rangetick));  //y轴单位间隔为0.1
//设置x轴显示方式
dateaxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x轴单位间隔为1天
我们还可以是将数据格式化以后显示,比如y轴显示百分比(10%~100%),x轴显示为×月×日
NumberFormat nf =NumberFormat.getPercentInstance();
numAxis.setNumberFormatOverride(nf);//设置y轴以百分比方式显示
SimpleDateFormat format = new SimpleDateFormat("MM月dd");
dateaxis.setDateFormatOverride(format);//设置x轴数据单位以×月×日方式显示
时序图中还有一个很重要的方法
timeseriescollection.setDomainIsPointsInTime(true); //x轴上的刻度点代表的是时间点而不是时间段
最开始我没有设置这个属性,结果画出来的图,老是差半格不能在这个刻度的时候准确显示,往后移了半格,就是因为JFreeChart默认这个刻度是
一个时间段,它把这个刻度和下个刻度的中间点认为是显示数据点最佳位置。

其他一些关于AXIS类的方法:
Axis类:
void setVisible(boolean flag)坐标轴是否可见
void setAxisLinePaint(Paint paint)坐标轴线条颜色(3D轴无效)
void setAxisLineStroke(Stroke stroke)坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible)坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension)(用于复合表中对多坐标轴的设置)
void setLabel(String label)坐标轴标题
void setLabelFont(Font font)坐标轴标题字体
void setLabelPaint(Paint paint)坐标轴标题颜色
void setLabelAngle(double angle)`坐标轴标题旋转角度(纵坐标可以旋转)
void setTickLabelFont(Font font)坐标轴标尺值字体
void setTickLabelPaint(Paint paint)坐标轴标尺值颜色
void setTickLabelsVisible(boolean flag)坐标轴标尺值是否显示
void setTickMarkPaint(Paint paint)坐标轴标尺颜色
void setTickMarkStroke(Stroke stroke)坐标轴标尺笔触
void setTickMarksVisible(boolean flag)坐标轴标尺是否显示
ValueAxis(Axis)类:
void setAutoRange(boolean auto)自动设置数据轴数据范围
void setAutoRangeMinimumSize(double size)自动设置数据轴数据范围时数据范围的最小跨度
void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动确定(默认为true)
void setFixedAutoRange(double length)数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)
void setInverted(boolean flag)数据轴是否反向(默认为false)
void setLowerMargin(double margin)数据轴下(左)边距
void setUpperMargin(double margin)数据轴上(右)边距
void setLowerBound(double min)数据轴上的显示最小值
void setUpperBound(double max)数据轴上的显示最大值
void setPositiveArrowVisible(boolean visible)是否显示正向箭头(3D轴无效)
void setNegativeArrowVisible(boolean visible)是否显示反向箭头(3D轴无效)
void setVerticalTickLabels(boolean flag)数据轴数据标签是否旋转到垂直
void setStandardTickUnits(TickUnitSource source)数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)
NumberAxis(ValueAxis)类:
void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag)是否强制在整个数据轴中包含0,即使0不在数据范围中
void setNumberFormatOverride(NumberFormat formatter)数据轴数据标签的显示格式
void setTickUnit(NumberTickUnit unit)数据轴的数据标签(需要将AutoTickUnitSelection设false)
DateAxis(ValueAxis)类:
void setMaximumDate(Date maximumDate)日期轴上的最小日期
void setMinimumDate(Date minimumDate)日期轴上的最大日期
void setRange(Date lower,Date upper)日期轴范围
void setDateFormatOverride(DateFormat formatter)日期轴日期标签的显示格式
void setTickUnit(DateTickUnit unit)日期轴的日期标签(需要将AutoTickUnitSelection设false)
void setTickMarkPosition(DateTickMarkPosition position)日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)
CategoryAxis(Axis)类:
void setCategoryMargin(double margin)分类轴边距
void setLowerMargin(double margin)分类轴下(左)边距
void setUpperMargin(double margin)分类轴上(右)边距
void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio)分类轴分类标签的最大宽度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值