`
tangduDream
  • 浏览: 30089 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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;
	}
}
 

 

分享到:
评论

相关推荐

    Struts2与JFreechart整合

    Struts2是一个强大的MVC(Model-View-Controller)框架,用于构建可维护性和可扩展性极高的Web应用程序,而JFreeChart则是一个强大的图表生成库,能够创建多种类型的高质量图表,如折线图、柱状图、饼图、散点图等。...

    Jfreechart包和工具类

    3. **统计图类型工具类**: 提到的“定义统计图类型的工具类”可能是开发人员为了简化操作或者增强JFreeChart功能而编写的辅助类。这类工具通常包含静态方法,可以快速设置图表类型、数据源转换或自定义样式。比如,...

    jfreechart折线图读取数据库数据的显示(mysql)

    在Java编程环境中,JFreeChart库是一个非常强大的工具,用于创建各种类型的图表,包括折线图、柱状图、饼图等。本教程将详细讲解如何利用JFreeChart结合MySQL数据库来生成动态折线图,展示数据库中的数据。 首先,...

    jfreechart(柱状图,饼状图...)教程.zip

    下面我们将深入探讨JFreeChart的基本使用、柱状图和饼状图的创建方法,以及如何结合源码进行学习。 首先,JFreeChart库提供了丰富的图表类型,包括柱状图(BarChart)、饼状图(PieChart)、线形图(LineChart)、...

    jfreechart 折线图的一个例子

    以上就是一个基本的 JFreeChart 折线图的创建过程。你可以根据需要扩展此示例,比如添加更多的数据系列、自定义轴标签、调整线条宽度、设置网格线、添加图例样式等。JFreeChart 提供了许多方法和属性来定制图表的每...

    使用JFreeChart来创建基于web的图表

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` 对于其他构建工具或IDE,也可以直接下载jar包并将其添加到类路径中。 #### 创建图表 JFreeChart的核心是`ChartFactory`类,...

    JFreeChart+让横轴的标题竖着显示

    在Java编程环境中,JFreeChart库是一个非常强大的工具,用于创建各种类型的图表,如线图、柱状图、饼图等。在处理复杂的数据显示时,可能会遇到横轴标签过于密集,导致阅读困难的问题。本教程将详细介绍如何使用...

    JFreeChart饼状图

    在Java开发领域,JFreeChart库是一个非常受欢迎的图表生成工具,它允许开发者轻松地创建各种图表,包括柱状图、线形图、饼状图等。本篇将重点介绍如何利用JFreeChart来创建3D和平面的饼状图,并提供详细的注释帮助...

    JFreeChart

    1. **依赖管理**:在Java项目中,你需要将JFreeChart的JAR文件添加到类路径或使用Maven或Gradle等构建工具进行依赖管理。例如,在Maven的pom.xml文件中,可以添加如下依赖: ```xml &lt;dependency&gt; &lt;groupId&gt;org....

    JFreeChart画折线实例

    以上就是使用JFreeChart库在Java中绘制折线图的基本步骤。这个过程中,你可以根据需求调整数据集、设置图例样式、更改颜色、添加网格线等,以实现更加复杂的图表定制。对于饼图的绘制,原理类似,只需替换`...

    使用JFreeChart小结(一)

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` 接下来,我们需要创建一个`ChartFactory`来生成图表。例如,创建一个简单的折线图: ```java import org.jfree.chart....

    jfreechart的一个web例子

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` 接着,我们需要创建一个 Servlet 来生成图表。这个过程主要包括以下几个步骤: 1. **创建 Chart**: 使用 JFreeChart 类的静态...

    JfreeChart编码

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` ### 3. 创建基本图表 创建图表的第一步是定义`ChartFactory`,它提供了许多静态工厂方法用于创建不同类型的图表。例如,创建...

    JFreeChart的付费文档

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` **2. 创建图表** 创建图表是使用JFreeChart的基本步骤。首先,你需要选择一个图表类型并创建对应的图表工厂,如`ChartFactory....

    jfreechart

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` 对于非Maven项目,可以直接下载JFreeChart的JAR文件并将其添加到项目的类路径中。 三、JFreeChart的基本用法 创建图表通常...

    JFreeChart棒形图

    以上步骤就完成了JFreeChart棒形图的基本创建。但JFreeChart的强大之处在于其高度可定制性,你可以调整几乎所有的视觉元素,如添加图例、调整轴刻度、设置图表区域、添加提示信息等。此外,JFreeChart还支持动态更新...

    Jfree完整的jar包

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.0.13&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; ``` 对于Gradle,在`build.gradle`中添加: ```groovy dependencies { implementation 'org.jfree:jcommon:...

    jfreechart小项目

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` **2. 创建图表** JFreeChart 提供了多种图表创建方法,例如,创建一个简单的柱状图可以这样做: ```java import org.jfree....

    JFreechart教程与实例

    JFreechart组件可以生成各种各样的图形报表,如常用的柱形图、区域图、饼形图、折线图、时序图、甘特图等;而对于同一种类型的图表,JFreechart组件还提供了不同的表现方式。 在使用JFreechart组件之前,需要了解...

    Jfreechart简明教程

    &lt;artifactId&gt;jfreechart&lt;/artifactId&gt; &lt;version&gt;1.5.3&lt;/version&gt; &lt;/dependency&gt; ``` ### 2. 创建基本图表 JFreeChart 提供了多种图表类型的工厂方法,例如 `JFreeChart.createLineChart()`,`JFreeChart....

Global site tag (gtag.js) - Google Analytics