zoukankan      html  css  js  c++  java
  • JfreeChart的使用 小强斋

    JfreeChart的使用

    一、JFreeChart 项目简介

    JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等。JFreeChart可以方便的与Swing相结合使用,还可以导入到Web页面中,更是可以方便的利用其工厂方法将图表写入jpeg或者png格式的图片中

    官     网   :http://www.jfree.org/jfreechart/index.html

    下载地址 :http://sourceforge.net/projects/jfreechart/files/

    API         :  http://www.jfree.org/jfreechart/api/javadoc/index.html

    二、JFreeChart 核心类库介绍:

    研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形 本身有关,后者与图形显示的数据有关。核心类主要有:
    org.jfree.chart.JFreeChart :图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
    org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
    org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
    org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
    org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
    org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目的鼠标点击链接
    XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

    三、建立jfreechart的主要步骤

    要建立一个JFreeChart图形主要有以下个步骤(以柱图为例):

    第一步:建立DataSet数据源
    第二步:创造JFreeChart
    第三步:设置图形显示的属性
    第四步:写入图片或输出界面利用

    四、开发例子

    4.1直接生成图片

    PieChartPicture.java

    import java.awt.Color;
    import java.awt.Font;
    import java.io.FileOutputStream;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.general.PieDataset;
    
    public class PieChartPicture {
    	public static void main(String[] args) {
    		PieDataset dataset = getDataSet();
    		JFreeChart chart = ChartFactory.createPieChart3D(" 项目进度分布", // chart title
    				dataset,// data
    				true,// include legend
    				true, false);
    		PiePlot3D plot = (PiePlot3D) chart.getPlot();
    		// 图片中显示百分比:默认方式
            //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
    		// 图片中显示百分比:自定义方式,{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})"));
    		// 设置背景色为白色
    		chart.setBackgroundPaint(Color.white);
    		// 指定图片的透明度(0.0-1.0)
    		plot.setForegroundAlpha(1.0f);
    		// 指定显示的饼图上圆形(false)还椭圆形(true)
    		plot.setCircular(true);
    		// 设置图标题的字体
    		Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
    		TextTitle title = new TextTitle(" 项目状态分布");
    		title.setFont(font);
    		chart.setTitle(title);
    		//设置图中图例的字体
    		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            // 设置图下面图例的字体
    		LegendTitle legend = chart.getLegend();
    		legend.setItemFont(new Font("宋体", Font.BOLD, 14));
    
    		FileOutputStream fos_jpg = null;
    		try {
    			fos_jpg = new FileOutputStream("D:\\项目状态分布.jpg");
    			ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 640, 480,null);
    			fos_jpg.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	private static PieDataset getDataSet() {
    		DefaultPieDataset dataset = new DefaultPieDataset();
    		dataset.setValue("市场前期", new Double(10));
    		dataset.setValue("立项", new Double(15));
    		dataset.setValue("计划", new Double(10));
    		dataset.setValue("需求与设计", new Double(10));
    		dataset.setValue("执行控制", new Double(35));
    		dataset.setValue("收尾", new Double(10));
    		dataset.setValue("运维", new Double(10));
    		return dataset;
    	}
    }

    4.2 ApplicationFrame 方式

    import java.awt.Color;
    import java.awt.Font;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import javax.swing.JPanel;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.general.PieDataset;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;
    
    public class PieChartDemo_ApplicationFrame extends ApplicationFrame { 
    
    public PieChartDemo_ApplicationFrame(String title) { 
    super(title); 
    setContentPane(createDemoPanel()); 
    } 
    private static JFreeChart createChart(PieDataset dataset) { 
    JFreeChart chart = ChartFactory.createPieChart3D( " 项目进度分布", // chart title
    		dataset,// data
    		true,// include legend
    		true, false);
    PiePlot3D plot = (PiePlot3D) chart.getPlot();
    // 图片中显示百分比:默认方式
    //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
    // 图片中显示百分比:自定义方式,{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})"));
    // 设置背景色为白色
    chart.setBackgroundPaint(Color.white);
    // 指定图片的透明度(0.0-1.0)
    plot.setForegroundAlpha(1.0f);
    // 指定显示的饼图上圆形(false)还椭圆形(true)
    plot.setCircular(true);
    // 设置图标题的字体
    Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
    TextTitle title = new TextTitle(" 项目状态分布");
    title.setFont(font);
    chart.setTitle(title);
    //设置图中图例的字体
    plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
    // 设置图下面图例的字体
    LegendTitle legend = chart.getLegend();
    legend.setItemFont(new Font("宋体", Font.BOLD, 14));
    
    
    return chart; 
    } 
    
    public static JPanel createDemoPanel() { 
    JFreeChart chart = createChart(createDataset()); 
    return new ChartPanel(chart); 
    } 
    
    private static  PieDataset createDataset() {
    	DefaultPieDataset dataset = new DefaultPieDataset();
    	dataset.setValue("市场前期", new Double(10));
    	dataset.setValue("立项", new Double(15));
    	dataset.setValue("计划", new Double(10));
    	dataset.setValue("需求与设计", new Double(10));
    	dataset.setValue("执行控制", new Double(35));
    	dataset.setValue("收尾", new Double(10));
    	dataset.setValue("运维", new Double(10));
    	return dataset;
    }
    
    public static void main(String[] args) { 
    PieChartDemo_ApplicationFrame demo = new PieChartDemo_ApplicationFrame("Pie Chart Demo 1"); 
    demo.pack(); 
    RefineryUtilities.centerFrameOnScreen(demo); 
    demo.setVisible(true); 
    } 
    } 
    

    4.3  jsp+servlet+javabean方式

    jsp页面,调用javabean的方法生成chart,并将 chart以BufferedImage形式写入session。session.setAttribute("chartImage", chartImage);

    在servlet中获得chart,  BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");设置response.setContentType("image/png");

    页面调用servlet显示图片。<img src="http://localhost:8080/jfreechart/servlet/ChartViewer" border=0 >

    创建servlet

    package com.ncepu;
    
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.keypoint.PngEncoder;
    
    public class ChartViewer extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init() throws ServletException {
    	}
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 从session 中获得chart
    		HttpSession session = request.getSession();
    		BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");
    		// 设置 content type so the browser can see this as a picture
    		response.setContentType("image/png");
    		// send the picture
    		PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);
    		response.getOutputStream().write(encoder.pngEncode());
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    
    	public void doPut(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	}
    
    
    	public void destroy() {
    	}
    }
    

    配置servlet

    	<servlet>
    		<servlet-name>ChartViewer</servlet-name>
    		<servlet-class>com.ncepu.ChartViewer</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>ChartViewer</servlet-name>
    		<url-pattern>/servlet/ChartViewer</url-pattern>
    	</servlet-mapping>

    javabean中生成chart

    package com.ncepu;
    
    import java.awt.Color;
    import java.awt.image.BufferedImage;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartRenderingInfo;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.data.general.DefaultPieDataset;
    
    public class Pie3DDemo {
    	// 生成数据集
    	private DefaultPieDataset getDataset() {
    		String[] section = new String[] { "Jan", "Feb", "Mar", "Apr", "May",
    				"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    		double[] data = new double[section.length];
    		for (int i = 0; i < data.length; i++) {
    			data[i] = 10 + (Math.random() * 10);
    		}
    		DefaultPieDataset dataset = new DefaultPieDataset();
    		for (int i = 0; i < data.length; i++) {
    			dataset.setValue(section[i], data[i]);
    		}
    		return dataset;
    	}
    
    	public String getChartViewer(HttpServletRequest request,HttpServletResponse response) {
    		DefaultPieDataset dataset = getDataset();
    		// 生产chart
    		JFreeChart chart = ChartFactory.createPieChart3D("Pie3D Chart Demo",dataset, true, true, false);
    		// 设置背景色
    		chart.setBackgroundPaint(Color.cyan);
    		PiePlot plot = (PiePlot) chart.getPlot();
    		plot.setNoDataMessage("No data available");
    		plot.setLabelGenerator(null);
    
    		ChartRenderingInfo info = null;
    		HttpSession session = request.getSession();
    		try {
    			// Create RenderingInfo object
    			response.setContentType("text/html");
    			info = new ChartRenderingInfo(new StandardEntityCollection());
    			BufferedImage chartImage = chart.createBufferedImage(640, 400, info);
    			// 将 chart以BufferedImage形式写入session,
    			session.setAttribute("chartImage", chartImage);
    		} catch (Exception e) {
    		}
    		
    		String pathInfo = "http://";
    		pathInfo += request.getServerName();
    		int port = request.getServerPort();
    		pathInfo += ":" + String.valueOf(port);
    		pathInfo += request.getContextPath();
    		String chartViewer = pathInfo + "/servlet/ChartViewer";
    		return chartViewer; 
    	}
    }

    页面index.jsp

    <html> 
    <head> 
    <title>Pie Chart Demo 1</title> 
    </head> 
    <jsp:useBean id="myChart" scope="session" class="com.ncepu.Pie3DDemo" /> 
    <body> 
    <h2>Pie Chart Demo</h2> 
    <%String chartViewer = myChart.getChartViewer(request, response);%> 
    <img src="<%=chartViewer%>" border=0 > 
    <img src="http://localhost:8080/jfreechart/servlet/ChartViewer" border=0 > 
    </body> 
    </html> 

    4.4  web应用中推荐方式---->配置DisplayChart

    package jfree;
    import java.awt.Color;
    import java.awt.Font;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    import java.text.SimpleDateFormat;
    
    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.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.labels.StandardXYToolTipGenerator;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.ui.RectangleInsets;
    
    /**
     * 曲线图的绘制
     */
    public class LineXYChart {
    	/**
    	 * 返回生成图片的文件名
    	 * 
    	 * @param session
    	 * @param pw
    	 * @return 生成图片的文件名
    	 */
    	public String getLineXYChart(HttpSession session, PrintWriter pw) {
    		
    		
    
    		XYDataset dataset = this.createDateSet();// 建立数据集
    		String fileName = null;
    		// 建立JFreeChart
    		JFreeChart chart = ChartFactory.createTimeSeriesChart("JFreeChart时间曲线序列图", // title
    				"Date", // x-axis label
    				"Price", // y-axis label
    				dataset, // data
    				true, // create legend?
    				true, // generate tooltips?
    				false // generate URLs?
    				);
    		// 设置JFreeChart的显示属性,对图形外部部分进行调整
    		chart.setBackgroundPaint(Color.red);// 设置曲线图背景色
    		// 设置字体大小,形状
    		Font font = new Font("宋体", Font.BOLD, 16);
    		TextTitle title = new TextTitle("JFreeChart时间曲线序列图", font);
    		chart.setTitle(title);
    		// 副标题
    		TextTitle subtitle = new TextTitle("副标题", new Font("黑体", Font.BOLD, 12));
    		chart.addSubtitle(subtitle);
    		chart.setTitle(title); // 标题
    		// 设置图示标题字符
    		// TimeSeries s1 = new TimeSeries("历史曲线", Day.class);该中文字符
    		LegendTitle legengTitle = chart.getLegend();
    		legengTitle.setItemFont(font);
    		XYPlot plot = (XYPlot) chart.getPlot();// 获取图形的画布
    		plot.setBackgroundPaint(Color.lightGray);// 设置网格背景色
    		plot.setDomainGridlinePaint(Color.green);// 设置网格竖线(Domain轴)颜色
    		plot.setRangeGridlinePaint(Color.white);// 设置网格横线颜色
    		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));// 设置曲线图与xy轴的距离
    		plot.setDomainCrosshairVisible(true);
    		plot.setRangeCrosshairVisible(true);
    		XYItemRenderer r = plot.getRenderer();
    		if (r instanceof XYLineAndShapeRenderer) {
    			XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
    			renderer.setBaseShapesVisible(true);
    			renderer.setBaseShapesFilled(true);
    			renderer.setShapesVisible(true);// 设置曲线是否显示数据点
    		}
    		// 设置Y轴
    		NumberAxis numAxis = (NumberAxis) plot.getRangeAxis();
    		NumberFormat numFormater = NumberFormat.getNumberInstance();
    		numFormater.setMinimumFractionDigits(2);
    		numAxis.setNumberFormatOverride(numFormater);
    		// 设置提示信息
    		StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator("历史信息{1} 16:00,{2})",
    				new SimpleDateFormat("MM-dd"), numFormater);
    		r.setToolTipGenerator(tipGenerator);
    		// 设置X轴(日期轴)
    		DateAxis axis = (DateAxis) plot.getDomainAxis();
    		axis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
    		ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
    		try {
    			fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);// 生成图片
    		
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		pw.flush();
    		return fileName;// 返回生成图片的文件名
    	}
    
    	/**
    	 * 建立生成图形所需的数据集
    	 * 
    	 * @return 返回数据集
    	 */
    	private XYDataset createDateSet() {
    		TimeSeriesCollection dataset = new TimeSeriesCollection();// 时间曲线数据集合
    		TimeSeries s1 = new TimeSeries("历史曲线", Day.class);// 创建时间数据源,每一个//TimeSeries在图上是一条曲线
    		// s1.add(new Day(day,month,year),value),添加数据点信息
    		s1.add(new Day(1, 2, 2006), 123.51);
    		s1.add(new Day(2, 2, 2006), 122.1);
    		s1.add(new Day(3, 2, 2006), 120.86);
    		s1.add(new Day(4, 2, 2006), 122.50);
    		s1.add(new Day(5, 2, 2006), 123.12);
    		s1.add(new Day(6, 2, 2006), 123.9);
    		s1.add(new Day(7, 2, 2006), 124.47);
    		s1.add(new Day(8, 2, 2006), 124.08);
    		s1.add(new Day(9, 2, 2006), 123.55);
    		s1.add(new Day(10, 2, 2006), 122.53);
    		dataset.addSeries(s1);
    		dataset.setDomainIsPointsInTime(true);
    		return dataset;
    	}
    }
    

    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>/DisplayChart</url-pattern>
    	</servlet-mapping>

    jsp页面

    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>

    <%@ page import="java.io.PrintWriter"%> <%@page import="jfree.LineXYChart;"%> <%  jfree.LineXYChart xyChart = new jfree.LineXYChart();  String fileName = xyChart.getLineXYChart(session, new PrintWriter(out));  String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName; %> <html>  <head>  <title>JFreeChart使用例子</title>  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  </head>  <body>   <img src="<%=graphURL%>" width=500 height=300 border=0>  </body> </html>

    访问jp页面结果
     

     五、图片热点

    plot.setURLGenerator(new StandardPieURLGenerator("PingImage2.jsp","type"));//设定链接

    生成图片后  ChartUtilities.writeImageMap(pw, "map0", info,true);

    页面  <img src="<%=graphURL%>" width=500 height=300 border=0 usemap="#map0" />

    例子代码:

    package jfree;
    import java.awt.Color;
    import java.awt.Font;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartRenderingInfo;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.chart.urls.StandardPieURLGenerator;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.general.PieDataset;
    
    /**
     * 曲线图的绘制
     */
    public class PieChart {
    	/**
    	 * 返回生成图片的文件名
    	 * 
    	 * @param session
    	 * @param pw
    	 * @return 生成图片的文件名
    	 */
    	
    	public String getPieChart(HttpSession session, PrintWriter pw) {
    		
    		 String fileName = null;  
    		PieDataset dataset = getDataSet();
    		JFreeChart chart = ChartFactory.createPieChart3D(" 项目进度分布", // chart title
    				dataset,// data
    				true,// include legend
    				true, false);
    		PiePlot3D plot = (PiePlot3D) chart.getPlot();
    		plot.setURLGenerator(new StandardPieURLGenerator("tohot.jsp",
    		"type"));//设定链接 
    		// 图片中显示百分比:默认方式
            //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
    		// 图片中显示百分比:自定义方式,{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})"));
    		// 设置背景色为白色
    		chart.setBackgroundPaint(Color.white);
    		// 指定图片的透明度(0.0-1.0)
    		plot.setForegroundAlpha(1.0f);
    		// 指定显示的饼图上圆形(false)还椭圆形(true)
    		plot.setCircular(true);
    		// 设置图标题的字体
    		Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
    		TextTitle title = new TextTitle(" 项目状态分布");
    		title.setFont(font);
    		chart.setTitle(title);
    		//设置图中图例的字体
    		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            // 设置图下面图例的字体
    		LegendTitle legend = chart.getLegend();
    		legend.setItemFont(new Font("宋体", Font.BOLD, 14));
    		
    		ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
    		try {
    			fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);// 生成图片
    			ChartUtilities.writeImageMap(pw, "map0", info,true); 
    		
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		pw.flush();
    		return fileName;// 返回生成图片的文件名
    	}
    
    	/**
    	 * 建立生成图形所需的数据集
    	 * 
    	 * @return 返回数据集
    	 */
    	private static PieDataset getDataSet() {
    		DefaultPieDataset dataset = new DefaultPieDataset();
    		dataset.setValue("市场前期", new Double(10));
    		dataset.setValue("立项", new Double(15));
    		dataset.setValue("计划", new Double(10));
    		dataset.setValue("需求与设计", new Double(10));
    		dataset.setValue("执行控制", new Double(35));
    		dataset.setValue("收尾", new Double(10));
    		dataset.setValue("运维", new Double(10));
    		return dataset;
    	}
    }
    

    index.jsp

    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
    
    <%@ page import="java.io.PrintWriter"%>
    <%@page import="jfree.PieChart;"%>
    <%
    	jfree.PieChart pieChart = new jfree.PieChart();
    	String fileName = pieChart.getPieChart(session, new PrintWriter(out));
    	String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
    %>
    <html>
    	<head>
    	<title>JFreeChart热点例子</title>
    	</head>
    	<body>
    		<img src="<%=graphURL%>" width=500 height=300 border=0 usemap="#map0" />
    	</body>
    </html>
    
    

    tohot.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'PingImage.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    
      </head>
      
      <body>
      <% 
      request.setCharacterEncoding("ISO8859-1") ;  
      String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");  
     %>
      选择的类型为: <%=type %>
    
      <br>
      </body>
    </html>
    

    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>/DisplayChart</url-pattern>
    	</servlet-mapping>

    结果:

    点击运行控制结果:

    注意:

    1、页面上的usemap="#map0"比保存时候ChartUtilities.writeImageMap(pw, "map0", info,true);多一个#号

    2、注意乱码问题。 页面都是utf-8编码,而writeImageMap貌似用的ISO_8859_1

      request.setCharacterEncoding("ISO8859-1") ; 
      String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");

    六、乱码问题

    1、一种是中文显示为问号(?),这种情况一般是由于汉字编码转换出错。

    2、一种是中文显示为方框(□),这种情况一般是由于jfreechart中用到的字体不存在。重新设置字体即可

    使用JFreeChart绘制图表的时候,如果使用默认的字体会导致图标中的汉字显示为乱码。解决方法如下:

    JFreeChart是用户使用该库提供的各类图标的统一接口,JFreeChart主要由三个部分构成:title(标题),legend(图释),plot(图表主体)。三个部分设置字体的方法分别如下:

    1.Title

     TextTitle textTitle = freeChart.getTitle();  
      textTitle.setFont(new Font("宋体",Font.BOLD,20));

    2.Legend

    	LegendTitle legend = freeChart.getLegend();
    		if (legend != null)
    
    		{
    			legend.setItemFont(new Font("宋体", Font.BOLD, 20));
    		}

    3.Plot

    对于不同类型的图表对应Plot的不同的实现类,设置字体的方法也不完全相同。

    对于使用CategoryPlot的图表(如柱状图):CategoryPlot plot = (CategoryPlot)freeChart.getPlot();

    CategoryAxis domainAxis = plot.getDomainAxis();//(柱状图的x轴) 
    domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴坐标上的字体 
    domainAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴上的标题的字体 
    ValueAxis valueAxis = plot.getRangeAxis();//(柱状图的y轴) 
    valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的字体 
    valueAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的标题的字体 
    

    对于使用PiePlot的图标(如饼状图)

    PiePlot plot = (PiePlot)freeChart.getPlot();   
    
    plot.setLabelFont(new Font("宋体",Font.BOLD,15)); 
    


     

  • 相关阅读:
    P4281 [AHOI2008]紧急集合 / 聚会
    P2622 关灯问题II
    CF1092F Tree with Maximum Cost
    10.28记
    威尔逊定理及证明
    CF895C Square Subsets
    洛谷 P5556 圣剑护符
    Multi-nim结论及证明
    AT2667 [AGC017D] Game on Tree
    洛谷 P4643 [国家集训队]阿狸和桃子的游戏
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5429436.html
Copyright © 2011-2022 走看看