JFreeChart(java画图)教程

本文介绍了JFreeChart图表库的配置步骤与开发方法,包括饼状图、柱状图和折线图的具体实现过程。提供了详细的代码示例,帮助读者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JFreeChart配置安装
    1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar
       是例子程序(该部分留给大家自己去研究)
    2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、
       lib\gnujaxp.jar
    3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入
       如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明:
       把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码:
                <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</url-pattern>
                </servlet-mapping>
               至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
       结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果
       是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。

JFreeChart开发

package dao;

import java.awt.Color;
import java.awt.Font;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
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 org.jfree.ui.TextAnchor;

 

public class FreeChartCommon {

 static String graphURL1 = null;

 /**
  * 饼状图
  */
 public static JFreeChart generatePieChart(String xml) {
  PieDataset dataset = getDataSet(xml);
   JFreeChart chart = ChartFactory.createPieChart3D("纳税考评信息饼状图", // 图表标题
    dataset, // 数据集
    true, // 是否显示图例
    false, // 是否生成工具
    false // 是否生成URL链接
    );
  chart.setBackgroundPaint(Color.pink);
  chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
  chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
  PiePlot3D plot = (PiePlot3D) chart.getPlot();

  plot.setLabelFont(new Font("SansSerif",Font.BOLD,12));

  plot.setCircular(true);

  plot.setLabelGap(0.01D);//间距
  //图片中显示百分比:默认方式 
        //设置无数据时的信息 
  plot.setNoDataMessage("无对应的数据,请重新查询。"); 

        //设置无数据时的信息显示颜色 
  plot.setNoDataMessagePaint(Color.red); 
        //图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位 
  plot.setLabelGenerator(new StandardPieSectionLabelGenerator( 
  "{0}={1}({2})", NumberFormat.getNumberInstance(), 
  new DecimalFormat("0.00%"))); 
         //图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例 
  plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator( 
  "{0}={1}({2})")); 
  return chart;
 }

 /**
  * 柱状图
  */
 public static JFreeChart generateBarChart(String xml) {
  CategoryDataset dataset = getDataSet2(xml);
  JFreeChart chart = ChartFactory.createBarChart3D("纳税考评信息柱状图", // 图表标题
    "", // 目录轴的显示标签
    "", // 数值轴的显示标签
    dataset, // 数据集
    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
    true, // 是否显示图例(对于简单的柱状图必须是false)
    false, // 是否生成工具
    false // 是否生成URL链接
    );
  //显示每个柱的数值,并修改该数值的字体属性
  chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
        chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
        
        CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象

        CategoryAxis domainAxis=plot.getDomainAxis();
         //水平底部列表
         domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
         //水平底部标题
         domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
         //垂直标题
         ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
         rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
         
  CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
  categoryplot.setNoDataMessage("无对应的数据,请重新查询。");
     categoryplot.getRenderer().setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
     categoryplot.getRenderer().setItemLabelsVisible(true);
     categoryplot.getRenderer().setPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,
                    TextAnchor.BOTTOM_LEFT));
     BarRenderer3D renderer  =   new  BarRenderer3D();
     renderer.setItemLabelGenerator( new  StandardCategoryItemLabelGenerator());
        renderer.setItemLabelsVisible( true );
        return chart;
 }

 /**
  * 折线图
  */
 public static JFreeChart generateLineChart(String xml) {
  

  CategoryDataset dataset = getDataSet3(xml);
  JFreeChart chart = ChartFactory.createLineChart("纳税考评折线图", // 图表标题
    "", // 目录轴的显示标签
    "", // 数值轴的显示标签
    dataset, // 数据集
    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
    true, // 是否显示图例(对于简单的柱状图必须是false)
    false, // 是否生成工具
    false // 是否生成URL链接
    );

  /*------------配置图表属性--------------*/
  // 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);
  
  /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
  //显示每个柱的数值,并修改该数值的字体属性
  chart.getTitle().setFont(new Font("宋体", Font.BOLD, 15));
    chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
    
    CategoryAxis domainAxis = plot.getDomainAxis();   
    /*------设置X轴坐标上的文字-----------*/ 
    domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11));   
    /*------设置X轴的标题文字------------*/ 
    domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));   
    NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();   
    /*------设置Y轴坐标上的文字-----------*/ 
    numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));   
     
    /*------设置Y轴的标题文字------------*/ 
    numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    numberaxis.setAutoRangeIncludesZero(true);
    numberaxis.setUpperMargin(0.20);
    numberaxis.setLabelAngle(Math.PI / 2.0);
       chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
       
//   获得renderer 注意这里是下嗍造型到lineandshaperenderer!! 
  LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer(); 
//
  lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见 
  lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见 

   //显示折点数据 
   lineandshaperenderer.setBaseItemLabelGenerator(new 
   StandardCategoryItemLabelGenerator()); 
   lineandshaperenderer.setBaseItemLabelsVisible(true); 
   
  return chart;
 }

 /**
  * 获取一个饼状图的简单数据集对象
  * 
  * @return
  */
 private static PieDataset getDataSet(String xml) {
  DefaultPieDataset dataset = new DefaultPieDataset();
//  try {
//   xml = "<ROOT>" + xml + "</ROOT>";
//   Document document = DocumentHelper.parseText(xml);
//   // 读取ITEM
//   List list = document.selectNodes("//ITEM");
//   // 获取NODE细节
//   Iterator it = list.iterator();
//   
//   while (it.hasNext()) {
//    Node node = (Node) it.next();
//    /**
//     * 
//     */
//    dataset.setValue(Tools.nullToSpace(node.valueOf("HZFS")), Double.parseDouble(node.valueOf("XMMC")));
//   
//   }
//
//  } catch (Exception e) {
//   
//    e.printStackTrace();
//   
//  }
    dataset.setValue("管理人员啊", 10.02D);

    dataset.setValue("市场人员啊", 20.23D);

    dataset.setValue("开发人员啊", 60.02D);

    dataset.setValue("OEM人员啊", 10.02D);

    dataset.setValue("其他人员啊", 5.11D);
    
    dataset.setValue("其他人员啊3", 5.11D);
  return dataset;
 }

 /**
  * 获取一个柱状图数据集对象
  * 
  * @return
  */
 private static CategoryDataset getDataSet2(String xml) {
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//  try {
//   xml = "<ROOT>" + xml + "</ROOT>";
//   Document document = DocumentHelper.parseText(xml);
//   // 读取ITEM
//   List list = document.selectNodes("//ITEM");
//   // 获取NODE细节
//   Iterator it = list.iterator();
//   while (it.hasNext()) {
//    Node node = (Node) it.next();
//    dataset.setValue(Double.parseDouble(node.valueOf("XMMC")), Tools
//      .nullToSpace(node.valueOf("HZFS")), Tools.nullToSpace(node
//      .valueOf("HZFS")));
//   }
//
//  } catch (Exception e) {
//   
//    e.printStackTrace();
//   
//  }
 //  各曲线名称
    String series1 = "计划";
    String series2 = "营销";
    String series3 = "开发"; 

    //    横轴名称(列名称)
    String type1 = "管理人员";
    String type2 = "市场人员";
    String type3 = "开发人员"; 
    
    dataset.setValue(10.02D,series1,type1);
    dataset.setValue(10.02D,series1,type2);
    dataset.setValue(10.02D,series1,type3);

    dataset.setValue(40.02D,series2,type1);
    dataset.setValue(40.02D,series2,type2);
    dataset.setValue(80.02D,series2,type3);
    
    dataset.setValue(50.02D,series3,type1);
    dataset.setValue(50.02D,series3,type2);
    dataset.setValue(60.02D,series3,type3);

  return dataset;
 }

 /**
  * 获取一个折线图数据集对象
  * 
  * @return
  */
 public static CategoryDataset getDataSet3(String xml) {
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//  try {
//   xml = "<ROOT>" + xml + "</ROOT>";
//   Document document = DocumentHelper.parseText(xml);
//   // 读取ITEM
//   List list = document.selectNodes("//ITEM");
//   // 获取NODE细节
//   Iterator it = list.iterator();
//
//   while (it.hasNext()) {
//    Node node = (Node) it.next();
//    dataset.setValue(Double.parseDouble(node.valueOf("ZF")), Tools
//      .nullToSpace(node.valueOf("XMMC")), Tools.nullToSpace(node
//      .valueOf("NF")));
//   }
//  } catch (Exception e) {
//   
//    e.printStackTrace();
//
//  }
 //  各曲线名称
    String series1 = "管理人员";
    String series2 = "市场人员";
    String series3 = "开发人员"; 

    //    横轴名称(列名称)
    String type1 = "计划";
    String type2 = "营销";
    String type3 = "洗衣机"; 

    dataset.setValue(0.0, series1, type1);
    dataset.setValue(4.2, series1, type2);
    dataset.setValue(3.9, series1, type3); 

    dataset.setValue(1.0, series2, type1);
    dataset.setValue(5.2, series2, type2);
    dataset.setValue(7.9, series2, type3); 

    dataset.setValue(2.0, series3, type1);
    dataset.setValue(9.2, series3, type2);
    dataset.setValue(8.9, series3, type3); 
    
  return dataset;
 }

 
    /**
     * 
     * @param request
     * @param session
     * @param out
     * @param xml
     * @param x 1表示折线图,2表示饼图,3表示柱状图
     * @return
     */
 public static String getGraphUrl(HttpServletRequest request, HttpSession session,
   PrintWriter out,String xml,int x) {
  JFreeChart chart=null;
  if(x==1){
      chart=generateLineChart(xml);
  }
  if(x==2){
   chart=generatePieChart(xml);
  }
  if(x==3){
   chart=generateBarChart(xml);
  }
   
  StandardEntityCollection sec = new StandardEntityCollection();
  ChartRenderingInfo info = new ChartRenderingInfo(sec);
  try {
   String filename = ServletUtilities.saveChartAsJPEG(chart, 500, 300,
     info, null);
 
   graphURL1 = request.getContextPath()
     + "/servlet/DisplayChart?filename=" + filename;
  } catch (Exception e) {
   System.out.println("error happens---" + e.toString());

  }
  return graphURL1;
 }
}

package navigate;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.Tools;

import dao.FreeChartCommon;

public class JfreeChar_Test extends HttpServlet {

 /**
  * Constructor of the object.
  */
 public JfreeChar_Test() {
  super();
 }

 /**
  * Destruction of the servlet. <br>
  */
 public void destroy() {
  super.destroy(); // Just puts "destroy" string in log
  // Put your code here
 }

 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
  response.setContentType("text/html;charset=GBK");
  response.setHeader("Cache-Control", "no-cache");
  PrintWriter out = response.getWriter();
  String method = request.getParameter("method");
  String xml=request.getParameter("xml");
  if (method == null) {
   method = "";
  }
  if (xml == null) {
   xml = "";
  }
  String filename="";
  if(method.equals("line"))
  {
   filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),1);
   out.print(filename);
  }
  if(method.equals("pie"))
  {
   filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),2);
   out.print(filename);
  }
  if(method.equals("bar"))
  {
   filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),3);
   out.print(filename);
  }
  }

}

页面:

<img id="imagetu" src="<%=request.getContextPath()%>/servlet/JfreeChar_Test?method=pie">

 

这也是我从网上摘抄的,供大家参阅。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值