package table; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; 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.axis.CategoryAxis; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.DateTickUnit; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.labels.StandardPieToolTipGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.title.LegendTitle; 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.data.time.Day; import org.jfree.data.time.Hour; import org.jfree.data.time.Month; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; import org.jfree.util.Rotation; public class JFreeUtils { public static JFreeChart createPieChart(DefaultPieDataset dataset, String title, boolean is3D) { JFreeChart chart = null; if (is3D) { chart = ChartFactory.createPieChart3D(title, // 图表标题 dataset, // 数据集 true, // 是否显示图例 true, // 是否显示工具提示 true // 是否生成URL ); } else { chart = ChartFactory.createPieChart(title, // 图表标题 dataset, // 数据集 true, // 是否显示图例 true, // 是否显示工具提示 true // 是否生成URL ); } // 设置标题字体==为了防止中文乱码:必须设置字体 chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22))); // 设置图例的字体==为了防止中文乱码:必须设置字体 chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12)); // 获取饼图的Plot对象(实际图表) PiePlot plot = (PiePlot) chart.getPlot(); // 图形边框颜色 plot.setBaseSectionOutlinePaint(Color.GRAY); // 图形边框粗细 plot.setBaseSectionOutlineStroke(new BasicStroke(0.0f)); // 设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制 plot.setDirection(Rotation.ANTICLOCKWISE); // 设置绘制角度(图形旋转角度) plot.setStartAngle(70); // 设置突出显示的数据块 // plot.setExplodePercent("One", 0.1D); // 设置背景色透明度 plot.setBackgroundAlpha(0.7F); // 设置前景色透明度 plot.setForegroundAlpha(0.65F); // 设置区块标签的字体==为了防止中文乱码:必须设置字体 plot.setLabelFont(new Font("宋体", Font.PLAIN, 12)); // 扇区分离显示,对3D图不起效 if (is3D) plot.setExplodePercent(dataset.getKey(3), 0.1D); // 图例显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位 plot.setLabelGenerator(new StandardPieSectionLabelGenerator( "{0}:{1}\r\n({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%"))); // 图例显示百分比 // plot.setLegendLabelGenerator(new // StandardPieSectionLabelGenerator("{0}={1}({2})")); // 指定显示的饼图为:圆形(true) 还是椭圆形(false) plot.setCircular(true); // 没有数据的时候显示的内容 plot.setNoDataMessage("找不到可用数据..."); // 设置鼠标悬停提示 plot.setToolTipGenerator(new StandardPieToolTipGenerator()); // 设置热点链接 // plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp")); return chart; } public static JFreeChart createBarChart(CategoryDataset dataset, String title, String x, String y, boolean is3D) { JFreeChart chart = null; if (is3D) { chart = ChartFactory.createBarChart3D( // 3D柱状图 // JFreeChart chart = ChartFactory.createLineChart3D( // //3D折线图 title, // 图表的标题 x, // 目录轴的显示标签 y, // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平 true, // 是否显示图例 false, // 是否显示工具提示 false // 是否生成URL ); } else { chart = ChartFactory.createBarChart( // 柱状图 // JFreeChart chart = ChartFactory.createLineChart3D( // //3D折线图 title, // 图表的标题 x, // 目录轴的显示标签 y, // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平 true, // 是否显示图例 false, // 是否显示工具提示 false // 是否生成URL ); } // ===============为了防止中文乱码:必须设置字体 chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22))); LegendTitle legend = chart.getLegend(); // 获取图例 legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码 CategoryPlot plot = (CategoryPlot) chart.getPlot(); // 获取柱图的Plot对象(实际图表) // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确) plot.setBackgroundPaint(new Color(255, 255, 204)); plot.setForegroundAlpha(0.65F); // 设置前景色透明度 // 设置横虚线可见 plot.setRangeGridlinesVisible(true); // 虚线色彩 plot.setRangeGridlinePaint(Color.gray); CategoryAxis h = plot.getDomainAxis(); // 获取x轴 h.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示 h.setLabelFont(new Font("宋体", Font.BOLD, 12));// 设置字体,防止中文乱码 h.setTickLabelFont(new Font("宋体", Font.BOLD, 12));// 轴数值 // h.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//45度倾斜 plot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码 // 柱图的呈现器 BarRenderer renderer = new BarRenderer(); // 设置柱子宽度 // renderer.setMaximumBarWidth(0.05); // 设置柱子高度 // renderer.setMinimumBarLength(0.2); // 设置柱子边框颜色 renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框可见 renderer.setDrawBarOutline(true); // 设置每个柱的颜色 renderer.setSeriesPaint(0, Color.BLUE); renderer.setSeriesPaint(1, Color.GREEN); renderer.setSeriesPaint(2, Color.RED); // 设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.05); // 显示每个柱的数值,并修改该数值的字体属性 renderer.setIncludeBaseInRange(true); renderer .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); // 设置柱的透明度 plot.setForegroundAlpha(1.0f); // 给柱图添加呈现器 plot.setRenderer(renderer); // 没有数据的时候显示的内容 plot.setNoDataMessage("找不到可用数据..."); return chart; } public static JFreeChart createLineChart(String chartTitle, String chartXdesc, String chartYdesc, String periodType, int dateInterval, String timeFormat, XYDataset dataSet) { JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle, chartXdesc, chartYdesc, dataSet, true, false, false); // 设置标题 chart.setTitle(new TextTitle(chartTitle, new Font("黑体", Font.ITALIC, 22))); LegendTitle legend = chart.getLegend(); legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码 XYPlot xyplot = (XYPlot) chart.getXYPlot(); xyplot.setBackgroundPaint(new Color(255, 255, 204)); xyplot.setForegroundAlpha(0.65F); // 设置前景色透明度 // 设置横虚线可见 xyplot.setRangeGridlinesVisible(true); // 虚线色彩 xyplot.setRangeGridlinePaint(Color.gray); xyplot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码 xyplot.getDomainAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // X轴设置字体,防止中文乱码 DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis(); if (periodType.equalsIgnoreCase("MONTH")) { dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, dateInterval)); } else if (periodType.equalsIgnoreCase("DAY")) { dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, dateInterval)); } else if (periodType.equalsIgnoreCase("HOUR")) { dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.HOUR, dateInterval)); } dateaxis.setDateFormatOverride(new SimpleDateFormat(timeFormat)); return chart; } private static boolean drawToOutputStream(String destPath, JFreeChart chart, int width, int heigth) { FileOutputStream fos = null; boolean returnValue = true; try { fos = new FileOutputStream(destPath); ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流 chart, // 图表对象 width, // 宽 heigth, // 高 null); // ChartRenderingInfo信息 } catch (IOException e) { e.printStackTrace(); returnValue = false; } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } return returnValue; } public static void 测试柱状图() { // 初始化数据 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.setValue(5000, "北京", "Corejava"); dataset.setValue(3000, "上海", "Corejava"); dataset.setValue(2000, "广州", "Corejava"); dataset.setValue(10000, "北京", "JavaWeb"); dataset.setValue(6000, "上海", "JavaWeb"); dataset.setValue(4000, "广州", "JavaWeb"); dataset.setValue(15000, "北京", "易用struts"); dataset.setValue(5000, "上海", "易用struts"); dataset.setValue(10000, "广州", "易用struts"); dataset.setValue(20000, "北京", "精通JSF"); dataset.setValue(10000, "上海", "精通JSF"); dataset.setValue(10000, "广州", "精通JSF"); // 生成图表 JFreeChart chart = createBarChart(dataset, "柱状图", "书名", "销售数量", false); // 生成图片 drawToOutputStream("D:\\柱状图.JPG", chart, 640, 480); } public static void 测试饼图() { // 初始化数据 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)); // 生成图表 JFreeChart chart = createPieChart(dataset, "饼图", true); // 生成图片 drawToOutputStream("D:\\饼图.JPG", chart, 640, 480); } public static void 测试曲线图_MONTH() { // 初始化数据 String chartTitle = "访问量统计图形"; String chartSeriesDesc = "月访问量曲线"; String chartXdesc = "时间"; String chartYdesc = "访问量"; String timeFormat = "MM";// yyyy-MM-dd String periodType = "MONTH"; int dateInterval = 1; TimeSeriesCollection dataset = new TimeSeriesCollection(); TimeSeries monthseries = new TimeSeries(chartSeriesDesc, Month.class); monthseries.add(new Month(1, 2001), 100); monthseries.add(new Month(2, 2001), 120); monthseries.add(new Month(3, 2001), 70); monthseries.add(new Month(4, 2001), 680); monthseries.add(new Month(5, 2001), 345); monthseries.add(new Month(6, 2001), 430); monthseries.add(new Month(7, 2001), 300); monthseries.add(new Month(8, 2001), 200); monthseries.add(new Month(9, 2001), 190); monthseries.add(new Month(10, 2001), 300); monthseries.add(new Month(11, 2001), 200); monthseries.add(new Month(12, 2001), 240); // 存储至集合对象中 dataset.addSeries(monthseries); // 生成图表 JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc, periodType, dateInterval, timeFormat, dataset); // 生成图片 drawToOutputStream("D:\\曲线-月.JPG", chart, 640, 480); } public static void 测试曲线图_DAY() { // 初始化数据 String chartTitle = "访问量统计图形"; String chartSeriesDesc = "日访问量曲线"; String chartXdesc = "时间"; String chartYdesc = "访问量"; String timeFormat = "dd";// yyyy-MM-dd String periodType = "DAY"; int dateInterval = 1; TimeSeriesCollection dataset = new TimeSeriesCollection(); TimeSeries dayseries = new TimeSeries(chartSeriesDesc, Day.class); dayseries.add(new Day(1, 1, 2010), 100); dayseries.add(new Day(2, 1, 2010), 200); dayseries.add(new Day(4, 1, 2010), 400); dayseries.add(new Day(5, 1, 2010), 600); dayseries.add(new Day(7, 1, 2010), 200); dayseries.add(new Day(8, 1, 2010), 400); dayseries.add(new Day(12, 1, 2010), 300); dayseries.add(new Day(23, 1, 2010), 500); dayseries.add(new Day(29, 1, 2010), 300); // 存储至集合对象中 dataset.addSeries(dayseries); // 生成图表 JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc, periodType, dateInterval, timeFormat, dataset); // 生成图片 drawToOutputStream("D:\\曲线-天.JPG", chart, 640, 480); } public static void 测试曲线图_HOUR() { // 初始化数据 String chartTitle = "访问量统计图形"; String chartSeriesDesc = "小时访问量曲线"; String chartXdesc = "时间"; String chartYdesc = "访问量"; String timeFormat = "hh";// yyyy-MM-dd String periodType = "HOUR"; int dateInterval = 1; TimeSeriesCollection dataset = new TimeSeriesCollection(); TimeSeries hourseries = new TimeSeries(chartSeriesDesc, Hour.class); hourseries.add(new Hour(1, 1, 1, 2010), 100); hourseries.add(new Hour(2, 1, 1, 2010), 200); hourseries.add(new Hour(3, 1, 1, 2010), 400); hourseries.add(new Hour(4, 1, 1, 2010), 600); hourseries.add(new Hour(5, 1, 1, 2010), 200); hourseries.add(new Hour(6, 1, 1, 2010), 400); hourseries.add(new Hour(7, 1, 1, 2010), 300); hourseries.add(new Hour(8, 1, 1, 2010), 500); hourseries.add(new Hour(9, 1, 1, 2010), 300); // 存储至集合对象中 dataset.addSeries(hourseries); // 生成图表 JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc, periodType, dateInterval, timeFormat, dataset); // 生成图片 drawToOutputStream("D:\\曲线-小时.JPG", chart, 640, 480); } public static void main(String[] args) { 测试饼图(); 测试柱状图(); // 测试曲线图_MONTH(); // 测试曲线图_DAY(); // 测试曲线图_HOUR(); } }