使用jfreeChart生成柱状图,折线图,饼图等

时间:2022-09-19 08:02:56

                                一些项目可能会使用图形报表方式让产品销售,人员分布,以及其他各种需要统计的东西更加的清晰直观的表现出来,这里介绍如何使用jfreechart生成图形报表,

 

                     首先,你需要下载jfreeChart的包,导入其中的jar包,主要导入以下的jar包

                                       使用jfreeChart生成柱状图,折线图,饼图等


                        这样就可以使用JfreeChart,首先从柱状图开始

                           一,柱状图


                                                                       显示的图形如下所示

                                                                          使用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轴的名称,那么

你需要处理中文的乱码问题,处理方式,看代码就好了



                             二,折线图

                                    使用jfreeChart生成柱状图,折线图,饼图等

                            

                              折线图和柱状图差不多,不过是将ChartFactory生成的柱状图换成了折线图,然后我们看到设置不同属性类图形所表现的区别,代码如下

                             

public static void main(String[] args) {

//构建数据集合
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包的Rectangle(方形)类来制作的方形,所以可以查出,jfreeChart

还是很依赖java中awt这个类的,或者说他依赖于jdk的


                                   三,扇形图(饼图)

                                    使用jfreeChart生成柱状图,折线图,饼图等

                                                饼图比起上面两个图还要简单,因为饼图没有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,三种基本图形生成的方式