jfreechart统计图

网上找了很多拼成的,自己也添加了一些东西,所以此处就不将转载的链接地址拷出来。

首先如果项目用到了struts,那么在web.xml和jsp中都加上.servlet,如果不加的话它会看成是.action的形式,所以到时候会显示不出图片,待会代码中会注明这点。

以下代码自己测试通过、

1.后台BarChartDemo,其中getDataSet2方法里面注释的是原作者的代码,此处将我加的代码及导入的包去掉就行。此处直接运行一下在D盘和E盘就可以生成图片,两种方法在ganarateFruitChart()中写了

package com.jw.magicbpm.action.officebusinessmanage;

import java.awt.Color;
import java.awt.Font;
import java.awt.RenderingHints;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

import com.jw.magicbpm.basecommon.db.DbSessionFactory;
import com.jw.magicbpm.model.officebusinessmanage.B_V_Ufp_PeopleAgeStatistics;

public class BarChartDemo {

/**
* 饼状图
*/
public static String generatePieChart(HttpSession session, PrintWriter pw,
int w, int h) {
String filename = null;
handleGarbledAndFont();//设置乱码和字体
PieDataset dataset = getDataSet();
JFreeChart chart = ChartFactory.createPieChart3D("水果产量图", // 图表标题
dataset, // 数据集
true, // 是否显示图例
false, // 是否生成工具
false // 是否生成URL链接
);
chart.setBackgroundPaint(Color.pink);
try {
/*------得到chart的保存路径----*/
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,
session);
/*------使用printWriter将文件写出----*/
ChartUtilities.writeImageMap(pw, filename, info, true);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
return filename;
}

/**
* 柱状图
* @throws Exception
*/
public static String generateBarChart(HttpSession session, PrintWriter pw,
int w, int h) throws Exception {
String filename = null;
handleGarbledAndFont();//设置乱码和字体
CategoryDataset dataset = getDataSet2();
JFreeChart chart = ChartFactory.createBarChart3D("干部年龄统计图", // 图表标题
"年龄", // 目录轴的显示标签
"人数", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
Font labelFont = new Font("SansSerif", Font.BOLD, 9);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
CategoryAxis domainAxis = categoryplot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// X轴的标题文字字体
domainAxis.setTickLabelFont(labelFont);//X轴坐标上数值字体
// 设置距离图片左端距离
domainAxis.setLowerMargin(0.01);
// 设置距离图片右端距离
domainAxis.setUpperMargin(0.01);
try {
/*------得到chart的保存路径----*/
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,
session);
/*------使用printWriter将文件写出----*/
ChartUtilities.writeImageMap(pw, filename, info, true);
pw.flush();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return filename;
}

/**
* 折线图
*/
public static String generateLineChart(HttpSession session, PrintWriter pw,
int w, int h) {
String filename = null;
// session.removeAttribute("JFreeChart_Deleter");//将tomcat中temp的统计图片删除
handleGarbledAndFont();//设置乱码和字体
CategoryDataset dataset = getDataSet3();
JFreeChart chart = ChartFactory.createLineChart("水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);

/*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

/*------------配置图表属性--------------*/
// 1,设置整个图表背景颜色
chart.setBackgroundPaint(Color.pink);

/*------------设定Plot参数-------------*/
CategoryPlot plot = chart.getCategoryPlot();
// 2,设置详细图表的显示细节部分的背景颜色
// plot.setBackgroundPaint(Color.PINK);
// 3,设置垂直网格线颜色
plot.setDomainGridlinePaint(Color.black);
// 4,设置是否显示垂直网格线
plot.setDomainGridlinesVisible(true);
// 5,设置水平网格线颜色
plot.setRangeGridlinePaint(Color.blue);
// 6,设置是否显示水平网格线
plot.setRangeGridlinesVisible(true);

try {
/*------得到chart的保存路径----*/
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,
session);
/*------使用printWriter将文件写出----*/
ChartUtilities.writeImageMap(pw, filename, info, true);
pw.flush();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return filename;
}



/**
* 获取一个饼状图的简单数据集对象
*
* @return
*/
private static PieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果", 100);
dataset.setValue("梨子", 200);
dataset.setValue("葡萄", 300);
dataset.setValue("香蕉", 400);
dataset.setValue("荔枝", 500);
return dataset;
}

/**
* 获取一个柱状图数据集对象
*
* @return
* @throws Exception
*/
private static CategoryDataset getDataSet2() throws Exception {
List<B_V_Ufp_PeopleAgeStatistics> list_B_V_Ufp_PeopleAgeStatistics1=PeopleAgeStatisticsAction.searchGovernmentLevelList(DbSessionFactory.getOracleSession());
List<B_V_Ufp_PeopleAgeStatistics> list_B_V_Ufp_PeopleAgeStatistics2=PeopleAgeStatisticsAction.searchTownLevelList(DbSessionFactory.getOracleSession());
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getUnderthirty(), "正局", "30周岁及以下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getThirtyonetothirtyfive(), "正局", "31-35周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getThirtysixtoforty(), "正局", "36-40周岁下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getFortyonetofortyfive(), "正局", "41-45周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getFortysixtofifty(), "正局", "46-50周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getFiftyonetofiftyfive(), "正局", "51-55周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(0).getFiftysixtosixty(), "正局", "56-60周岁");

dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getUnderthirty(), "正科级", "30周岁及以下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getThirtyonetothirtyfive(), "正科级", "31-35周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getThirtysixtoforty(), "正科级", "36-40周岁下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getFortyonetofortyfive(), "正科级", "41-45周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getFortysixtofifty(), "正科级", "46-50周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getFiftyonetofiftyfive(), "正科级", "51-55周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics1.get(1).getFiftysixtosixty(), "正科级", "56-60周岁");

dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getUnderthirty(), "副局级", "30周岁及以下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getThirtyonetothirtyfive(), "副局级", "31-35周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getThirtysixtoforty(), "副局级", "36-40周岁下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getFortyonetofortyfive(), "副局级", "41-45周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getFortysixtofifty(), "副局级", "46-50周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getFiftyonetofiftyfive(), "副局级", "51-55周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(0).getFiftysixtosixty(), "副局级", "56-60周岁");

dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getUnderthirty(), "其他", "30周岁及以下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getThirtyonetothirtyfive(), "其他", "31-35周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getThirtysixtoforty(), "其他", "36-40周岁下");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getFortyonetofortyfive(), "其他", "41-45周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getFortysixtofifty(), "其他", "46-50周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getFiftyonetofiftyfive(), "其他", "51-55周岁");
dataset.addValue(list_B_V_Ufp_PeopleAgeStatistics2.get(1).getFiftysixtosixty(), "其他", "56-60周岁");


// dataset.addValue(100, "北京", "苹果");
// dataset.addValue(500, "北京", "荔枝");
// dataset.addValue(400, "北京", "香蕉");
// dataset.addValue(200, "北京", "梨子");
// dataset.addValue(300, "北京", "葡萄");
// dataset.addValue(500, "上海", "葡萄");
// dataset.addValue(600, "上海", "梨子");
// dataset.addValue(400, "上海", "香蕉");
// dataset.addValue(700, "上海", "苹果");
// dataset.addValue(300, "上海", "荔枝");
// dataset.addValue(300, "广州", "苹果");
// dataset.addValue(200, "广州", "梨子");
// dataset.addValue(500, "广州", "香蕉");
// dataset.addValue(100, "广州", "葡萄");
// dataset.addValue(400, "广州", "荔枝");
return dataset;
}

/**
* 获取一个折线图数据集对象
*
* @return
*/
private static CategoryDataset getDataSet3() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "一月");
dataset.addValue(200, "北京", "二月");
dataset.addValue(100, "北京", "三月");
dataset.addValue(400, "北京", "四月");
dataset.addValue(300, "北京", "五月");
dataset.addValue(500, "北京", "六月");
dataset.addValue(90, "北京", "七月");
dataset.addValue(700, "北京", "八月");
dataset.addValue(800, "北京", "九月");
dataset.addValue(1000, "北京", "十月");
dataset.addValue(300, "北京", "十一月");
dataset.addValue(700, "北京", "十二月");
dataset.addValue(1200, "上海", "一月");
dataset.addValue(1100, "上海", "二月");
dataset.addValue(1000, "上海", "三月");
dataset.addValue(900, "上海", "四月");
dataset.addValue(800, "上海", "五月");
dataset.addValue(700, "上海", "六月");
dataset.addValue(600, "上海", "七月");
dataset.addValue(500, "上海", "八月");
dataset.addValue(400, "上海", "九月");
dataset.addValue(300, "上海", "十月");
dataset.addValue(200, "上海", "十一月");
dataset.addValue(100, "上海", "十二月");
dataset.addValue(600, "武汉", "一月");
dataset.addValue(500, "武汉", "二月");
dataset.addValue(400, "武汉", "三月");
dataset.addValue(300, "武汉", "四月");
dataset.addValue(200, "武汉", "五月");
dataset.addValue(100, "武汉", "六月");
dataset.addValue(200, "武汉", "七月");
dataset.addValue(300, "武汉", "八月");
dataset.addValue(400, "武汉", "九月");
dataset.addValue(500, "武汉", "十月");
dataset.addValue(600, "武汉", "十一月");
dataset.addValue(700, "武汉", "十二月");
return dataset;
}
/**
* 处理乱码和字体
* @throws IOException
*/
public static void handleGarbledAndFont(){
//创建主题样式
StandardChartTheme standardChartTheme=new StandardChartTheme("CN");
//设置标题字体
standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));
//设置图例的字体
standardChartTheme.setRegularFont(new Font("宋书",Font.PLAIN,15));
//设置轴向的字体
standardChartTheme.setLargeFont(new Font("宋书",Font.PLAIN,15));
//应用主题样式
ChartFactory.setChartTheme(standardChartTheme);
}
/**
* 在本地生成图片文件
* @throws Exception
* @throws IOException
*/
public static void ganarateFruitChart() throws Exception{
CategoryDataset dataset = getDataSet2();

JFreeChart chart = ChartFactory.createBarChart3D("水果产量图", // 图表标题
"月份", // 目录轴的显示标签
"产量(公斤)", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);

FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("D:\\fruit.jpg");//将图片保存到d盘
ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300,
null);
//将图片保存到E盘(另外一种写法)
ChartUtilities.saveChartAsPNG(new File("E:/BarChart3D.png"), chart, 800, 500);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
}
}
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ganarateFruitChart();
}
}


2.jsp页面,将jsp:directive.page 导入换成自己路径

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.io.PrintWriter"%>
<jsp:directive.page import="com.jw.magicbpm.action.officebusinessmanage.BarChartDemo"/>
<html>
<head>
<title>
</title>
<%
//饼状图
String fileNamePie=BarChartDemo.generatePieChart(session,new PrintWriter(out),580,250);
//如果用了strut的话此处为DisplayChart.servlet,不能DisplayChart,原因上面说了
String graphURLPie = request.getContextPath() + "/servlet/DisplayChart.servlet?filename=" + fileNamePie;
//柱状图
String fileNameBar=BarChartDemo.generateBarChart(session,new PrintWriter(out),580,250);
String graphURLBar = request.getContextPath() + "/servlet/DisplayChart.servlet?filename=" + fileNameBar;
//折线图
String fileNameLine=BarChartDemo.generateLineChart(session,new PrintWriter(out),580,250);
String graphURLLine = request.getContextPath() + "/servlet/DisplayChart.servlet?filename=" + fileNameLine;

%>
</head>
<body bgcolor="#ffffff">
<table align="center" width="580" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="<%= graphURLPie %>"width=580 height=250 border=0 >
</td>
</tr>
<tr>
<td>
<img src="<%= graphURLBar %>"width=580 height=250 border=0 >
</td>
</tr>
<tr>
<td>
<img src="<%= graphURLLine %>"width=580 height=250 border=0 >
</td>
</tr>
</table>
</body>
</html>


3.web.xml加上以下,里面DisplayChart也得加上servlet,和jsp里面一致

<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart.servlet</url-pattern>
</servlet-mapping>


如果是用的tomcat,那么所生成的临时图片都在tomcat目录中temp文件中,每次点击进入页面就会生成图片,时间一久tomcat中那这些没用的图片就会很多。得想办法删了,114行我注释的这句话session.removeAttribute("JFreeChart_Deleter");//将tomcat中temp的统计图片删除
这个就是删除生成的临时图片,但也局限性,就如这jsp中如果有三个统计,分开了每次跑后台,那么在后台每次都执行session.removeAttribute("JFreeChart_Deleter"),这样就会每次将前面的所生成的图片删除,那么三次跑后台到最后就只有最后一张图片了,所以尽量只走一次后台,或者后台整合到一个方法中,前台页面就一个url.如果确实得分开来用几个统计,那可用bat脚本将temp里面的临时图片删除(个人推荐这种方法),见http://liangjie5305579-126-com.iteye.com/admin/blogs/1743824.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值