Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495751
  • 博文数量: 102
  • 博客积分: 4001
  • 博客等级: 上校
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-21 16:01
文章分类

全部博文(102)

文章存档

2011年(1)

2010年(1)

2009年(56)

2008年(44)

我的朋友

分类: Java

2009-05-07 22:29:42

最新一个项目中,需要生成电力负荷分析曲线和电量分析图形,综合比较下来,使用JFreeChart生成曲线图和柱状图是最经济简便的方法。

JFreeChart是开放源代码站点SourceForge.net上的一个JAVA开源项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。

我们可以从jfree官方网站上()获取最新版本和相关资料,文档是不免费的,但可以在某些技术论坛上找到免费的。目前最新版本是1.0.9

jfreechart-1.0.9-demo-all.jar 设置JDK后可直接运行,演示各种图形的例子

jfreechart-1.0.9-lib.jar      相关的包,设置到项目的CLASSPATH

demo的源代码           建议下载后,新建项目运行研究

我们要在web项目中使用JFreeChart,在页面上生成各种图形,除了要把相关的jar包拷贝到 WEB-INF/lib下,还要在web.xml文件进行设置。

   

    DisplayChart

    org.jfree.chart.servlet.DisplayChart

   

   

    DisplayChart

    /DisplayChart

   

如果要生成pdf,还要加入itext.jar,解决导出文件的中文问题,建议使用Asian-itext.jar

下面我们就饼图、曲线图、柱状图为例子结合源码进行说明

电力用户分类

查看更多精彩图片

源代码

<%@ page contentType="text/html;charset=GBK"%>

<%@ page import="org.jfree.chart.*,org.jfree.chart.plot.PiePlot,

org.jfree.data.general.DefaultPieDataset,org.jfree.chart.servlet.ServletUtilities,java.awt.*"%>

<%

//设置数据集

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue("35KV及以上用户", 0.1);

dataset.setValue("10KV用户", 0.18);

dataset.setValue("380V用户", 0.2);

dataset.setValue("220V用户", 0.45);

dataset.setValue("其他", 0.1);

//通过工厂类生成JFreeChart对象

JFreeChart chart = ChartFactory.createPieChart3D("不同电压等级用户分布图", dataset, true, false, false);

PiePlot pieplot = (PiePlot) chart.getPlot();

pieplot.setLabelFont(new Font("宋体", 0, 12));

//没有数据的时候显示的内容

pieplot.setNoDataMessage("无数据显示");

pieplot.setCircular(false);

pieplot.setLabelGap(0.02D);

//生成png格式的图片

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);

String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;

%>

 

 某10KV用户的2007年度月负荷曲线分析

查看更多精彩图片

源代码:

<%@ page contentType="text/html;charset=GBK"%>

<%@ page import = "org.jfree.chart.ChartFactory,

              org.jfree.chart.JFreeChart,

              org.jfree.chart.servlet.ServletUtilities,

              org.jfree.chart.title.TextTitle,

              org.jfree.data.time.TimeSeries,

              org.jfree.data.time.Month,

              org.jfree.data.time.TimeSeriesCollection,

              java.awt.Font"%>

<%

//负荷分析统计时间线

TimeSeries timeSeries = new TimeSeries("负荷曲线分析", Month.class);

//时间曲线数据集合

TimeSeriesCollection lineDataset = new TimeSeriesCollection();

 

//构造数据集合

timeSeries.add(new Month(1, 2007), 10200);

timeSeries.add(new Month(2, 2007), 9000);

timeSeries.add(new Month(3, 2007), 7200);

timeSeries.add(new Month(4, 2007), 8200);

timeSeries.add(new Month(5, 2007), 8200);

timeSeries.add(new Month(6, 2007), 12200);

timeSeries.add(new Month(7, 2007), 13200);

timeSeries.add(new Month(8, 2007), 8300);

timeSeries.add(new Month(9, 2007), 12400);

timeSeries.add(new Month(10, 2007), 10500);

timeSeries.add(new Month(11, 2007), 10600);

timeSeries.add(new Month(12, 2007), 9500);

 

lineDataset.addSeries(timeSeries);

JFreeChart chart = ChartFactory.createTimeSeriesChart("负荷曲线分析", "月份", "千瓦时", lineDataset, true, true, true);

 

//设置子标题

TextTitle subtitle = new TextTitle("2007年度月负荷曲线", new Font("黑体", Font.BOLD, 12));

chart.addSubtitle(subtitle);

//设置主标题

chart.setTitle(new TextTitle("XX新城10KV变电站", new Font("隶书", Font.ITALIC, 15)));

chart.setAntiAlias(true);

 String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);

String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;

%>

 

 周电量统计

查看更多精彩图片

源代码:

<%@ page contentType="text/html;charset=GBK"%>

<%@ page import="org.jfree.chart.ChartFactory,

org.jfree.chart.JFreeChart,

org.jfree.chart.plot.PlotOrientation,

org.jfree.chart.servlet.ServletUtilities,

org.jfree.data.category.CategoryDataset,

org.jfree.data.general.DatasetUtilities"%>

<%

double[][] data = new double[][] {{1110}, {920}, {1230}, {1340}};

String[] rowKeys = {"一周", "二周","三周", "四周"};

String[] columnKeys = {""};

CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

JFreeChart chart = ChartFactory.createBarChart3D("XX10KV用户五月周电量统计图",

"周",

"电量",

dataset,

PlotOrientation.VERTICAL,

true,

false,

false);

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, null);

String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;

%>

 

 若要导出pdf文件

String path = request.getRealPath("/");

File filePDF=new File(path+"newPDF.pdf");

util.saveChartAsPDF(filePDF,chart,400,300,new DefaultFontMapper());

 

saveChartAsPDF方法

public void saveChartAsPDF(File file,JFreeChart chart,int width,int height,FontMapper mapper) throws IOException{

         OutputStream OPS=new BufferedOutputStream(new FileOutputStream(file));

         writeChartAsPDF(OPS,chart,width,height,mapper);

         OPS.close();

        }

       

public void writeChartAsPDF(OutputStream OPS,JFreeChart chart,int width,int height,FontMapper mapper){

        Rectangle pagesize=new Rectangle(width,height);

        Document document=new Document(pagesize,50,50,50,50);

        try{

        PdfWriter writer=PdfWriter.getInstance(document,OPS);

        document.addAuthor("Felix");//文档作者

        document.addSubject("mypdf");//文档主题

        document.open();

        PdfContentByte cb = writer.getDirectContent();

        PdfTemplate tp = cb.createTemplate(width, height);

            //这里很重要,解决了东方语言显示的问题。

            Graphics2D g2d =

                tp.createGraphics(

                    500,

                    300,

                    new AsianFontMapper(

                        AsianFontMapper.ChineseSimplifiedFont,

                        AsianFontMapper.ChineseSimplifiedEncoding_H));

            Rectangle2D r2d = new Rectangle2D.Double(0, 0, width, height);

          

            chart.draw(g2d, r2d);

            g2d.dispose();

            cb.addTemplate(tp, 0, 0);

          

        }catch(Exception e){}

        document.close();

        }

 

用JFreeChart在页面上生成图表非常简单,其他图形生成可参照DEMO源代码,组织好数据源就可以了。更进一步的问题是对数据的深度查询,即点击图形链接到详细的数据列表。

阅读(1421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~