急!!求高手帮忙啊,JFreeChart整了一周了,没有进展啊!!
要求:同时生成柱状图和折线图。折线图是柱状图的值的增减百分数,并在折线图的折点出显示相应的百分数。如能帮忙,小弟感激不尽,愿把所有的积分奉上!
[解决办法]
package com.weboa.system.util;
import java.awt.Color;
import java.awt.Font;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.servlet.*;
import com.weboa.system.model.DrawerContent;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
/**
* @author 石洲祥
*
*通过JFreeChart会图统计图表
*/
public class Drawer {
/**
* 生成2D饼图
* @param request
* @param response
* @param title图表标题
* @param contents图表内容
* @param Width图表宽度
* @param Height图表高度
* @return String图表临时文件存放路径
*/
public String getImageURL_2DPie(HttpServletRequest request,HttpServletResponse response,
String Title,List Contents,Integer Width,Integer Height){
String fileName = null;
//默认宽度和高度,500是图片长度,300是图片高度
if(Width == null)Width = 500;
if(Height == null)Height = 300;
try{
PiePlot plot = new PiePlot(setDataset(Contents));
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
//可选,设置图片背景色
chart.setBackgroundPaint(java.awt.Color.white);
//可选,设置图片标题
chart.setTitle(Title);
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
fileName = ServletUtilities.saveChartAsPNG(chart, Width, Height, info, request.getSession());
}catch (Exception ex) {
System.out.print(ex.fillInStackTrace());
return null;
}
return request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;
}
/**
* 生成3D饼图
* @param request
* @param response
* @param title图表标题
* @param contents图表内容
* @param Width图表宽度
* @param Height图表高度
* @return String图表临时文件存放路径
*/
public String getImageURL_3DPie(HttpServletRequest request,HttpServletResponse response,
String Title,List Contents,String unit,Integer Width,Integer Height){
if(unit == null)unit = "RMB";
String fileName = null;
//默认宽度和高度,500是图片长度,300是图片高度
if(Width == null)Width = 500;
if(Height == null)Height = 300;
try{
//3D饼图
PiePlot3D plot = new PiePlot3D(setDataset(Contents));
//设定链接 ("link.jsp","section"));//section为参数,不填写则默认为category
// plot.setURLGenerator(new StandardPieURLGenerator("link.jsp","section"));
//指定图片的透明度
plot.setForegroundAlpha(0.5f);
//指定显示的饼图上圆形(false)还椭圆形(true)
plot.setCircular(false);
//显示百分比
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}: ({1}"+unit+", {2})"));
JFreeChart chart = new JFreeChart("",JFreeChart.DEFAULT_TITLE_FONT, plot, true);
//设置图片背景色
chart.setBackgroundPaint(java.awt.Color.white);
//设置图片标题属性
chart.setTitle(Title);
//把生成的图片放到临时目录
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
fileName = ServletUtilities.saveChartAsPNG(chart, Width, Height, info, request.getSession());
}catch (Exception ex) {
System.out.print(ex.fillInStackTrace());
return null;
}
return request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;
}
/**
* 生成3D柱状图
* @param request
* @param response
* @param Title_Top图表上方显示文字
* @param Title_Left图表左方显示文字
* @param Title_Down图表下方显示文字
* @param Contents图表内容
* @param Width图表宽度
* @param Height图表高度
* @return String 图表临时文件存放路径
*/
public String getImageURL_3DBar(HttpServletRequest request,HttpServletResponse response,
String Title_Top,String Title_Left,String Title_Down,List Contents,Integer Width,Integer Height){
CategoryDataset dataset = setDataSet(Contents);
String fileName = null;
//默认宽度和高度,500是图片长度,300是图片高度
if(Width == null)Width = 500;
if(Height == null)Height = 300;
JFreeChart chart = ChartFactory.createBarChart3D(
Title_Top, // 图表标题
Title_Down, // 目录轴的显示标签
Title_Left, // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
true // 是否生成URL链接
);
CategoryPlot plot = chart.getCategoryPlot();//获得图表区域对象
//设置图表的纵轴和横轴org.jfree.chart.axis.CategoryAxis
org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLowerMargin(0.1);//设置距离图片左端距离此时为10%
domainAxis.setUpperMargin(0.1);//设置距离图片右端距离此时为百分之10
domainAxis.setCategoryLabelPositionOffset(10);//图表横轴与标签的距离(10像素)
domainAxis.setCategoryMargin(0.2);//横轴标签之间的距离20%
//domainAxis.setMaximumCategoryLabelLines(1);
//domainAxis.setMaximumCategoryLabelWidthRatio(0);
//设定柱子的属性
org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setUpperMargin(0.1);//设置最高的一个柱与图片顶端的距离(最高柱的10%)
//设置图表的颜色
org.jfree.chart.renderer.category.BarRenderer3D renderer;
renderer = new org.jfree.chart.renderer.category.BarRenderer3D();
renderer.setBaseOutlinePaint(Color.red);
renderer.setSeriesPaint(0,Color.red);//计划柱子的颜色为青色
renderer.setSeriesOutlinePaint(0,Color.BLACK);//边框为黑色
renderer.setSeriesPaint(1, new Color(0, 255, 0));//实报柱子的颜色为绿色
renderer.setSeriesOutlinePaint(1,Color.red);//边框为红色
renderer.setItemMargin(0.1);//组内柱子间隔为组宽的10%
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("宋体",Font.BOLD,12));//12号黑体加粗
renderer.setItemLabelPaint(Color.black);//字体为黑色
renderer.setItemLabelsVisible(true);
plot.setRenderer(renderer);//使用我们设计的效果
//设置纵横坐标的显示位置
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//学校显示在下端(柱子竖直)或左侧(柱子水平)
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); //人数显示在下端(柱子水平)或左侧(柱子竖直)
try {
//把生成的图片放到临时目录
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
fileName = ServletUtilities.saveChartAsPNG(chart, Width, Height, info, request.getSession());
}catch (Exception e) {
return null;
}
return request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;
}
/**
* 设置饼图图表内容
* @return DefaultPieDataset
*/
private DefaultPieDataset setDataset(List Contents) {
DefaultPieDataset data = new DefaultPieDataset();
if(Contents != null)if(Contents.size() > 0){
DrawerContent drawerContent = null;
for(int i=0;i<Contents.size();i++){
drawerContent = (DrawerContent)Contents.get(i);
data.setValue(drawerContent.getName(), drawerContent.getValue());
}
}
return data;
}
/**
* 设置柱状图图表内容
* @param Contents
* @return CategoryDataset
*/
private CategoryDataset setDataSet(List Contents) {
DefaultCategoryDataset data = new DefaultCategoryDataset();
if(Contents != null)if(Contents.size() > 0){
DrawerContent drawerContent = null;
for(int i=0;i<Contents.size();i++){
drawerContent = (DrawerContent)Contents.get(i);
data.addValue(drawerContent.getValue(), drawerContent.getTitle(), drawerContent.getName());
}
}
return data;
}
}