JFreeChart最新版本1.0.8a的研究系列——生成柱状图

生成柱状图

具体实现步骤

1)创建用于图形生成所要的数据集对象。
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
DefaultPieDataset类提供的setValue(data,rowKey,columnKey)方法,设置柱状图形显示的数据,其中:rowKey表示X轴数据,columnKey表示Y轴数据,data表示填充柱状图所要的实际数据。

2)创建图形对象。
JFreeChart chart = ChartFactory.createBarChart3D("标题", null,null,dataset,PlotOrientation.VERTICAL,,true,false,false);
createBarChart3D方法是ChartFactory工厂类里的一个方法,用于3D柱状图的生成,平面柱状图使用createBarChart方法创建,还有createStackedBarChart和createStackedBarChart3D方法可以创建叠加式的平面和3D柱状图。八个参数分别代表:图形的标题、X轴标题、Y轴标题、dataset就是CategoryDataset类的实例对象、柱形图显示形式、是否显示图例、测试未明、是否显示鼠标志向提示,其中柱形图显示形式有,PlotOrientation.VERTICAL表示垂直方式、PlotOrientation.HORIZONTAL表示水平方式。

3)设置图形显示的属性。
a) ValueAxis类,设置柱到图上下边的距离。实现方法是:

获取ValueAxis对象
ValueAxis rangeAxis = (ValueAxis)plot.getRangeAxis();
设置最高的一个柱与图片顶端的距离:
rangeAxis.setUpperMargin(0.15)
设置最低的一个柱与图片底端的距离:
rangeAxis.setLowerMargin(0.15)
b)BarRenderer类,设置图形上显示的数值。实现方法如下:

获取BarRenderer对象
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setBaseOutlinePaint(Color.BLACK);
设置 Wall 的颜色:
renderer.setWallPaint(Color.gray);
设置每个柱的颜色:
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
设置每个柱的 Outline 颜色
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setSeriesOutlinePaint(1, Color.BLACK);
renderer.setSeriesOutlinePaint(2, Color.BLACK);
设置每个地区所包含的平行柱之间的距离
renderer.setItemMargin(0.1);
显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);

实例应用
package jfreechar.test;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.Range;
import org.jfree.data.category.DefaultCategoryDataset;

/***/ /**
*测试生成柱形图实例
*
*
@author左杰
*
*/

public class BarChartTest ... {
/***//**
*获取简单数据集对象
*
*
@return
*/

publicDefaultCategoryDatasetgetJdDataSet()...{
DefaultCategoryDatasetdataset
=newDefaultCategoryDataset();
dataset.addValue(
100,"北京","苹果");
dataset.addValue(
200,"北京","梨子");
dataset.addValue(
300,"北京","葡萄");
dataset.addValue(
400,"北京","香蕉");
dataset.addValue(
500,"北京","荔枝");
returndataset;
}


/***//**
*获取组合数据集对象
*
*
@return
*/

publicDefaultCategoryDatasetgetZhDataSet()...{
DefaultCategoryDatasetdataset
=newDefaultCategoryDataset();
dataset.addValue(
100,"北京","苹果");
dataset.addValue(
100,"上海","苹果");
dataset.addValue(
100,"广州","苹果");
dataset.addValue(
200,"北京","梨子");
dataset.addValue(
200,"上海","梨子");
dataset.addValue(
200,"广州","梨子");
dataset.addValue(
300,"北京","葡萄");
dataset.addValue(
300,"上海","葡萄");
dataset.addValue(
300,"广州","葡萄");
dataset.addValue(
400,"北京","香蕉");
dataset.addValue(
400,"上海","香蕉");
dataset.addValue(
400,"广州","香蕉");
dataset.addValue(
500,"北京","荔枝");
dataset.addValue(
500,"上海","荔枝");
dataset.addValue(
500,"广州","荔枝");
returndataset;
}


/***//**
*创建图表主对象JFreechart,并设置图像显示
*
*
@return
*/

publicJFreeChartcreateBarChart()...{
DefaultCategoryDatasetdataset
=getJdDataSet();
//创建JFreechart对象,3D状的
//JFreeChartchart=ChartFactory.createBarChart3D("水果产量统计","水果",
//"产量",dataset,PlotOrientation.VERTICAL,true,true,true);
//创建JFreechart对象,平面状的
JFreeChartchart=ChartFactory.createBarChart("水果产量统计","水果","产量",
dataset,PlotOrientation.VERTICAL,
true,true,true);

//设置图形显示属性
CategoryPlotplot=(CategoryPlot)chart.getPlot();
//目录轴网格是否可见
plot.setDomainGridlinesVisible(false);
//目录轴网格线的颜色
plot.setDomainGridlinePaint(Color.red);
//数据轴网格是否可见
plot.setRangeGridlinesVisible(true);
//数据轴网格线的颜色
plot.setRangeGridlinePaint(Color.blue);
//设置图像区域背景颜色
plot.setBackgroundPaint(Color.white);
//设置柱的透明度
plot.setForegroundAlpha(0.9f);
//设置目录轴和数据轴的显示位置
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

//设置数据轴的刻度
NumberAxisnaxis=(NumberAxis)plot.getRangeAxis();
//设置数据轴的数据范围
naxis.setRange(newRange(0,1000));
//设置刻度波动值
naxis.setTickUnit(newNumberTickUnit(50));

//设置图形的宽度
CategoryAxiscaxis=plot.getDomainAxis();
//设置最高的一个柱图与图片顶端的距离
caxis.setUpperMargin(0.15);
//设置最低的一个柱图与图片底端的距离
caxis.setLowerMargin(0.15);

//设置柱图属性
BarRendererrenderer=(BarRenderer)plot.getRenderer();
//
renderer.setBaseOutlinePaint(Color.black);
//设置每个地区代表的柱的颜色
renderer.setSeriesPaint(0,Color.pink);
renderer.setSeriesPaint(
1,newColor(0,100,255));
renderer.setSeriesPaint(
2,Color.green);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.02);

returnchart;
}


/***//**
*生成图形,保存图像到临时文件,并返回文件名
*
*
@paramchart
*JFreeChart对象实例
*
@paramw
*图像宽度
*
@paramh
*图像高度
*
@paramsession
*会话session
*
@return
*/

publicStringgetFileName(JFreeChartchart,intw,inth,
HttpSessionsession)
...{
//生成图形,保存图像到临时文件,并返回文件名
StringfileName="";
StandardEntityCollectionsec
=newStandardEntityCollection();
ChartRenderingInfoinfo
=newChartRenderingInfo(sec);
try...{
fileName
=ServletUtilities.saveChartAsPNG(chart,w,h,info,
session);
}
catch(Exceptione)...{
System.out.println(
"Exception-"+e.toString());
fileName
="public_error_500x300.png";
}

returnfileName;
}


/***//**
*生成图形,保存到指定文件,文件类型为png
*
*
@paramfileName
*指定保存文件的路径及文件名
*
@paramchart
*JFreeChart对象实例
*
@paramw
*图像宽度
*
@paramh
*图像高度
*/

publicvoidSaveFileAsPNG(StringfileName,JFreeChartchart,intw,inth)...{
//生成图形,保存到指定文件,文件类型为png
try...{
ChartUtilities.saveChartAsPNG(
newFile(fileName),chart,w,h);
}
catch(IOExceptione)...{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

}


/***//**
*生成图形,保存到指定文件,文件类型为jpg
*
*
@paramfileName
*指定保存文件的路径及文件名
*
@paramchart
*JFreeChart对象实例
*
@paramw
*图像宽度
*
@paramh
*图像高度
*/

publicvoidSaveFileAsJPEG(StringfileName,JFreeChartchart,intw,inth)...{
//生成图形,保存到指定文件,文件类型为jpg
try...{
ChartUtilities.saveChartAsPNG(
newFile(fileName),chart,w,h);
}
catch(IOExceptione)...{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

}


publicstaticvoidmain(String[]args)...{
BarChartTestp
=newBarChartTest();
JFreeChartchart
=p.createBarChart();
//保存为图像文件
p.SaveFileAsPNG("d://barchart.png",chart,800,600);
//显示在GUI上
ChartFrameframe=newChartFrame("水果产量",chart);
frame.pack();
frame.setVisible(
true);
}


}
这个执行后显示的是简单数据的平面柱状图,如果想实现简单数据的3D柱状图,只需要在创建JFreeChart对象时使用ChartFactory.createBarChart3D方法。如果想生成组合数据的柱状图,只需要修改DefaultCategoryDataset dataset = getZhDataSet();
简单数据运行结果如下:
简单数据平面柱状图 简单数据3D饼图

组合数据运行结果如下:

组合数据平面柱状图 组合数据3D饼图

使用createStackedBarChart3D方法创建叠加式的柱状图效果如下:

欢迎大家研究讨论

你可能感兴趣的:(jfreechart)