文章转自--http://blog.csdn.net/qiailin/article/details/6111281
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。
- createPieChart
- createMultiplePieChart
- createPieChart3D
- createMultiplePieChart3D
- createRingChart
- createBarChart
- createStackedBarChart
- createBarChart3D
- createStackedBarChart3D
- createAreaChart
- createStackedAreaChart
- createLineChart
- createLineChart3D
- createGanttChart
- createWaterfallChart
- createPolarChart
- createScatterPlot
- createXYBarChart
- createXYAreaChart
- createStackedXYAreaChart
- createXYLineChart
- createXYStepChart
- createXYStepAreaChart
- createTimeSeriesChart
- createCandlestickChart
- createHighLowChart
- createBubbleChart
- createHistogram
- createBoxAndWhiskerChart
- createWindPlot
- createWaferMapChart
图表JFreeChart
2.1. 简单柱状图
首先为柱状图准备数据,柱状图必须使用CategoryDataset,这里我们使用DefaultCategoryDataset。
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100,"Spring Security","Jan");
- dataset.addValue(200,"jBPM 4","Jan");
- dataset.addValue(300,"Ext JS","Jan");
- dataset.addValue(400,"JFreeChart","Jan");
每调用一次addValue()就会向Dataset中添加一条数据,在图表中看来就是一个柱状矩形,第一个参数100是柱状矩形的长度,第二个参数表示数据的名称,,第三个参数表示数据的分类。
有了图表数据,下一步使用这些数据创建一个柱状图表。
- JFreeChart chart = ChartFactory.createBarChart(
- "chart",// 标题
- "num",// 横轴名称
- "type",// 纵轴名称
- dataset,// 数据
- PlotOrientation.VERTICAL,// 使用垂直柱状图
- true,// 是否使用legend
- false,// 是否使用tooltip
- false // 是否使用url链接
- );
最后使用ChartUtilities将chart导出为PNG图片。
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream("target/bar1.png");
- ChartUtilities.writeChartAsPNG(fos,chart,400,300);
- } finally {
- fos.close();
- }
图 2.1. 简单柱状图
完整代码如下所示:
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100,"Spring Security","Jan");
- dataset.addValue(200,"jBPM 4","Jan");
- dataset.addValue(300,"Ext JS","Jan");
- dataset.addValue(400,"JFreeChart","Jan");
- JFreeChart chart = ChartFactory.createBarChart("chart","num",
- "type",dataset,PlotOrientation.VERTICAL,true,false,
- false);
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream("target/bar1.png");
- ChartUtilities.writeChartAsPNG(fos,chart,400,300);
- } finally {
- fos.close();
- }
2.2. 水平柱状图
把PlotOrientation.VERTICAL改成PlotOrientation.HORIZONTAL,柱状图就从竖直的变成了水平的。
图 2.2. 水平柱状图
2.3. 三维柱状图
使用createBarChart3D就会生成三维柱状图。
2.4. 分组柱状图
DefaultCategoryDataset支持分组统计,我们只需要在addValue()时为数据指定分组类型,显示柱状图时会自动根据类别分组显示。
- dataset.addValue(100,"Spring Security","Jan");
- dataset.addValue(200,"jBPM 4","Jan");
- dataset.addValue(300,"Ext JS","Jan");
- dataset.addValue(100,"JFreeChart","Jan");
- dataset.addValue(60,"Spring Security","Fer");
- dataset.addValue(100,"jBPM 4","Fer");
- dataset.addValue(340,"Ext JS","Fer");
- 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为图表提供数据。
- DefaultPieDataset dataset = new DefaultPieDataset();
- dataset.setValue("Spring Security", 100);
- dataset.setValue("jBPM 4", 200);
- dataset.setValue("Ext JS", 300);
- dataset.setValue("JFreeChart", 100);
这次我们使用setValue向dataset中添加数据,第一个参数是数据的名称,第二个数据是数据的值。
这里就暴露出JFreeChart的一个问题,竟然不能使用统一的dataset接口来设置数据。
下一步通过CharFactory的createPieChart方法创建饼图。
- JFreeChart chart = ChartFactory.createPieChart(
- "chart", // 标题
- dataset, // 数据
- true, // 是否使用legend
- false, // 是否使用tooltip
- false // 是否使用url链接
- );
最后使用CharUtilities将JFreeChart导出成图片。
完整代码如下所示:
- DefaultPieDataset dataset = new DefaultPieDataset();
- dataset.setValue("Spring Security", 100);
- dataset.setValue("jBPM 4", 200);
- dataset.setValue("Ext JS", 300);
- dataset.setValue("JFreeChart", 100);
- JFreeChart chart = ChartFactory.createPieChart("chart", dataset,
- true, false, false);
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream("target/pie1.png");
- ChartUtilities.writeChartAsPNG(fos, chart, 400, 300);
- } finally {
- fos.close();
- }
3.2. 炸开的饼图
把饼图中的某一部分提取出来,强调显示。
调用PiePlot中的setExplodePercent方法来实现这一功能。
- PiePlot plot = (PiePlot) chart.getPlot();
- plot.setExplodePercent("JFreeChart", 0.3);
这里又暴露出一个JFreeChart里的问题,获得Plot也要强制转换成对应的类型才能使用。
图 3.2. 炸开的饼图
3.3. 处理空值和负值
如果设置了值为0或null的值,图表中会显示标签,但是我们看不到数值。
- dataset.setValue("null", null);
- dataset.setValue("zero", 0);
图 3.3. 空值和负值
如果不希望在图表中显示为空的数据,需要调用PiePlot的两个方法。
- plot.setIgnoreZeroValues(true);
- plot.setIgnoreNullValues(true);
JFreeChart会一直忽略负值,不需要特殊处理就不会显示在图表中。
3.4. 三维饼图
将createPieChart替换为createPieChart3D就可以实现三维饼图。
图 3.4. 三维饼图
3.5. 多重饼图
要想使用多重饼图,必须先把PieDataset改成CategoryDataset。
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100, "Spring Security", "Jan");
- dataset.addValue(200, "jBPM 4", "Jan");
- dataset.addValue(300, "Ext JS", "Jan");
- dataset.addValue(100, "JFreeChart", "Jan");
- dataset.addValue(60, "Spring Security", "Fer");
- dataset.addValue(100, "jBPM 4", "Fer");
- dataset.addValue(340, "Ext JS", "Fer");
- dataset.addValue(130, "JFreeChart", "Fer");
第二步,使用createMultiplePieChart生成多重报表。
- JFreeChart chart = ChartFactory.createMultiplePieChart(
- "chart",
- dataset,
- TableOrder.BY_COLUMN, // 按列分割饼图,addValue中的第三个参数
- true,
- false,
- false
- );
图 3.5. 多重报表
TODO:
color
outlines
label