1.1 什么是jfreechart
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
1.2 Jfreechart下载
官方网站:http://www.jfree.org/jfreechart/ ,最新版本1.0.19。
下载地址:http://sourceforge.net/projects/jfreechart/files/
下载 jfreechart-1.0.19.zip ,
柱图:
本系统柱状图的应用:
按区域统计采购金额的总量。
折线图:
进行走势统计分析。
药品采购金额走势分析:
饼图:
统计百分比暂用情况。
2 Jfreechart开发测试
2.1 将jfreechart的jar包加入工程
需要这两个jar 包
jcommon-1.0.23.jar jfreechart公用类库
jfreechart-1.0.19.jar jfreechart的图表类库
在主工程的pom.xml 中配置
<!-- jfreechart -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.23</version>
</dependency>
<dependency>
<artifactId>jfreechart</artifactId>
<groupId>org.jfree</groupId>
<version>1.0.19</version>
</dependency>
2.2 柱状图Jfreechart代码:
第一步:构造一个Dataset :填充要统计的数据
可以通过二维数据定义数据格式:
double[][] data = new double[][] {
{ 1310, 720.68, 675.3, 560, 680.88, 780 }
};
也可以通过api
dataset2.addValue(1310, "药品采购金额", "崔庙镇");
第二步:生成图形:
ChartFactory.createBarChart3D来生成柱状图
JFreeChart chart = ChartFactory.createBarChart3D(
"药品采购金额汇总",// 图形名称
"",// 分类名称,为横坐标名称
"采购金额(元)",// 值名称,为纵坐标名称
dataset,// 数据集合
PlotOrientation.VERTICAL,// 垂直显示
false,// 是否显示图例
false,// 是否使用工具提示
false);// 是否使用url
第三步:图形输出:
通过response输出;
//通过response输入图片
response.setContentType("image/png");
ChartUtilities.writeChartAsPNG(out, chart, 800, 500);
2.3 Jfreechart中文乱码问题
Jfreechart对中文支持不好,jfreechart生成图形默认设置的字体不是,本机中文字体。
如何解决?
人为在chart(jfreechart图形)中设置中文字体
需要设置:
图形title字体,
横坐标字体
统计分类字体
纵坐标显示字体
// 配置字体
Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
// 图形的绘制结构对象,对于饼图不适用
CategoryPlot plot = chart.getCategoryPlot();
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
// 底部
LegendTitle legendTitle = chart.getLegend();
if (legendTitle != null) {
legendTitle.setItemFont(kfont);
}
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
rangeAxis.setTickLabelFont(yfont);
上边的代码适用柱状图,设置字体,
对于折线图、饼图设置字体 的代码不太一样,需要单独对不同类型的图形设置字体。
2.4 Dataset构造的第二种方法
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//第一个参数:统计数值,第二个参数:统计指标名称,第三个参数:统计分类
dataset.addValue(1310, "药品采购金额", "崔庙镇");
dataset.addValue(720.68, "药品采购金额", "汜水镇");
dataset.addValue(675.3, "药品采购金额", "高山镇");
dataset.addValue(560, "药品采购金额", "城关乡");
dataset.addValue(680.88, "药品采购金额", "刘河镇");
dataset.addValue(780, "药品采购金额", "环翠峪");
//实际开发时,数据从数据库查询出来,
//在for循环中向dataset中添加数据
2.5 输出图形的第二种方法
通过jfreechart的servlet输出图形。
2.5.1 思路:
在action代码中,生成图形后暂时存入session
得到存入session的图形名称(图形对应的key)
在页面中通过img展示生成的图形,通过jfreechart的servlet输出图形
2.5.2 实现:
配置jfreechart的servlet
第一步:在web.xml配置:
<!-- jfreechart -->
<servlet>
<servlet-name>jfreechart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jfreechart</servlet-name>
<url-pattern>/jfreechart</url-pattern>
</servlet-mapping>
第二步:将图形放在session,得到filename
// 将图形放在session,得到filename
String jfreechart_filename = ServletUtilities.saveChartAsPNG(chart,
900, 500, null, session);
model.addAttribute("jfreechart_filename", jfreechart_filename);
第三步:在页面通过jfreechart的servlet生成 图形
<!-- jfreechart图形freechart 为servlet 的名字filename 为action 中的key-->
<img src="${baseurl }/jfreechart?filename=${jfreechart_filename }" border=0 />