JfreeChart常用图形实现

来源:互联网 发布:网络管理经验 编辑:程序博客网 时间:2024/06/03 10:54

JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。

          从官方下载到相应的文件后,解压缩后,将jfreechart-1.0.11.jar、jcommon-1.0.14.jar导入到应用中,就可以进行相关的开发。最好下载1.0之间的版本,官方提供了demo。开发文档需要收费的,所以还是在网上查阅相关资料。本例中实现了简单柱状图,复杂柱状图,非3D的折线图,3D的折线图,时序图,饼状图等图。

JSP代码:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>  <%@ page import="org.jfree.chart.servlet.ServletUtilities,                 com.lyq.util.*"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>    <head>      <title>JFreeChart各种图</title>  </head>    <body>  <center>  <h1>柱状图</h1>  <%   String fileName1 = ServletUtilities.saveChartAsJPEG(ZhuzhuangChart.createChart(),500,300,session);     String graphURL1 = request.getContextPath()+ "/DisplayChart?filename=" + fileName1;   %>    <img src="<%=graphURL1%>" border="1"><h1>复杂柱状图</h1>  <%   String fileName2 = ServletUtilities.saveChartAsJPEG(BarChartDemo.createChart(),500,300,session);     String graphURL2 = request.getContextPath()+ "/DisplayChart?filename=" + fileName2;   %>    <img src="<%=graphURL2%>" border="1"><h1>非3D的折线图</h1>  <%   String fileName3 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(false),500,300,session);     String graphURL3 = request.getContextPath()+ "/DisplayChart?filename=" + fileName3;   %><img src="<%=graphURL3%>" border="1"><h1>3D的折线图</h1>  <%   String fileName4 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(true),500,300,session);     String graphURL4 = request.getContextPath()+ "/DisplayChart?filename=" + fileName4;   %><img src="<%=graphURL4%>" border="1"><h1>时序图</h1>  <%   String fileName5 = ServletUtilities.saveChartAsJPEG(TimeSeriesChart.createChart(),800,600,session);     String graphURL5 = request.getContextPath()+ "/DisplayChart?filename=" + fileName5;   %><img src="<%=graphURL5%>" border="1"><h1>饼状图</h1>  <%   String fileName6 = ServletUtilities.saveChartAsJPEG(PieChart.createChart(),500,300,session);     String graphURL6 = request.getContextPath()+ "/DisplayChart?filename=" + fileName6;   %><img src="<%=graphURL6%>" border="1"></center></body></html>

简单柱状图生成java代码:

package com.lyq.util;import java.awt.Font;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.StandardChartTheme;import org.jfree.chart.plot.PlotOrientation;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;public class ZhuzhuangChart {/**       * 创建数据集合       * @return CategoryDataset对象   */  public static CategoryDataset createDataSet() {          //实例化DefaultCategoryDataset对象          DefaultCategoryDataset dataSet = new DefaultCategoryDataset();          //向数据集合中添加数据          dataSet.addValue(500, "JAVA图书", "J2SE类");      dataSet.addValue(100, "JAVA图书", "J2ME类");      dataSet.addValue(900, "JAVA图书", "J2EE类");      return dataSet;    }      /**       * 创建JFreeChart对象       * @return JFreeChart对象  */ public static JFreeChart createChart() {          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); //设置主题样式          //通过ChartFactory创建JFreeChart  JFreeChart chart = ChartFactory.createBarChart3D(                  "JAVA图书销量统计",           //图表标题                  "JAVA图书",                   //横轴标题                  "销量(本)",                    //纵轴标题                  createDataSet(),                    //数据集合                   PlotOrientation.VERTICAL,       //图表方向                  false,                      //是否显示图例标识                  false,                      //是否显示tooltips                  false);                     //是否支持超链接                  return chart;   }}

复杂柱状图生成JAVA代码:

package com.lyq.util;import java.awt.Color;import java.awt.Font;import java.io.*;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.chart.*;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.CategoryLabelPositions;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.*;import org.jfree.chart.title.TextTitle;/** * 该类用于演示最简单的柱状图生成 * @author Winter Lau */public class BarChartDemo {public static JFreeChart createChart(){CategoryDataset dataset = getDataSet2();JFreeChart chart = ChartFactory.createBarChart3D("水果产量图", // 图表标题"水果", // 目录轴的显示标签"产量", // 数值轴的显示标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成URL链接);configFont(chart);//字体配置方法(解决中文乱码问题)return chart;}/** * 获取一个演示用的简单数据集对象 * @return */private static CategoryDataset getDataSet() {DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(100, null, "苹果");dataset.addValue(200, null, "梨子");dataset.addValue(300, null, "葡萄");dataset.addValue(400, null, "香蕉");dataset.addValue(500, null, "荔枝");return dataset;}/** * 获取一个演示用的组合数据集对象 * @return */private static CategoryDataset getDataSet2() {DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(100, "北京", "苹果");dataset.addValue(100, "上海", "苹果");dataset.addValue(100, "广州", "苹果");dataset.addValue(200, "北京", "梨子");dataset.addValue(200, "上海", "梨子");dataset.addValue(200, "广州", "梨子");dataset.addValue(300, "北京", "葡萄");dataset.addValue(300, "上海", "葡萄");dataset.addValue(300, "广州", "葡萄");dataset.addValue(400, "北京", "香蕉");dataset.addValue(400, "上海", "香蕉");dataset.addValue(400, "广州", "香蕉");dataset.addValue(500, "北京", "荔枝");dataset.addValue(500, "上海", "荔枝");dataset.addValue(500, "广州", "荔枝");return dataset;}//字体配置方法(解决中文乱码问题)    private static void configFont(JFreeChart chart) {        // 配置字体        Font xfont = new Font("宋体", Font.BOLD, 12);// X轴        Font yfont = new Font("宋体", Font.BOLD, 12);// Y轴        Font kfont = new Font("宋体", Font.BOLD, 12);// 底部        Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题        CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象        // 图片标题        chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));         // 底部        chart.getLegend().setItemFont(kfont);         // X 轴        CategoryAxis domainAxis = plot.getDomainAxis();        domainAxis.setLabelFont(xfont);// 轴标题        domainAxis.setTickLabelFont(xfont);// 轴数值        domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的label斜显示         // Y 轴        ValueAxis rangeAxis = plot.getRangeAxis();        rangeAxis.setLabelFont(yfont);        rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色        rangeAxis.setTickLabelFont(yfont);    }} 

折线图java代码:

package com.lyq.util;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.util.Random;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;public class LineChart {//字体  private static final Font PLOT_FONT = new Font("宋体", Font.BOLD, 15);      /**       * 创建数据集合       * @return CategoryDataset对象       */     public static CategoryDataset createDataSet() {          //图例名称          String[] line = { "杀毒软件一", "杀毒软件二", "杀毒软件三" };          //类别          String[] category = { "2004年","2005年","2006年", "2007年", "2008年" };          Random random = new Random();   //实例化Random对象          //实例化DefaultCategoryDataset对象          DefaultCategoryDataset dataSet = new DefaultCategoryDataset();          //使用循环向数据集合中添加数据          for (int i = 0; i < line.length; i++) {              for (int j = 0; j < category.length; j++) {                  dataSet.addValue(100000 + random.nextInt(100000), line[i],                          category[j]);              }          }          return dataSet;      }      /**       * 生成制图对象       * @param is3D 是否为3D效果       * @return JFreeChart对象       */     public static JFreeChart createChart(boolean is3D) {          JFreeChart chart = null;          if(is3D){              chart = ChartFactory.createLineChart3D(                      "2004-2008年优秀杀毒软件杀毒数量统计",   //图表标题                          "杀毒软件",                         //X轴标题                      "查杀病毒数量",                //Y轴标题                      createDataSet(),             //绘图数据集                      PlotOrientation.VERTICAL,     //绘制方向                      true,                          //显示图例                      true,                          //采用标准生成器                      false                          //是否生成超链接                      );          }else{              chart = ChartFactory.createLineChart(            "2004-2008年优秀杀毒软件杀毒数量统计", //图表标题                      "杀毒软件",                  //X轴标题                      "查杀病毒数量",            //Y轴标题                          createDataSet(),                 //绘图数据集                      PlotOrientation.VERTICAL,    //绘制方向                          true,                        //是否显示图例                      true,                        //是否采用标准生成器                          false                    //是否生成超链接                      );          }                    //设置标题字体          chart.getTitle().setFont(new Font("隶书", Font.BOLD, 23));          //设置图例类别字体          chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));          chart.setBackgroundPaint(new Color(255,255,255));   //设置背景色          //获取绘图区对象          CategoryPlot plot = chart.getCategoryPlot();          plot.getDomainAxis().setLabelFont(PLOT_FONT);     //设置横轴字体          plot.getDomainAxis().setTickLabelFont(PLOT_FONT);//设置坐标轴标尺值字体          plot.getRangeAxis().setLabelFont(PLOT_FONT);    //设置纵轴字体          plot.setBackgroundPaint(Color.WHITE);         //设置绘图区背景色          plot.setRangeGridlinePaint(Color.RED);       //设置水平方向背景线颜色          plot.setRangeGridlinesVisible(true);       //设置是否显示水平方向背景线,默认值为true          plot.setDomainGridlinePaint(Color.RED);     //设置垂直方向背景线颜色          plot.setDomainGridlinesVisible(true);    //设置是否显示垂直方向背景线,默认值为false          //获取折线对象          LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot                      .getRenderer();              BasicStroke realLine = new BasicStroke(//设置实线              5.0f,            BasicStroke.CAP_SQUARE,             //端点风格                  BasicStroke.JOIN_MITER);                 //折点风格 ;               float dashes[] = { 8.0f };                      //定义虚线数组          BasicStroke brokenLine = new BasicStroke(        5.0f,  //线条粗细                  BasicStroke.CAP_SQUARE,             //端点风格                  BasicStroke.JOIN_MITER,                 //折点风格                  8.f,                                //折点处理办法                  dashes,                         //虚线数组                  0.0f);                          //虚线偏移量          renderer.setSeriesStroke(1, brokenLine);     //利用虚线绘制      renderer.setSeriesStroke(2, brokenLine);//利用虚线绘制      renderer.setSeriesStroke(3, realLine);//利用实线绘制          return chart;      }  }

饼状图java代码:

package com.lyq.util;import java.awt.Font;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.labels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.PiePlot3D;import org.jfree.data.general.DefaultPieDataset;import org.jfree.data.general.PieDataset;public class PieChart { public static JFreeChart createChart(){  PieDataset dataset = getDataSet();  JFreeChart chart = ChartFactory.createPieChart3D("CD类别对照图", // 主标题    dataset, // 图形需要的数据    true, // 图例    false, // 是否在图表上显示提示    false); // 该图形是否产生url连接  // 获取图表对象 plot(图形的绘制结构)  PiePlot3D piePlot3D = (PiePlot3D) chart.getPlot();  /*   * 产生饼图上个的数字和百分比 {0}:{1}({2}) {0} : dataset.setValue("摇滚乐", 8);值中的"摇滚乐" {1} : dataset.setValue("摇滚乐", 8);值中的"8" {2} : 该值占用的百分比   */  String labelFormat = "{0}:{1}({2})";  piePlot3D.setLabelGenerator(new StandardPieSectionLabelGenerator(labelFormat));  piePlot3D.setLabelFont(new Font("黑体", Font.PLAIN, 18));  // 处理乱码  // 处理主标题  chart.getTitle().setFont(new Font("黑体", Font.PLAIN, 18));  // 处理子标题  chart.getLegend().setItemFont(new Font("黑体", Font.PLAIN, 18));  // 设置饼图上的中文字体 放置乱码  piePlot3D.setLabelFont(new Font("黑体", Font.PLAIN, 18));  return chart; } private static PieDataset getDataSet() {  DefaultPieDataset dataset = new DefaultPieDataset();  /*   * 摇滚乐 8 外国歌曲 1 民乐 6 流行音乐 6   */  dataset.setValue("摇滚乐", 8);  dataset.setValue("外国歌曲", 1);  dataset.setValue("民乐", 6);  dataset.setValue("流行音乐", 6);  return dataset; }}

时序图java源代码:

package com.lyq.util;import java.awt.Color;import java.awt.Font;import java.text.DateFormat;import java.text.SimpleDateFormat;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.axis.DateTickUnit;import org.jfree.chart.axis.DateTickUnitType;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.XYPlot;import org.jfree.data.time.Day;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.xy.XYDataset;public class TimeSeriesChart { //字体  private static final Font PLOT_FONT = new Font("黑体", Font.ITALIC , 18);      /**       * 创建数据集合       * @return XYDataset对象       */ public static XYDataset createDataset() {          //实例化TimeSeries对象          TimeSeries timeseries = new TimeSeries("Data");          Day day = new Day(1, 1, 2008);  //实例化Day          double d = 3000D;          //添加一年365天的数据          for (int i = 0; i < 365; i++) {               d = d + (Math.random() - 0.5) * 10; //创建随机数据              timeseries.add(day, d); //向数据集合中添加数据              day = (Day) day.next();           }          //创建TimeSeriesCollection集合对象          TimeSeriesCollection timeSeriesCollection =new TimeSeriesCollection(timeseries);          //返回数据集合对象          return timeSeriesCollection;      }      /**       * 生成制图对象       * @return JFreeChart对象       */ public static JFreeChart createChart(){          //创建时序图对象          JFreeChart chart = ChartFactory.createTimeSeriesChart(                  "编程词典全国销量统计",       //标题                  "销售月份",                 //时间轴标签                  "销量(份)",                //数据轴标签                  createDataset(),                //数据集合                  false,                  //是否显示图例标识                  false,                      //是否显示tooltips                  false);                 //是否支持超链接          //设置标题字体          chart.getTitle().setFont(new Font("隶书", Font.BOLD, 26));          //设置背景色          chart.setBackgroundPaint(new Color(252,175,134));          XYPlot plot = chart.getXYPlot();        //获取图表的绘制属性          plot.setDomainGridlinesVisible(false);  //设置网格不显示          //获取时间轴对象          DateAxis dateAxis = (DateAxis) plot.getDomainAxis();          dateAxis.setLabelFont(PLOT_FONT);   //设置时间轴字体          //设置时间轴标尺值字体          dateAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12));          dateAxis.setLowerMargin(0.0);       //设置时间轴上显示的最小值          //获取数据轴对象          ValueAxis valueAxis = plot.getRangeAxis();          valueAxis.setLabelFont(PLOT_FONT);  //设置数据字体          DateFormat format = new SimpleDateFormat("MM月份");   //创建日期格式对象          //创建DateTickUnit对象          DateTickUnit dtu = new DateTickUnit(DateTickUnitType.DAY,29,format);          dateAxis.setTickUnit(dtu);          //设置日期轴的日期标签          return chart;      }}

运行结果:

柱状图

复杂柱状图

非3D的折线图

3D的折线图

时序图

饼状图

原创粉丝点击