JFreeChart 笔记

package org.ems.core.utils;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.OutputStream;
import java.text.DecimalFormat;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DialShape;
import org.jfree.chart.plot.MeterInterval;
import org.jfree.chart.plot.MeterPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.plot.dial.DialBackground;
import org.jfree.chart.plot.dial.DialCap;
import org.jfree.chart.plot.dial.DialPlot;
import org.jfree.chart.plot.dial.StandardDialFrame;
import org.jfree.chart.plot.dial.StandardDialRange;
import org.jfree.chart.plot.dial.StandardDialScale;
import org.jfree.chart.plot.dial.DialPointer.Pointer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.Range;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.GradientPaintTransformType;
import org.jfree.ui.StandardGradientPaintTransformer;

/**
 * Util class to generate report chart.
 * 
 * @Class: JFreeChartUtil.java
 * @author: wangxiang
 * @create date: 2012-01-04
 * 
 */
public class JFreeChartUtil {
	private static Font font_12 = new Font("宋体", Font.PLAIN, 12);
	private static Font font_16 = new Font("宋体", Font.PLAIN, 16);

	/**
	 * Generate line shape chart
	 * 
	 * @param os
	 * @param width
	 * @param height
	 * @param title
	 * @param xAxisLabel
	 * @param yAxisLabel
	 * @param dataset
	 * @param legend
	 * @param tooltips
	 * @param urls
	 * @throws Exception
	 */
	public static void generateLineShapeChart(OutputStream os, int width,
			int height, String title, String xAxisLabel, String yAxisLabel,
			XYDataset dataset, boolean legend, boolean tooltips, boolean urls,
			double rangeTick, double startValue) throws Exception {
		JFreeChart chart = ChartFactory.createXYLineChart(title, xAxisLabel,
				yAxisLabel, dataset, PlotOrientation.VERTICAL, legend,
				tooltips, urls);
		chart.setBackgroundPaint(new Color(218, 229, 240));
		XYPlot plot = chart.getXYPlot();  
        plot.setRangeGridlinesVisible(true);  
        plot.setRangeGridlinePaint(Color.red);  
        NumberAxis vn = (NumberAxis) plot.getRangeAxis();  
        vn.setAutoRangeIncludesZero(true);  
        DecimalFormat df = new DecimalFormat("#0");  
        vn.setNumberFormatOverride(df);
        vn.setAutoTickUnitSelection(false);
        vn.setLabelFont(font_12);
        vn.setLabel("分数");
        vn.setTickUnit(new NumberTickUnit(rangeTick));
        vn.setLowerBound(startValue);
        ValueAxis va = plot.getDomainAxis();
        va.setAutoRange(false);
        va.setAutoTickUnitSelection(false);
        va.setLabelFont(font_12);
        va.setLabel("年份");
        plot.setDomainAxis(va);
        plot.setBackgroundPaint(new Color(184, 220, 254));
        plot.setNoDataMessageFont(font_16);
        plot.setNoDataMessage("找不到数据。");
        chart.setTitle("纵向比较图表");
        XYLineAndShapeRenderer lasr = (XYLineAndShapeRenderer) plot.getRenderer();
        lasr.setSeriesFillPaint(0, Color.RED);
        lasr.setSeriesStroke(0, new BasicStroke(3f));
		ChartUtilities.writeChartAsJPEG(os, chart, width, height);
	}

	/**
	 * Generate bar shape chart
	 * 
	 * @param os
	 * @param width
	 * @param height
	 * @param title
	 * @param categoryAxisLabel
	 * @param valueAxisLabel
	 * @param dataset
	 * @param legend
	 * @param tooltips
	 * @param urls
	 * @throws Exception
	 */
	public static void generateBarShapeChart(OutputStream os, int width,
			int height, String title, String categoryAxisLabel,
			String valueAxisLabel, CategoryDataset dataset, boolean legend,
			boolean tooltips, boolean urls, double rangeTick, double startValue) throws Exception {
		JFreeChart chart = ChartFactory.createBarChart3D(title,
				categoryAxisLabel, valueAxisLabel, dataset,
				PlotOrientation.VERTICAL, legend, tooltips, urls);
		chart.setBackgroundPaint(new Color(218, 229, 240));
		CategoryPlot plot = chart.getCategoryPlot();  
        plot.setRangeGridlinesVisible(true);  
        plot.setRangeGridlinePaint(Color.red);  
        NumberAxis vn = (NumberAxis) plot.getRangeAxis();  
        vn.setAutoRangeIncludesZero(true);  
        vn.setLabelFont(font_12);
        vn.setLabel("指数");
        vn.setTickUnit(new NumberTickUnit(rangeTick));
        vn.setLowerBound(startValue);
        CategoryAxis ca = plot.getDomainAxis();
        ca.setLabelFont(font_12);
        ca.setLabel("年份");
        plot.setBackgroundPaint(new Color(184, 220, 254));
        plot.setNoDataMessageFont(font_16);
        plot.setNoDataMessage("找不到数据。");
        chart.setTitle("横向比较图表");
        chart.getLegend().setItemFont(font_12);
		ChartUtilities.writeChartAsJPEG(os, chart, width, height);
	}

	/**
	 * Generate dial plot chart
	 * 
	 * @param os
	 * @param width
	 * @param height
	 * @param title
	 * @param currentValue
	 * @param targetValue
	 * @throws Exception
	 */
	public static void generateDialPlotShapeChart(OutputStream os, int width,
			int height, String title, double currentValue, double targetValue) throws Exception {
		DefaultValueDataset ds1 = new DefaultValueDataset(currentValue);
		DefaultValueDataset ds2 = new DefaultValueDataset(targetValue);
		DialPlot dialplot = new DialPlot();  
		dialplot.setView(0.0, 0.0, 1.0, 0.55); 
		dialplot.setDataset(0, ds1);  
		dialplot.setDataset(1, ds2);  
          
		 StandardDialFrame standarddialframe = new StandardDialFrame();  
         standarddialframe.setBackgroundPaint(Color.red);  
         standarddialframe.setForegroundPaint(Color.green); 
         dialplot.setDialFrame(standarddialframe);  
            
         DialBackground dialbackground = new DialBackground(new Color(184, 220, 254));  
         dialbackground.setGradientPaintTransformer(  
                 new StandardGradientPaintTransformer(  
                         GradientPaintTransformType.VERTICAL));  
         dialplot.setBackground(dialbackground);  
           
         StandardDialScale standarddialscale =    
             new StandardDialScale(0D, 100D, 0D, 180D, 10D, 0);  
         standarddialscale.setFirstTickLabelVisible(false);
         standarddialscale.setMajorTickIncrement(10D);  
         standarddialscale.setTickRadius(0.88D);  
         standarddialscale.setTickLabelOffset(0.14999999999999999D);  
         standarddialscale.setTickLabelFont(new Font("Dialog", 0, 14));  
         dialplot.addScale(0, standarddialscale);  
            
         StandardDialScale standarddialscale1 =    
             new StandardDialScale(0D, 100D, 0D, 180D, 10D, 0);  
         standarddialscale1.setVisible(false);  
         standarddialscale1.setMajorTickIncrement(10D);  
         standarddialscale1.setTickRadius(0.68000000000000005D);  
         standarddialscale1.setTickLabelOffset(0.14999999999999999D);  
         standarddialscale1.setTickLabelFont(new Font("Dialog", 0, 14));  
         dialplot.addScale(1, standarddialscale1);  
            
         StandardDialRange standarddialrange = new StandardDialRange(0D, 60D, new Color(255, 0, 0, 255));
         standarddialrange.setInnerRadius(0.52000000000000002D);
         standarddialrange.setOuterRadius(0.55000000000000004D);
         dialplot.addLayer(standarddialrange);
         
         StandardDialRange standarddialrange1 = new StandardDialRange(60D, 70D, new Color(255, 127, 0, 255));
         standarddialrange1.setInnerRadius(0.52000000000000002D);
         standarddialrange1.setOuterRadius(0.55000000000000004D);
         dialplot.addLayer(standarddialrange1);
         
         StandardDialRange standarddialrange2 = new StandardDialRange(70D, 80D, Color.YELLOW);
         standarddialrange2.setInnerRadius(0.52000000000000002D);
         standarddialrange2.setOuterRadius(0.55000000000000004D);
         dialplot.addLayer(standarddialrange2);
                
         StandardDialRange standarddialrange3 = new StandardDialRange(80D, 90D, new Color(172, 250, 5));
         standarddialrange3.setInnerRadius(0.52000000000000002D);
         standarddialrange3.setOuterRadius(0.55000000000000004D);
         dialplot.addLayer(standarddialrange3);
                        
         StandardDialRange standarddialrange4 = new StandardDialRange(90D, 100D, new Color(0, 255, 0, 255));
         standarddialrange4.setInnerRadius(0.52000000000000002D);
         standarddialrange4.setOuterRadius(0.55000000000000004D);
         dialplot.addLayer(standarddialrange4);
         
         Pointer pointer = new Pointer(0);  
         pointer.setRadius(0.5D);  
         dialplot.addLayer(pointer);  
         dialplot.mapDatasetToScale(1, 1);  
            
         Pointer pointer1 = new Pointer(1);  
         dialplot.addLayer(pointer1);  
         DialCap dialcap = new DialCap();  
         dialcap.setRadius(0.05D);  
         dialplot.setCap(dialcap);
         dialplot.setNoDataMessageFont(font_16);
         dialplot.setNoDataMessage("找不到数据。");
		
		JFreeChart chart = new JFreeChart(title,
				JFreeChart.DEFAULT_TITLE_FONT, dialplot, true);
		chart.setBackgroundPaint(new Color(218, 229, 240));
		chart.setTitle("与上级单位比较图表");
		ChartUtilities.writeChartAsJPEG(os, chart, width, height);
	}
	
	public static void generateAlarmDialPlotShapeChart(OutputStream os, int width,
			int height, String title, double currentValue) throws Exception {
		MeterPlot meterplot = new MeterPlot(new DefaultValueDataset(currentValue));
		meterplot.setRange(new Range(0.0D, 100D));
		meterplot.addInterval(new MeterInterval("巨警",
				new Range(0.0D, 60D), Color.RED, new BasicStroke(2.0F),
				new Color(255, 0, 0, 255)));
		meterplot.addInterval(new MeterInterval("重警",
				new Range(60D, 70D), Color.ORANGE, new BasicStroke(2.0F),
				new Color(255, 127, 0, 255)));
		meterplot.addInterval(new MeterInterval("中警", new Range(70D,
				80D), Color.YELLOW, new BasicStroke(2.0F), new Color(255, 255,
				0, 255)));
		meterplot.addInterval(new MeterInterval("轻警 ", new Range(80D,
				90D), new Color(172, 250, 5), new BasicStroke(2.0F), new Color(172, 250, 5, 255)));
		meterplot.addInterval(new MeterInterval("无警",
				new Range(90D, 100D), Color.GREEN, new BasicStroke(2.0F),
				new Color(0, 255, 0, 255)));
		meterplot.setNeedlePaint(Color.darkGray);
		meterplot.setDialBackgroundPaint(Color.white);
		meterplot.setDialOutlinePaint(Color.gray);
		meterplot.setDialShape(DialShape.CHORD);
		meterplot.setMeterAngle(260);
		meterplot.setTickLabelsVisible(true);
		meterplot.setTickLabelFont(new Font(" Dialog ", 1, 10));
		meterplot.setTickLabelPaint(Color.darkGray);
		meterplot.setTickSize(10D);
		meterplot.setTickPaint(Color.lightGray);
		meterplot.setValuePaint(Color.black);
		meterplot.setValueFont(new Font(" Dialog ", 1, 14));
		meterplot.setNoDataMessageFont(font_16);
		meterplot.setNoDataMessage("找不到数据。");
		JFreeChart chart = new JFreeChart(title,
				JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
		chart.setBackgroundPaint(new Color(218, 229, 240));
		chart.setTitle("预警图表");
		ChartUtilities.writeChartAsJPEG(os, chart, width, height);
	}
}
 

你可能感兴趣的:(jfreechart)