一些项目可能会使用图形报表方式让产品销售,人员分布,以及其他各种需要统计的东西更加的清晰直观的表现出来,这里介绍如何使用jfreechart生成图形报表,
首先,你需要下载jfreeChart的包,导入其中的jar包,主要导入以下的jar包
这样就可以使用JfreeChart,首先从柱状图开始
一,柱状图
显示的图形如下所示
现在贴上代码如下
public static void main(String[] args) {
//构建数据集合
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(9, "中国","北京");
dataset.addValue(11, "中国","上海");
dataset.addValue(6, "中国","深圳");
//创建主张图表
JFreeChart chart = ChartFactory.createBarChart3D(
"用户统计报表",//图形的主标题
"所属单位的名称",//种类轴标签
"数量",//值轴的标签
dataset, //图形的数据集合
PlotOrientation.VERTICAL,//图形的显示样式(水平和垂直)
true,//是否显示子标题
true,//是否生产数据提示
true);//是否生产url链接
//处理主标题乱码
chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
//处理子标题乱码
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
//获取图表区域对象
/**
* 三种获取图标对象的方法
* 1.debug
* 2.输出(system.out.println())
* 3.api文档
*/
CategoryPlot categoryPlot = chart.getCategoryPlot();
//取得x轴的对象
CategoryAxis categoryAxis = categoryPlot.getDomainAxis();
//取得y轴的对象
ValueAxis valueAxis = categoryPlot.getRangeAxis();
//解决x轴上的乱码问题
categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//解决x轴外的乱码问题
categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
//解决y轴上的乱码问题
valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//解决y轴外的乱码问题
valueAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
//设置y轴上的刻度
NumberAxis3D numberAxis3D = (NumberAxis3D) valueAxis;
numberAxis3D.setAutoTickUnitSelection(false);//设置手动设置刻度
//设置刻度从1开始
NumberTickUnit unit = new NumberTickUnit(1);
//设置新刻度
numberAxis3D.setTickUnit(unit);
//获取绘图区域对象
BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot.getRenderer();
//让图形苗条些
barRenderer3D.setMaximumBarWidth(0.08);
//在图形上产生数字
barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barRenderer3D.setBaseItemLabelsVisible(true);
barRenderer3D.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
/**
* 在d:\下生产图片
*
*/
File file = new File("D:/chart.png");
try {
ChartUtilities.saveChartAsJPEG(file, chart, 600, 500);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//使用Rrame加载图形
ChartFrame chartFrame = new ChartFrame("xyz",chart);
chartFrame.setVisible(true);
//输出图形
chartFrame.pack();
}
解释下上面的代码,首先创建数据集合dataset,给数据集合放入值,比如我放入了,9, "中国","北京"等其他值,9表示数值,显示在值轴的,中国,表示种类中的名字,而北京表示改种类下的一个具体种类,你可尝试加入不同种类看效果,然后使用ChartFactory来生成柱状图的图标对象,这里也说明,jfreeChart是使用工厂模式
来生成各种图形对象的,现在就可以输出图形了,使用ChartFrame来加载图形即可,然后用pack()方法输出图形,但是如果你是使用中文写的标题,或者,x,y轴的名称,那么
你需要处理中文的乱码问题,处理方式,看代码就好了
二,折线图
折线图和柱状图差不多,不过是将ChartFactory生成的柱状图换成了折线图,然后我们看到设置不同属性类图形所表现的区别,代码如下
public static void main(String[] args) {代码基本差不多,注意的是如何在图形上生成一个方形来表示转折,这里,其实是使用了java中awt包的Rectangle(方形)类来制作的方形,所以可以查出,jfreeChart
//构建数据集合
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(12, "中国","北京");
dataset.addValue(10, "中国","上海");
dataset.addValue(6, "中国","深圳");
dataset.addValue(12, "美国","西雅图");
dataset.addValue(10, "美国","纽约");
dataset.addValue(6, "美国","华盛顿");
dataset.addValue(7, "中国","天津");
dataset.addValue(9, "中国","南京");
dataset.addValue(11, "中国","江苏");
//创建主张图表
JFreeChart chart = ChartFactory.createLineChart(
"用户统计报表",//图形的主标题
"所属单位的名称",//种类轴标签
"数量",//值轴的标签
dataset, //图形的数据集合
PlotOrientation.VERTICAL,//图形的显示样式(水平和垂直)
true,//是否显示子标题
true,//是否生产数据提示
true);//是否生产url链接
//处理主标题乱码
chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
//处理子标题乱码
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
//获取图表区域对象
/**
* 三种获取图标对象的方法
* 1.debug
* 2.输出(system.out.println())
* 3.api文档
*/
CategoryPlot categoryPlot = chart.getCategoryPlot();
//取得x轴的对象
CategoryAxis categoryAxis = categoryPlot.getDomainAxis();
//取得y轴的对象
ValueAxis valueAxis = categoryPlot.getRangeAxis();
//解决x轴上的乱码问题
categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//解决x轴外的乱码问题
categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
//解决y轴上的乱码问题
valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//解决y轴外的乱码问题
valueAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
//设置y轴上的刻度
NumberAxis numberAxis = (NumberAxis) valueAxis;
numberAxis.setAutoTickUnitSelection(false);//设置手动设置刻度
//设置刻度从1开始
NumberTickUnit unit = new NumberTickUnit(1);
//设置新刻度
numberAxis.setTickUnit(unit);
//获取绘图区域对象
LineAndShapeRenderer lineAndShapeRenderer = (LineAndShapeRenderer) categoryPlot.getRenderer();
//在图形上产生数字
lineAndShapeRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineAndShapeRenderer.setBaseItemLabelsVisible(true);
lineAndShapeRenderer.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
//设置转折点
Shape shape = new Rectangle(10,10);
lineAndShapeRenderer.setSeriesShape(0, shape);//第一个参数从第几条线开始,默认从第0条
lineAndShapeRenderer.setSeriesShapesVisible(0, true);
lineAndShapeRenderer.setSeriesShape(1, shape);//第一个参数从第几条线开始,默认从第0条
lineAndShapeRenderer.setSeriesShapesVisible(1, true);
lineAndShapeRenderer.setSeriesShape(2, shape);//第一个参数从第几条线开始,默认从第0条
lineAndShapeRenderer.setSeriesShapesVisible(2, true);
/*
* 在d:\下生产图片
*
*/
/* File file = new File("D:/chart.png");
try {
ChartUtilities.saveChartAsJPEG(file, chart, 600, 500);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
//使用Rrame加载图形
ChartFrame chartFrame = new ChartFrame("xyz",chart);
chartFrame.setVisible(true);
//输出图形
chartFrame.pack();
}
还是很依赖java中awt这个类的,或者说他依赖于jdk的
三,扇形图(饼图)
饼图比起上面两个图还要简单,因为饼图没有x,y轴,下面是代码
public static void main(String[] args) {
//构建数据集合
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("北京",25);
dataset.setValue("上海",45);
dataset.setValue("深圳",30);
//创建主张图表
JFreeChart chart = ChartFactory.createPieChart3D(
"用户统计报表",//图形的主标题
dataset, //图形的数据集合
true,//是否显示子标题
true,//是否生产数据提示
true);//是否生产url链接
//处理主标题乱码
chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
//处理子标题乱码
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
//获取图表区域对象
/**
* 三种获取图标对象的方法
* 1.debug
* 2.输出(system.out.println())
* 3.api文档
*/
PiePlot3D piePlot3D = (PiePlot3D) chart.getPlot();
//处理图形上显示的乱码问题
piePlot3D.setLabelFont(new Font("宋体",Font.BOLD,15));
//在图形上显示数值(格式:北京 12 (60%))
String labelFormat = "{0},{1},({2})";
piePlot3D.setLabelGenerator(new StandardPieSectionLabelGenerator(labelFormat));
//使用Rrame加载图形
ChartFrame chartFrame = new ChartFrame("xyz",chart);
chartFrame.setVisible(true);
//输出图形
chartFrame.pack();
}
注意是如何在图形上显示如:北京,12 (60%)这种格式数据的,以上就是jfreeChart,三种基本图形生成的方式