package com.talkweb.jobseeker.worker.action; import java.awt.Color; import java.awt.Font; import java.awt.RenderingHints; 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.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.StandardCategoryItemLabelGenerator; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.servlet.ChartDeleter; import org.jfree.chart.servlet.ServletUtilities; import org.jfree.data.category.CategoryDataset; import org.jfree.data.general.DatasetUtilities; import org.jfree.data.general.DefaultPieDataset; public class ChartUtil { //饼图 // 产生时间序列图,返回图片名称 public static String generatePieChart(DefaultPieDataset dataset, String title, int width, int height, HttpSession session, PrintWriter pw) { String filename = null; try { if (session != null) { ChartDeleter deleter = (ChartDeleter) session .getAttribute("JFreeChart_Deleter"); session.removeAttribute("JFreeChart_Deleter"); session.setAttribute("JFreeChart_Deleter", deleter); } JFreeChart chart = ChartFactory.createPieChart(title, dataset, // data true, // include legend true, false); // 图片背景色 chart.setBackgroundPaint(Color.white); PiePlot plot = (PiePlot) chart.getPlot(); plot.setNoDataMessage("暂时无相关的数据。"); // 设置无数据时的信息显示颜色 plot.setNoDataMessagePaint(Color.red); plot.setLabelGenerator(new StandardPieSectionLabelGenerator( "{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%"))); // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例 plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator( "{0}={1}({2})")); // 指定图片的透明度(0.0-1.0) //plot.setForegroundAlpha(0.65f); // 指定显示的饼图上圆形(false)还椭圆形(true) plot.setCircular(true, false); // 设置第一个 饼块section 的开始位置,默认是12点钟方向 plot.setStartAngle(90); // 图表图像写入到临时目录 ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info, true); pw.flush(); } catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "picture_error.png"; } return filename; } /** * 单柱 * @param dataset * @param xName * @param yName * @param title * @param width * @param height * @param session * @param pw * @return */ public static String generatePoleChart(CategoryDataset dataset, String xName, String yName,String title, int width, int height, HttpSession session, PrintWriter pw) { String filename=""; try{ JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题 xName, // 目录轴的显示标签 yName, // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向:水平、垂直 true, // 是否显示图例(对于简单的柱状图必须是false) false, // 是否生成工具 false // 是否生成URL链接 ); Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12); /* * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭, * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看 */ // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); // chart.setTextAntiAlias(false); chart.setBackgroundPaint(Color.white); // create plot CategoryPlot plot = chart.getCategoryPlot(); // 设置横虚线可见 plot.setRangeGridlinesVisible(true); // 虚线色彩 plot.setRangeGridlinePaint(Color.gray); plot.setNoDataMessage("暂时无相关的数据。"); // 设置无数据时的信息显示颜色 plot.setNoDataMessagePaint(Color.red); // 数据轴精度 NumberAxis vn = (NumberAxis) plot.getRangeAxis(); // vn.setAutoRangeIncludesZero(true); DecimalFormat df = new DecimalFormat("#0"); vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式 // x轴设置 CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setLabelFont(labelFont);// 轴标题 domainAxis.setTickLabelFont(labelFont);// 轴数值 // Lable(Math.PI/3.0)度倾斜 // domainAxis.setCategoryLabelPositions(CategoryLabelPositions // .createUpRotationLabelPositions(Math.PI / 3.0)); domainAxis.setMaximumCategoryLabelWidthRatio(1f);// 横轴上的 Lable 是否完整显示 // 设置距离图片左端距离 domainAxis.setLowerMargin(0.1); // 设置距离图片右端距离 domainAxis.setUpperMargin(0.1); // 设置 columnKey 是否间隔显示 // domainAxis.setSkipCategoryLabelsToFit(true); plot.setDomainAxis(domainAxis); // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确) plot.setBackgroundPaint(new Color(255, 255, 204)); // y轴设置 ValueAxis rangeAxis = plot.getRangeAxis(); rangeAxis.setLabelFont(labelFont); rangeAxis.setTickLabelFont(labelFont); // 设置最高的一个 Item 与图片顶端的距离 rangeAxis.setUpperMargin(0.15); // 设置最低的一个 Item 与图片底端的距离 rangeAxis.setLowerMargin(0.15); plot.setRangeAxis(rangeAxis); BarRenderer renderer = new BarRenderer(); // 设置柱子宽度 renderer.setMaximumBarWidth(0.05); // 设置柱子高度 renderer.setMinimumBarLength(0.2); // 设置柱子边框颜色 renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框可见 renderer.setDrawBarOutline(true); // // 设置柱的颜色 renderer.setSeriesPaint(0, new Color(204, 255, 255)); renderer.setSeriesPaint(1, new Color(153, 204, 255)); renderer.setSeriesPaint(2, new Color(51, 204, 204)); // 设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.0); // 显示每个柱的数值,并修改该数值的字体属性 // renderer.setIncludeBaseInRange(true); renderer .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); plot.setRenderer(renderer); // 设置柱的透明度 plot.setForegroundAlpha(1.0f); // 图表图像写入到临时目录 ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info, true); pw.flush(); }catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "picture_error.png"; } return filename; } /** * 单柱 水平 */ public static String generatePoleChartForHor(CategoryDataset dataset, String xName, String yName,String title, int width, int height, HttpSession session, PrintWriter pw) { String filename=""; try{ JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题 xName, // 目录轴的显示标签 yName, // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.HORIZONTAL, // 图表方向:水平、垂直 true, // 是否显示图例(对于简单的柱状图必须是false) true, // 是否生成工具 false // 是否生成URL链接 ); Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12); /* * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭, * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看 */ chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); // chart.setTextAntiAlias(false); chart.setBackgroundPaint(Color.white); // create plot CategoryPlot plot = chart.getCategoryPlot(); // 设置横虚线可见 plot.setRangeGridlinesVisible(true); // 虚线色彩 plot.setRangeGridlinePaint(Color.gray); plot.setNoDataMessage("暂时无相关的数据。"); // 设置无数据时的信息显示颜色 plot.setNoDataMessagePaint(Color.red); // 数据轴精度 NumberAxis vn = (NumberAxis) plot.getRangeAxis(); // vn.setAutoRangeIncludesZero(true); DecimalFormat df = new DecimalFormat("#0"); vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式 // x轴设置 CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setLabelFont(labelFont);// 轴标题 domainAxis.setTickLabelFont(labelFont);// 轴数值 // Lable(Math.PI/3.0)度倾斜 // domainAxis.setCategoryLabelPositions(CategoryLabelPositions // .createUpRotationLabelPositions(Math.PI / 3.0)); domainAxis.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示 // 设置距离图片左端距离 domainAxis.setLowerMargin(0.1); // 设置距离图片右端距离 domainAxis.setUpperMargin(0.1); // 设置 columnKey 是否间隔显示 // domainAxis.setSkipCategoryLabelsToFit(true); plot.setDomainAxis(domainAxis); // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确) plot.setBackgroundPaint(new Color(255, 255, 204)); // y轴设置 ValueAxis rangeAxis = plot.getRangeAxis(); rangeAxis.setLabelFont(labelFont); rangeAxis.setTickLabelFont(labelFont); // 设置最高的一个 Item 与图片顶端的距离 rangeAxis.setUpperMargin(0.15); // 设置最低的一个 Item 与图片底端的距离 rangeAxis.setLowerMargin(0.15); rangeAxis.setLabelAngle(1.6);//标签字体的方向 plot.setRangeAxis(rangeAxis); BarRenderer renderer = new BarRenderer(); // 设置柱子宽度 renderer.setMaximumBarWidth(0.05); // 设置柱子高度 renderer.setMinimumBarLength(0.2); // 设置柱子边框颜色 renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框可见 renderer.setDrawBarOutline(true); // // 设置柱的颜色 renderer.setSeriesPaint(0, new Color(204, 255, 255)); renderer.setSeriesPaint(1, new Color(153, 204, 255)); renderer.setSeriesPaint(2, new Color(51, 204, 204)); // 设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.0); // 显示每个柱的数值,并修改该数值的字体属性 // renderer.setIncludeBaseInRange(true); renderer .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); plot.setRenderer(renderer); // 设置柱的透明度 plot.setForegroundAlpha(1.0f); // 图表图像写入到临时目录 ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info, true); pw.flush(); }catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "picture_error.png"; } return filename; } // 柱状图 数据集 public static CategoryDataset getBarData(double[][] data, String[] rowKeys, String[] columnKeys) { return DatasetUtilities .createCategoryDataset(rowKeys, columnKeys, data); } }
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; DefaultPieDataset piedataset=(DefaultPieDataset)request.getAttribute("piedataset"); String p = ChartUtil.generatePieChart(piedataset," 职位分布情况统计",400,400,null, new PrintWriter(out)); String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p; %> <img src="<%= p1 %>" width=400 height=400 border=0 usemap="#<%= p %>"/>