分类: Java
2009-05-07 22:29:42
JFreeChart是开放源代码站点SourceForge.net上的一个JAVA开源项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
我们可以从jfree官方网站上()获取最新版本和相关资料,文档是不免费的,但可以在某些技术论坛上找到免费的。目前最新版本是
jfreechart- jfreechart- demo的源代码 建议下载后,新建项目运行研究 |
我们要在web项目中使用JFreeChart,在页面上生成各种图形,除了要把相关的jar包拷贝到 WEB-INF/lib下,还要在web.xml文件进行设置。
|
如果要生成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源代码,组织好数据源就可以了。更进一步的问题是对数据的深度查询,即点击图形链接到详细的数据列表。