JFreeChart图像报表教程- 带图

jfreechart是jfree公司提供的一个Java项目,它主要用来实现各种图表,包括:饼图,柱状图(普通柱状图和堆栈柱状图),折线图,区域图,分布图,混合图,甘特图,以及一些仪表盘等。

官方网站:http://jfree.org/。

pie 饼图,line折线图,bar柱状图,gantt甘特图,xy plots and scatter plots,timer series, high/low/open/close charts and candle stick chart, combination charts, pareto charts, bubble charts, wind plots, meter charts and symbol charts

在使用jfreechart时,一般先通过ChartFactory中的静态方法生成一个JFreeChart对象,然后调用ChartUtilities类中的方法将JFreeChart导出成图片。

JFreeChart的问题估计就在结构的复杂性,每种类型的图表都需要使用对应的DataSet和Plot才能生成出来,开发者必须掌握这些模型和结构之间的关系才能生成出计划中的图表来。

factory模式让JFreeChart不是很容易扩展,多种数据模型和设计模型散乱着放在几个包中,实话说真是太难找了。

JFreeChart还自带一系列的中文乱码问题,必须重新指定所有标签部分的字体才能解决乱码问题。

cewolf是一套可以使用taglib生成JFreeChart的标签库。

JFreeChart还支持servlet生成图表,更多时候可以在swing里直接显示图片。JFreeChart还提供了其他工具类,用来生成可以辅助图表的一些功能,比如ImageMap。

[java]  view plain  copy
 print ?
  1. createPieChart  
  2. createMultiplePieChart  
  3. createPieChart3D  
  4. createMultiplePieChart3D  
  5. createRingChart  
  6.   
  7. createBarChart  
  8. createStackedBarChart  
  9. createBarChart3D  
  10. createStackedBarChart3D  
  11.   
  12. createAreaChart  
  13. createStackedAreaChart  
  14.   
  15. createLineChart  
  16. createLineChart3D  
  17.   
  18. createGanttChart  
  19. createWaterfallChart  
  20. createPolarChart  
  21. createScatterPlot  
  22.   
  23. createXYBarChart  
  24. createXYAreaChart  
  25. createStackedXYAreaChart  
  26. createXYLineChart  
  27. createXYStepChart  
  28. createXYStepAreaChart  
  29.   
  30. createTimeSeriesChart  
  31. createCandlestickChart  
  32. createHighLowChart  
  33. createBubbleChart  
  34. createHistogram  
  35. createBoxAndWhiskerChart  
  36. createWindPlot  
  37. createWaferMapChart  

图表JFreeChart

2.1. 简单柱状图

首先为柱状图准备数据,柱状图必须使用CategoryDataset,这里我们使用DefaultCategoryDataset。

 

[java]  view plain  copy
 print ?
  1. DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
  2. dataset.addValue(100,"<a href="http://lib.csdn.net/base/javaee" class='replace_word' title="Java EE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>spring</a> Security","Jan");  
  3. dataset.addValue(200,"jBPM 4","Jan");  
  4. dataset.addValue(300,"Ext JS","Jan");  
  5. dataset.addValue(400,"JFreeChart","Jan");  

 

每调用一次addValue()就会向Dataset中添加一条数据,在图表中看来就是一个柱状矩形,第一个参数100是柱状矩形的长度,第二个参数表示数据的名称,,第三个参数表示数据的分类。

有了图表数据,下一步使用这些数据创建一个柱状图表。

 

 

[java]  view plain  copy
 print ?
  1. JFreeChart chart = ChartFactory.createBarChart(  
  2.    "chart",// 标题  
  3.    "num",// 横轴名称  
  4.    "type",// 纵轴名称  
  5.    dataset,// 数据  
  6.    PlotOrientation.VERTICAL,// 使用垂直柱状图  
  7.    true,// 是否使用legend   
  8.    false,// 是否使用tooltip   
  9.    false // 是否使用url链接  
  10. );  

 

最后使用ChartUtilities将chart导出为PNG图片。

 

[java]  view plain  copy
 print ?
  1. FileOutputStream fos = null;  
  2.   
  3. try {  
  4.    fos = new FileOutputStream("target/bar1.png");  
  5.    ChartUtilities.writeChartAsPNG(fos,chart,400,300);  
  6. } finally {  
  7.    fos.close();  
  8. }  

图 2.1. 简单柱状图

 

完整代码如下所示:

[java]  view plain  copy
 print ?
  1. DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
  2. dataset.addValue(100,"Spring Security","Jan");  
  3. dataset.addValue(200,"jBPM 4","Jan");  
  4. dataset.addValue(300,"Ext JS","Jan");  
  5. dataset.addValue(400,"JFreeChart","Jan");  
  6.   
  7. JFreeChart chart = ChartFactory.createBarChart("chart","num",  
  8.     "type",dataset,PlotOrientation.VERTICAL,true,false,  
  9.     false);  
  10. FileOutputStream fos = null;  
  11.   
  12. try {  
  13.   fos = new FileOutputStream("target/bar1.png");  
  14.   ChartUtilities.writeChartAsPNG(fos,chart,400,300);  
  15. } finally {  
  16.   fos.close();  
  17. }   

 

2.2. 水平柱状图

把PlotOrientation.VERTICAL改成PlotOrientation.HORIZONTAL,柱状图就从竖直的变成了水平的。

 

 

图 2.2. 水平柱状图

2.3. 三维柱状图

使用createBarChart3D就会生成三维柱状图。

 

2.4. 分组柱状图

DefaultCategoryDataset支持分组统计,我们只需要在addValue()时为数据指定分组类型,显示柱状图时会自动根据类别分组显示。

 

[java]  view plain  copy
 print ?
  1. dataset.addValue(100,"Spring Security","Jan");  
  2. dataset.addValue(200,"jBPM 4","Jan");  
  3. dataset.addValue(300,"Ext JS","Jan");  
  4. dataset.addValue(100,"JFreeChart","Jan");  
  5. dataset.addValue(60,"Spring Security","Fer");  
  6. dataset.addValue(100,"jBPM 4","Fer");  
  7. dataset.addValue(340,"Ext JS","Fer");  
  8. dataset.addValue(130,"JFreeChart","Fer");  

效果如图:

图 2.4. 分组柱状图

2.5. 负向坐标

为dataset添加一个负值,就可以在图标上显示出负向坐标了。

dataset.addValue(-20,"Ext JS","Jan");

 

 

图 2.5. 负向坐标

TODO

SlidingCategoryDataset

IntervalBar

LayeredBar

survey

设置Label

隐藏axis

中文

背景颜色

 

 

 

3.1. 简单饼图

饼图必须使用DefaultPieDataset为图表提供数据。

 

[java]  view plain  copy
 print ?
  1. DefaultPieDataset dataset = new DefaultPieDataset();  
  2. dataset.setValue("Spring Security", 100);  
  3. dataset.setValue("jBPM 4", 200);  
  4. dataset.setValue("Ext JS", 300);  
  5. dataset.setValue("JFreeChart", 100);  

 

这次我们使用setValue向dataset中添加数据,第一个参数是数据的名称,第二个数据是数据的值。

这里就暴露出JFreeChart的一个问题,竟然不能使用统一的dataset接口来设置数据。

下一步通过CharFactory的createPieChart方法创建饼图。

 

[java]  view plain  copy
 print ?
  1. JFreeChart chart = ChartFactory.createPieChart(  
  2.    "chart", // 标题  
  3.    dataset, // 数据  
  4.    true, // 是否使用legend  
  5.    false, // 是否使用tooltip  
  6.    false // 是否使用url链接  
  7. );  

 

最后使用CharUtilities将JFreeChart导出成图片。

 

完整代码如下所示:

 

[java]  view plain  copy
 print ?
  1. DefaultPieDataset dataset = new DefaultPieDataset();  
  2. dataset.setValue("Spring Security", 100);  
  3. dataset.setValue("jBPM 4", 200);  
  4. dataset.setValue("Ext JS", 300);  
  5. dataset.setValue("JFreeChart", 100);  
  6.   
  7. JFreeChart chart = ChartFactory.createPieChart("chart", dataset,  
  8.      true, false, false);  
  9. FileOutputStream fos = null;  
  10.   
  11. try {  
  12.    fos = new FileOutputStream("target/pie1.png");  
  13.    ChartUtilities.writeChartAsPNG(fos, chart, 400, 300);  
  14. } finally {  
  15.    fos.close();  
  16. }  

 

3.2. 炸开的饼图

把饼图中的某一部分提取出来,强调显示。

调用PiePlot中的setExplodePercent方法来实现这一功能。

 

[java]  view plain  copy
 print ?
  1. PiePlot plot = (PiePlot) chart.getPlot();  
  2. plot.setExplodePercent("JFreeChart", 0.3);  

 

这里又暴露出一个JFreeChart里的问题,获得Plot也要强制转换成对应的类型才能使用。

 

图 3.2. 炸开的饼图

3.3. 处理空值和负值

如果设置了值为0或null的值,图表中会显示标签,但是我们看不到数值。

 

[java]  view plain  copy
 print ?
  1. dataset.setValue("null", null);  
  2. dataset.setValue("zero", 0);  

 

图 3.3. 空值和负值

如果不希望在图表中显示为空的数据,需要调用PiePlot的两个方法。

 

[java]  view plain  copy
 print ?
  1. plot.setIgnoreZeroValues(true);  
  2. plot.setIgnoreNullValues(true);  

 

JFreeChart会一直忽略负值,不需要特殊处理就不会显示在图表中。

 

3.4. 三维饼图

将createPieChart替换为createPieChart3D就可以实现三维饼图。

图 3.4. 三维饼图

3.5. 多重饼图

要想使用多重饼图,必须先把PieDataset改成CategoryDataset。

 

[java]  view plain  copy
 print ?
  1. DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
  2. dataset.addValue(100, "Spring Security", "Jan");  
  3. dataset.addValue(200, "jBPM 4", "Jan");  
  4. dataset.addValue(300, "Ext JS", "Jan");  
  5. dataset.addValue(100, "JFreeChart", "Jan");  
  6. dataset.addValue(60, "Spring Security", "Fer");  
  7. dataset.addValue(100, "jBPM 4", "Fer");  
  8. dataset.addValue(340, "Ext JS", "Fer");  
  9. dataset.addValue(130, "JFreeChart", "Fer");  

 

第二步,使用createMultiplePieChart生成多重报表。

[java]  view plain  copy
 print ?
  1. JFreeChart chart = ChartFactory.createMultiplePieChart(  
  2.    "chart",  
  3.    dataset,  
  4.    TableOrder.BY_COLUMN, // 按列分割饼图,addValue中的第三个参数  
  5.    true,  
  6.    false,  
  7.    false  
  8. );  

 

图 3.5. 多重报表

TODO:

color

outlines

label

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值