jFreeChart是Java开发中常用的统计类组件,主要包括柱状图,饼状图等。下面我们介绍一下jFreeChart最简单的用法。
首先需要导入jFreeChart的jar包,放在项目web\WEB-INF\lib文件夹下。然后我们以最简洁的代码实现一个统计功能。
1.柱状图
import
java.awt.Color;
import
java.awt.Font;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
org.jfree.chart.ChartFactory;
import
org.jfree.chart.ChartUtilities;
import
org.jfree.chart.JFreeChart;
import
org.jfree.chart.axis.CategoryAxis;
import
org.jfree.chart.axis.NumberAxis;
import
org.jfree.chart.plot.CategoryPlot;
import
org.jfree.chart.plot.PlotOrientation;
import
org.jfree.chart.title.TextTitle;
import
org.jfree.data.category.DefaultCategoryDataset;
public
class
BarChartTest
{
public
static
void
main(String[] args)
{
DefaultCategoryDataset dataset
=
new
DefaultCategoryDataset();
dataset.addValue(
20
,
"
企业备案数
"
,
"
北京局
"
);
dataset.addValue(
18
,
"
企业备案数
"
,
"
上海局
"
);
dataset.addValue(
16
,
"
企业备案数
"
,
"
天津局
"
);
dataset.addValue(
15
,
"
企业备案数
"
,
"
重庆局
"
);
dataset.addValue(
45
,
"
企业备案数
"
,
"
山东局
"
);
JFreeChart chart
=
ChartFactory.createBarChart(
"
企业备案图
"
,
"
直属局
"
,
"
企业备案数
"
,dataset, PlotOrientation.HORIZONTAL,
true
,
false
,
false
);
/** */
/**
*************A start********
*/
//
设置标题字体样式
TextTitle textTitle
=
chart.getTitle();
textTitle.setFont(
new
Font(
"
黑体
"
, Font.PLAIN,
20
));
//
设置柱状体颜色
CategoryPlot categoryplot
=
(CategoryPlot) chart.getPlot();
categoryplot.getRenderer().setSeriesPaint(
0
,
new
Color(
228
,
109
,
10
));
NumberAxis numberaxis
=
(NumberAxis) categoryplot.getRangeAxis();
CategoryAxis domainAxis
=
categoryplot.getDomainAxis();
//
设置X轴坐标上的字体样式
domainAxis.setTickLabelFont(
new
Font(
"
sans-serif
"
, Font.PLAIN,
11
));
//
设置X轴的标题字体样式
domainAxis.setLabelFont(
new
Font(
"
宋体
"
, Font.PLAIN,
12
));
//
设置Y轴坐标上的字体样式
numberaxis.setTickLabelFont(
new
Font(
"
sans-serif
"
, Font.PLAIN,
12
));
//
设置Y轴的标题字体样式
numberaxis.setLabelFont(
new
Font(
"
黑体
"
, Font.PLAIN,
12
));
//
设置图片最底部字体样式
if
(chart.getLegend()
!=
null
)
{
chart.getLegend().setItemFont(
new
Font(
"
宋体
"
, Font.PLAIN,
12
));
}
/** */
/**
*************A end********
*/
try
{
ChartUtilities.writeChartAsPNG(
new
FileOutputStream(
"
D:\\barChart.jpg
"
), chart,
400
,
200
);
}
catch
(FileNotFoundException e)
{
e.printStackTrace();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
生成的文件显示效果如下:
2
.饼状图
import
java.awt.Color;
import
java.awt.Font;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.text.DecimalFormat;
import
java.text.NumberFormat;
import
org.jfree.chart.ChartFactory;
import
org.jfree.chart.ChartUtilities;
import
org.jfree.chart.JFreeChart;
import
org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import
org.jfree.chart.plot.PiePlot;
import
org.jfree.data.general.DefaultPieDataset;
public
class
PieChartTest
{
public
static
void
main(String[] args)
{
DefaultPieDataset pieDataset
=
new
DefaultPieDataset();
pieDataset.setValue(
"
北京局
"
,
20
);
pieDataset.setValue(
"
上海局
"
,
18
);
pieDataset.setValue(
"
天津局
"
,
16
);
pieDataset.setValue(
"
重庆局
"
,
15
);
pieDataset.setValue(
"
山东局
"
,
45
);
JFreeChart chart
=
ChartFactory.createPieChart3D(
"
企业备案图
"
,pieDataset,
true
,
false
,
false
);
/** */
/**
*************A start********
*/
//
设置标题字体样式
chart.getTitle().setFont(
new
Font(
"
黑体
"
,Font.BOLD,
20
));
//
设置饼状图里描述字体样式
PiePlot piePlot
=
(PiePlot) chart.getPlot();
piePlot.setLabelFont(
new
Font(
"
黑体
"
,Font.BOLD,
10
));
//
设置显示百分比样式
piePlot.setLabelGenerator(
new
StandardPieSectionLabelGenerator(
(
"
{0}({2})
"
), NumberFormat.getNumberInstance(),
new
DecimalFormat(
"
0.00%
"
)));
//
设置统计图背景
piePlot.setBackgroundPaint(Color.white);
//
设置图片最底部字体样式
chart.getLegend().setItemFont(
new
Font(
"
黑体
"
,Font.BOLD,
10
));
/** */
/**
*************A end********
*/
try
{
ChartUtilities.writeChartAsPNG(
new
FileOutputStream(
"
D:\\pieChart.jpg
"
), chart,
400
,
300
);
}
catch
(FileNotFoundException e)
{
e.printStackTrace();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
生成的文件显示效果如下:
其中以上两段代码中的“A”代码块中的内容是为了解决图片生成过程中遇到的乱码问题,在实际开发中可以写到一个公共类中,此时应注意服务器的操作系统上是否缺少上述代码中所用到的字体。关于jFreeChart详细参数的使用请参考官方文档。