jfreeChart 工具类<基本图>

 

package org.gbicc.sys.util;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.RenderingHints;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

import javax.servlet.ServletOutputStream;

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.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.util.Rotation;

/**
 * jfreeChart工具类
 * 
 * @project SClientSpring
 * @author tangdu
 * @time 2012-3-28
 * @see
 * 	tangdu0228yes@163.com
 */
public class JfreeChartUtil {

	/*
	 * java.awt 字体
	 */
	private static java.awt.Font heiFont = new java.awt.Font("黑体",
			java.awt.Font.PLAIN, 15);// 黑体
	private static java.awt.Font heiFontX = new java.awt.Font("黑体",
			java.awt.Font.PLAIN, 12);// 黑体
	private static java.awt.Font songFont = new java.awt.Font(
			"STSongStd-Light", java.awt.Font.PLAIN, 12);// 宋体
	
	//拆线图折点形式
	private static float dashes[] = { 8.0f };     // 定义虚线数组
	private static  BasicStroke brokenLine = new BasicStroke(1.6f,// 线条粗细
		      BasicStroke.JOIN_ROUND,     // 端点风格
		      BasicStroke.JOIN_ROUND,     // 折点风格
		      8.f,         // 折点处理办法
		      dashes,      // 虚线数组
		      0.0f);       // 虚线偏移量
	
	//图表默认宽度
	private static int WIDTH=500;
	private static int HEIGHT=300;

	/**
	 * 数据对象--(柱形,折线数据 格式)
	 * 
	 * @param data
	 *            data 二维数据格式
	 * @param rowKeys
	 *            行
	 * @param columnKeys
	 *            列
	 * @return
	 * @throws Exception
	 */
	public static DefaultCategoryDataset getBarLineData(
			List<ArrayList<Double>> data, List<String> rowKeys,
			List<String> columnKeys) throws Exception {
		DefaultCategoryDataset defaultpiedataset = null;
		if (data != null && rowKeys != null && columnKeys != null) {
			if (data.size() == rowKeys.size()) {
				defaultpiedataset = new DefaultCategoryDataset();
				for (int i = 0; i < rowKeys.size(); i++) {
					List<Double> list = data.get(i);
					for (int j = 0; j < columnKeys.size(); j++) {
						defaultpiedataset.addValue(list.get(j), rowKeys.get(i),
								columnKeys.get(j));
					}
				}
			}
		}
		return defaultpiedataset;
	}

	/**
	 * 数据对象--(饼图数据 格式)
	 * 
	 * @param map
	 *            数据格式
	 * @return
	 * @throws Exception
	 */
	public static DefaultPieDataset getPieData(Map<String, Double> map)
			throws Exception {
		DefaultPieDataset defaultpiedataset = null;
		if (map != null) {
			defaultpiedataset = new DefaultPieDataset();
			for (Entry<String, Double> entry : map.entrySet()) {
				defaultpiedataset.setValue(entry.getKey(), entry.getValue());
			}
		}
		return defaultpiedataset;
	}

	/**
	 * 3d 或是2d 柱形图
	 * @param title 标题 
	 * @param titlex x轴
	 * @param titley y轴
	 * @param defaultpiedataset 数据集
	 * @param is3D 是否3d
	 * @param colorBar 颜色集
	 * @param out 输出流
	 * @throws Exception
	 */
	public static void createBarChart(String title, String titlex,
			String titley, DefaultCategoryDataset defaultpiedataset,
			boolean  is3D,String colorBar[], ServletOutputStream out) throws Exception {

		JFreeChart chart = null;
		CategoryPlot categoryplot = null;
		BarRenderer customBarRenderer = null;

		if (is3D) {
			chart = ChartFactory.createBarChart3D(title, titlex, titley,
					defaultpiedataset, PlotOrientation.VERTICAL, true, true,
					false);
			categoryplot = (CategoryPlot) chart.getPlot();

			// 设置柱子颜色
			customBarRenderer = (BarRenderer3D) categoryplot.getRenderer();
		} else {
			chart = ChartFactory.createBarChart(title, titlex, titley,
					defaultpiedataset, PlotOrientation.VERTICAL, true, true,
					false);
			categoryplot = (CategoryPlot) chart.getPlot();

			// 设置柱子颜色
			customBarRenderer = (BarRenderer) categoryplot.getRenderer();
		}
		// 设置柱子颜色
		if (colorBar != null) {
			for (int i = 0; i < colorBar.length; i++) {
				customBarRenderer.setSeriesPaint(i,
						Color.decode(colorBar[i]));
			}
		}

		// 设置标题字体样式
		TextTitle textTitle = chart.getTitle();
		textTitle.setFont(heiFont);
		// 设置柱状体颜色
		categoryplot.getRenderer().setSeriesPaint(0, new Color(228, 109, 10));
		NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
		CategoryAxis domainAxis = categoryplot.getDomainAxis();

		// y轴 -数据轴网格是否可见
		categoryplot.setRangeGridlinesVisible(true);
		// x轴 -数据轴网格是否可见
		categoryplot.setDomainGridlinesVisible(false);
		// 没有 数据
		categoryplot.setNoDataMessage("没有数据可以显示");
		categoryplot.setNoDataMessageFont(heiFont);
		categoryplot.setRangeGridlinePaint(Color.GRAY);// y轴虚线色彩
		categoryplot.setDomainGridlinePaint(Color.WHITE);// x轴虚线色彩
		categoryplot.setBackgroundPaint(Color.WHITE);// 面板颜色

		// 设置标题倾斜度-x轴
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
		// 设置X轴坐标上的字体样式
		domainAxis.setTickLabelFont(heiFontX);
		// 设置X轴的标题字体样式
		domainAxis.setLabelFont(heiFont);
		// 设置Y轴坐标上的字体样式
		numberaxis.setTickLabelFont(heiFontX);
		// 设置Y轴的标题字体样式
		numberaxis.setLabelFont(heiFont);
		// 设置图片最底部字体样式
		if (chart.getLegend() != null) {
			chart.getLegend().setItemFont(heiFontX);
		}

		// 设置颜色
		/*
		 * BarRenderer renderer = (BarRenderer) categoryplot.getRenderer();
		 * renderer.setDrawBarOutline(false);
		 */

		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
					"D:\\barChart.jpg"), chart, WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart, WIDTH, HEIGHT);
			out.close();
		}
	}
	/**
	 * 3d 或是2d 柱形堆积图
	 * @param title 标题 
	 * @param titlex x轴
	 * @param titley y轴
	 * @param defaultpiedataset 数据集
	 * @param is3D 是否3d
	 * @param colorBar 颜色集
	 * @param out 输出流
	 * @throws Exception
	 */
	public static void createStackBarChart(String title, String titlex,
			String titley, DefaultCategoryDataset defaultpiedataset,
			boolean  is3D,String colorBar[], ServletOutputStream out) throws Exception {

		JFreeChart chart = null;
		CategoryPlot categoryplot = null;
		BarRenderer customBarRenderer = null;

		if (is3D) {
			chart = ChartFactory.createStackedBarChart3D(title, titlex, titley,
					defaultpiedataset, PlotOrientation.VERTICAL, true, true,
					false);
			categoryplot = (CategoryPlot) chart.getPlot();

			// 设置柱子颜色
			customBarRenderer = (StackedBarRenderer3D) categoryplot.getRenderer();
		} else {
			chart = ChartFactory.createStackedBarChart(title, titlex, titley,
					defaultpiedataset, PlotOrientation.VERTICAL, true, true,
					false);
			categoryplot = (CategoryPlot) chart.getPlot();

			// 设置柱子颜色
			customBarRenderer = (StackedBarRenderer) categoryplot.getRenderer();
		}
		// 设置柱子颜色
		if (colorBar != null) {
			for (int i = 0; i < colorBar.length; i++) {
				customBarRenderer.setSeriesPaint(i,
						Color.decode(colorBar[i]));
			}
		}

		// 设置标题字体样式
		TextTitle textTitle = chart.getTitle();
		textTitle.setFont(heiFont);
		// 设置柱状体颜色
		categoryplot.getRenderer().setSeriesPaint(0, new Color(228, 109, 10));
		NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
		CategoryAxis domainAxis = categoryplot.getDomainAxis();

		// y轴 -数据轴网格是否可见
		categoryplot.setRangeGridlinesVisible(true);
		// x轴 -数据轴网格是否可见
		categoryplot.setDomainGridlinesVisible(false);
		// 没有 数据
		categoryplot.setNoDataMessage("没有数据可以显示");
		categoryplot.setNoDataMessageFont(heiFont);
		categoryplot.setRangeGridlinePaint(Color.GRAY);// y轴虚线色彩
		categoryplot.setDomainGridlinePaint(Color.WHITE);// x轴虚线色彩
		categoryplot.setBackgroundPaint(Color.WHITE);// 面板颜色

		// 设置标题倾斜度-x轴
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
		// 设置X轴坐标上的字体样式
		domainAxis.setTickLabelFont(heiFontX);
		// 设置X轴的标题字体样式
		domainAxis.setLabelFont(heiFont);
		// 设置Y轴坐标上的字体样式
		numberaxis.setTickLabelFont(heiFontX);
		// 设置Y轴的标题字体样式
		numberaxis.setLabelFont(heiFont);
		// 设置图片最底部字体样式
		if (chart.getLegend() != null) {
			chart.getLegend().setItemFont(heiFontX);
		}

		// 设置颜色
		/*
		 * BarRenderer renderer = (BarRenderer) categoryplot.getRenderer();
		 * renderer.setDrawBarOutline(false);
		 */

		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
					"D:\\stackbarChart.jpg"), chart, WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart, WIDTH, HEIGHT);
			out.close();
		}
	}


	/**
	 * 折线图
	 * 
	 * @param title
	 *            标题
	 * @param titlex
	 *            x标题
	 * @param titley
	 *            y标题
	 * @param defaultpiedataset
	 *            数据
	 * @param colorBar
	 * 			  数据集
	 * @param out
	 *            servlet 输出流
	 * @throws Exception
	 */
	public static void createLineChart(String title, String titlex,
			String titley, DefaultCategoryDataset defaultpiedataset,String colorLine[],
			ServletOutputStream out) throws Exception {

		JFreeChart chart = ChartFactory.createLineChart(title, titlex, titley,
				defaultpiedataset, PlotOrientation.VERTICAL, true, true, false);
		// 设置标题字体样式
		TextTitle textTitle = chart.getTitle();
		textTitle.setFont(heiFont);
		// 设置柱状体颜色
		CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
		categoryplot.getRenderer().setSeriesPaint(0, new Color(85, 139, 185));
		categoryplot.setDomainGridlinesVisible(true);
		// y轴 -数据轴网格是否可见
		categoryplot.setRangeGridlinesVisible(true);
		// x轴 -数据轴网格是否可见
		categoryplot.setDomainGridlinesVisible(false);
		// 没有 数据
		categoryplot.setNoDataMessage("没有数据可以显示");
		categoryplot.setRangeGridlinePaint(Color.GRAY);// y轴虚线色彩
		categoryplot.setDomainGridlinePaint(Color.WHITE);// x轴虚线色彩

		categoryplot.setBackgroundPaint(Color.WHITE);// 面板颜色

		// 设置轴和面板之间的距离
		categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));

		NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
		CategoryAxis domainAxis = categoryplot.getDomainAxis();
		//
		domainAxis.setVisible(false);
		
		
		// x轴是否斜体角度
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
		// 设置X轴坐标上的字体样式
		domainAxis.setTickLabelFont(heiFontX);
		// 设置X轴的标题字体样式
		domainAxis.setLabelFont(heiFont);
		// 设置Y轴坐标上的字体样式
		numberaxis.setTickLabelFont(heiFontX);
		// 设置Y轴的标题字体样式
		numberaxis.setLabelFont(heiFont);
		
		
		// 设置图片最底部字体样式
		if (chart.getLegend() != null) {
			chart.getLegend().setItemFont(heiFontX);
		}
		numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		numberaxis.setAutoRangeIncludesZero(true);
		numberaxis.setUpperMargin(0.20);
		numberaxis.setLabelAngle(Math.PI / 2.0);

		LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
				.getRenderer();
		//设置折线颜色
		if (colorLine != null) {
			for (int i = 0; i < colorLine.length; i++) {
				lineandshaperenderer.setSeriesPaint(i,
						Color.decode(colorLine[i]));
				//lineandshaperenderer.setSeriesStroke(i, brokenLine);
			}
		}
		//lineandshaperenderer.setSeriesVisibleInLegend(false);//不显示x轴标题栏
		lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
		lineandshaperenderer.setBaseLinesVisible(true); // series
														// 点(即数据点)间有连线可见
		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
					"D:\\lineChart.jpg"), chart, WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart,  WIDTH, HEIGHT);
			out.close();
		}
	}

	/**
	 * 饼图2d,或 是 3D
	 * @param dataset 数据集
	 * @param chartTitle 标题
	 * @param is3D 是否是3d
	 * @param isLeng 是否显示标题栏 x轴
	 * @param out 输出流
	 * @throws Exception
	 */
	public static void create3DPieChart(DefaultPieDataset dataset,
			String chartTitle, boolean is3D,boolean isLeng,String colorPie[],
			ServletOutputStream out) throws Exception {
		// 利用工厂类来创建3D饼图
		JFreeChart chart = null;
		PiePlot plot = null;

		if (is3D) {
			chart = ChartFactory.createPieChart3D(chartTitle, dataset, false,
					true, false);
			plot = (PiePlot3D) chart.getPlot();
		} else {
			chart = ChartFactory.createPieChart(chartTitle, dataset, false,
					true, false);
			plot = (PiePlot) chart.getPlot();
		}
		// 使下说明标签字体清晰,去锯齿类似于
		chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
				RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
		chart.setTextAntiAlias(false);
		// 图片背景色
		chart.setBackgroundPaint(Color.white);
		chart.setBorderPaint(Color.WHITE);
		chart.setBorderVisible(false);
		chart.setTextAntiAlias(false);
		
		// 设置图标题的字体重新设置title(否组有些版本Title会出现乱码)
		chart.getTitle().setFont(songFont);

		// 设置图例(Legend)上的文字(//底部的字体)
		if(!isLeng){chart.getLegend().setItemFont(songFont);}

		// 指定饼图轮廓线的颜色
		plot.setBaseSectionOutlinePaint(Color.WHITE);
		plot.setBaseSectionPaint(Color.WHITE);

		// 设置无数据时的信息
		plot.setNoDataMessage("没有可用数据");
		plot.setNoDataMessageFont(heiFont);
		plot.setOutlineVisible(false);

		// 设置无数据时的信息显示颜色
		plot.setNoDataMessagePaint(Color.red);

		// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		/*plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}={1}({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));*/
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		plot.setLabelFont(songFont);
		
		//设置颜色
		if(colorPie!=null){
			for(int i=0;i<colorPie.length;i++){
				plot.setSectionPaint(i,Color.decode(colorPie[i]));
			}
		}
		
		// 指定图片的透明度(0.0-1.0)
		plot.setForegroundAlpha(0.65f);
		plot.setBackgroundPaint(Color.WHITE);
		
		// 设置第一个 饼块section 的开始位置,默认是12点钟方向
		plot.setStartAngle(90);
		plot.setCircular(true);//圆形
		plot.setLabelGap(0.01D);//间距
		plot.setToolTipGenerator(new StandardPieToolTipGenerator());
		
		
		//设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制
		plot.setDirection(Rotation.ANTICLOCKWISE);
		
		//设置突出显示的数据块
		//plot.setExplodePercent("One", 0.1D);
		
		
		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
					"D:\\pie3DChart.jpg"), chart,  WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart,  WIDTH, HEIGHT);
			out.close();
		}
	}

	/**
	 * 创建复合图 bar_line
	 * @param chartTitle
	 * @param Xname x轴title
	 * @param Yname y轴tilte
	 * @param dataset1 bar数据集
	 * @param dataset2 line数据集
	 * @param is3D   是否是3D
	 * @param colorBar bar颜色
	 * @param colorLine line颜色
	 * @param out 输出流
	 * @throws Exception
	 */
	public static void createAndChart(String chartTitle, String Xname,
			String Yname, CategoryDataset dataset1, CategoryDataset dataset2,
			boolean is3D,String colorBar[],String colorLine[], ServletOutputStream out)
			throws Exception {
		
		JFreeChart chart ;
		BarRenderer renderer;
		CategoryPlot plot;
		if(is3D){
			chart=ChartFactory.createBarChart3D(chartTitle, Xname, Yname,
					dataset1, PlotOrientation.VERTICAL, true, true, false);
			plot = chart.getCategoryPlot();// 获得图表区域对象
			renderer=new BarRenderer3D();
		}else{
			chart=ChartFactory.createBarChart(chartTitle, Xname, Yname,
					dataset1, PlotOrientation.VERTICAL, true, true, false);
			plot = chart.getCategoryPlot();// 获得图表区域对象
			renderer=new BarRenderer();
		}
		renderer.setShadowVisible(false);//是否有阴影
		
		
		// 设置标题字体样式
		TextTitle textTitle = chart.getTitle();
		textTitle.setFont(heiFont);
		chart.getLegend().setItemFont(songFont);
		
		// y軸設置
		ValueAxis rangeAxis = plot.getRangeAxis();
		rangeAxis.setLabelFont(songFont);
		rangeAxis.setTickLabelFont(songFont);
		//rangeAxis.setUpperBound(10);// 設置Y軸數值 最大 sumCountErrorNum
		//rangeAxis.setLowerMargin(0.05); // 設置最低的一個Item與圖片底端的距離
		//rangeAxis.setUpperMargin(0.05);
		plot.setRangeAxis(rangeAxis);
	
		
		// 顯示柱體的數值
		//renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		//renderer.setItemLabelsVisible(true);
	    // renderer.setMinimumBarLength(0.5);//設置柱體高度
		plot.setRenderer(renderer);
		// 设置柱子颜色
		if (colorBar != null) {
			for (int i = 0; i < colorBar.length; i++) {
				renderer.setSeriesPaint(i,
						Color.decode(colorBar[i]));
			}
		}
		
		//x轴
		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setLabelFont(songFont);
		domainAxis.setTickLabelFont(songFont);//
		domainAxis.setCategoryMargin(0.1);// 橫軸標簽之間的距離10%
		domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示
		domainAxis.setUpperMargin(0.05);
		domainAxis.setLowerMargin(0.05);
		//domainAxis.setCategoryLabelPositions(CategoryLabelPositions
		//		.createUpRotationLabelPositions(Math.PI / 7.0));
		//chart.setAntiAlias(true);
		chart.setBackgroundPaint(Color.WHITE);
		chart.setBorderPaint(Color.BLACK);
		//chart.setBorderVisible(true);

		// 创建折线图
		plot.setDataset(1, dataset2);
		plot.mapDatasetToRangeAxis(1, 1);
		NumberAxis numberaxis = new NumberAxis();// 折線Y軸名稱(右邊)
		numberaxis.setLabelFont(songFont);
		plot.setRangeAxis(1, numberaxis);
		
		// 定義折線顯示樣式
		LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
		lineandshaperenderer
				.setToolTipGenerator(new StandardCategoryToolTipGenerator());
		
		// 设置柱子颜色
		if (colorLine != null) {
			for (int i = 0; i < colorLine.length; i++) {
				lineandshaperenderer.setSeriesPaint(i,
						Color.decode(colorLine[i]));
			}
		}
		// 设置数据点显示
		lineandshaperenderer
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		//lineandshaperenderer.setBaseItemLabelsVisible(true);
		plot.setRenderer(1, lineandshaperenderer);
		plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
		
		
		/*LegendTitle legendtitle = new LegendTitle(plot.getRenderer(0));
		legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
		legendtitle.setBorder(new BlockBorder());
		LegendTitle legendtitle1 = new LegendTitle(plot.getRenderer(1));
		legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
		legendtitle1.setBorder(new BlockBorder());
		BlockContainer blockcontainer = new BlockContainer(
				new BorderArrangement());
		blockcontainer.add(legendtitle, RectangleEdge.LEFT);
		blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);
		blockcontainer.add(new EmptyBlock(2000D, 0.0D));
		CompositeTitle compositetitle = new CompositeTitle(blockcontainer);
		compositetitle.setPosition(RectangleEdge.BOTTOM);
		chart.addSubtitle(compositetitle);*/
		
		//设置plot
		plot.setNoDataMessage("没有数据可以显示");
		plot.setNoDataMessageFont(heiFont);
		plot.setRangeGridlinePaint(Color.GRAY);// y轴虚线色彩
		plot.setDomainGridlinePaint(Color.WHITE);// x轴虚线色彩
		plot.setBackgroundPaint(Color.WHITE);// 面板颜色
		
		
		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
				"D:\\fuheChar2t.jpg"), chart,  WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart,  WIDTH, HEIGHT);
			out.close();
		}
	}
	
	/**
	 * 创建叠加图 bar_stacked_line
	 * @param chartTitle
	 * @param Xname x轴title
	 * @param Yname y轴tilte
	 * @param dataset1 bar数据集
	 * @param dataset2 line数据集
	 * @param is3D   是否是3D
	 * @param colorBar bar颜色
	 * @param colorLine line颜色
	 * @param out 输出流
	 * @throws Exception
	 */
	public static void createAndStackChart(String chartTitle, String Xname,
			String Yname, CategoryDataset dataset1, CategoryDataset dataset2,
			boolean is3D,String colorBar[],String colorLine[], ServletOutputStream out)
			throws Exception {
		
		JFreeChart chart ;
		BarRenderer renderer;
		CategoryPlot plot;
		if(is3D){
			chart=ChartFactory.createStackedBarChart3D(chartTitle, Xname, Yname,
					dataset1, PlotOrientation.VERTICAL, true, true, false);
			plot = chart.getCategoryPlot();// 获得图表区域对象
			renderer=new StackedBarRenderer3D();
		}else{
			chart=ChartFactory.createStackedBarChart(chartTitle, Xname, Yname,
					dataset1, PlotOrientation.VERTICAL, true, true, false);
			plot = chart.getCategoryPlot();// 获得图表区域对象
			renderer=new StackedBarRenderer();
		}
		renderer.setShadowVisible(false);//是否有阴影
		
		
		// 设置标题字体样式
		TextTitle textTitle = chart.getTitle();
		textTitle.setFont(heiFont);
		chart.getLegend().setItemFont(songFont);
		
		// y軸設置
		ValueAxis rangeAxis = plot.getRangeAxis();
		//设置折点格式
		//rangeAxis.setAxisLineStroke(brokenLine);
		rangeAxis.setLabelFont(songFont);
		rangeAxis.setTickLabelFont(songFont);
		//rangeAxis.setUpperBound(10);// 設置Y軸數值 最大 sumCountErrorNum
		//rangeAxis.setLowerMargin(0.05); // 設置最低的一個Item與圖片底端的距離
		//rangeAxis.setUpperMargin(0.05);
		plot.setRangeAxis(rangeAxis);
	
		
		// 顯示柱體的數值
		//renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		//renderer.setItemLabelsVisible(true);
	    // renderer.setMinimumBarLength(0.5);//設置柱體高度
		plot.setRenderer(renderer);
		// 设置柱子颜色
		if (dataset1 != null) {
			for (int i = 0; i < colorBar.length; i++) {
				//设置渐变
				//GradientPaint gp = new GradientPaint();
				//renderer.setSeriesPaint(i, gp);
				renderer.setSeriesPaint(i,
						Color.decode(colorBar[i]));
			}
		}
		
		//x轴
		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setLabelFont(songFont);
		domainAxis.setTickLabelFont(songFont);//
		domainAxis.setCategoryMargin(0.1);// 橫軸標簽之間的距離10%
		domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示
		domainAxis.setUpperMargin(0.05);
		domainAxis.setLowerMargin(0.05);
		chart.setBackgroundPaint(Color.WHITE);
		chart.setBorderPaint(Color.BLACK);

		// 创建折线图
		plot.setDataset(1, dataset2);
		plot.mapDatasetToRangeAxis(1, 1);
		NumberAxis numberaxis = new NumberAxis();// 折線Y軸名稱(右邊)
		numberaxis.setLabelFont(songFont);
		plot.setRangeAxis(1, numberaxis);
		
		// 定義折線顯示樣式
		LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
		lineandshaperenderer
				.setToolTipGenerator(new StandardCategoryToolTipGenerator());
		// 设置柱子颜色
		if (dataset2 != null) {
			for (int i = 0; i < colorLine.length; i++) {
				lineandshaperenderer.setSeriesPaint(i,
						Color.decode(colorLine[i]));
				//lineandshaperenderer.setSeriesStroke(i, brokenLine);
			}
		}
		// 设置数据点显示
		lineandshaperenderer
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		plot.setRenderer(1, lineandshaperenderer);
		plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
		
		//设置plot
		plot.setNoDataMessage("没有数据可以显示");
		plot.setNoDataMessageFont(heiFont);
		plot.setRangeGridlinePaint(Color.GRAY);// y轴虚线色彩
		plot.setDomainGridlinePaint(Color.WHITE);// x轴虚线色彩
		plot.setBackgroundPaint(Color.WHITE);// 面板颜色
		
		
		// 输出
		if (out == null) {
			ChartUtilities.writeChartAsPNG(new FileOutputStream(
				"D:\\stackedChart.jpg"), chart,  WIDTH, HEIGHT);
		} else {
			ChartUtilities.writeChartAsPNG(out, chart, WIDTH, HEIGHT);
			out.close();
		}
	}
	

	/**
	 * 随机生成16制颜色
	 * 
	 * @return
	 */
	public static String getRandColorCode() {
		String r, g, b;
		Random random = new Random();
		r = Integer.toHexString(random.nextInt(256)).toUpperCase();
		g = Integer.toHexString(random.nextInt(256)).toUpperCase();
		b = Integer.toHexString(random.nextInt(256)).toUpperCase();

		r = r.length() == 1 ? "0" + r : r;
		g = g.length() == 1 ? "0" + g : g;
		b = b.length() == 1 ? "0" + b : b;

		return "#" + r + g + b;
	}
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值