一、饼图
代码
/** * ClassName: PieChartTest.java * created on 2008-12-21 * Copyrights 2008 qjyong All rights reserved. * EMail: [email protected] */ package test; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.DecimalFormat; import java.text.NumberFormat; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.labels.StandardPieToolTipGenerator; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.title.TextTitle; import org.jfree.chart.urls.StandardPieURLGenerator; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.util.Rotation; /** * 使用JFreeChart绘制饼图 * @author qiujy */ public class PieChartTest { /** * step1:创建数据集对象 * @return */ public static PieDataset createDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("java程序设计语言", 10000); dataset.setValue("JSP基础与案例开发详解", 20000); dataset.setValue("struts基础与案例开发详解", 30000); dataset.setValue("精通JSF", 40000); return dataset; } /** * step2:创建图表 * @param dataset * @return */ public static JFreeChart createChart(PieDataset dataset) { JFreeChart chart = ChartFactory.createPieChart3D( //JFreeChart chart = ChartFactory.createPieChart( "原创图书销量统计", // 图表标题 dataset, // 数据集 true, // 是否显示图例 true, // 是否显示工具提示 true // 是否生成URL ); //设置标题字体==为了防止中文乱码:必须设置字体 chart.setTitle(new TextTitle("原创图书销量统计", 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图不起效 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(false); // 没有数据的时候显示的内容 plot.setNoDataMessage("找不到可用数据..."); //设置鼠标悬停提示 plot.setToolTipGenerator(new StandardPieToolTipGenerator()); //设置热点链接 plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp")); return chart; } /** * step3: 输出图表到Swing Frame * @param chart */ public static void drawToFrame(JFreeChart chart){ //输出图表到Swing Frame ChartFrame frame = new ChartFrame("原创图书销量统计", chart); frame.pack(); frame.setVisible(true); } /** * step3: 输出图表到指定的磁盘 * @param destPath * @param chart */ public static void drawToOutputStream(String destPath, JFreeChart chart) { FileOutputStream fos = null; try { fos = new FileOutputStream(destPath); // ChartUtilities.writeChartAsJPEG( ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流 chart, // 图表对象 600, // 宽 400, // 高 null); // ChartRenderingInfo信息 } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws FileNotFoundException { // step1:创建数据集对象 PieDataset dataset = createDataSet(); // step2:创建图表 JFreeChart chart = createChart(dataset); // step3: 输出图表到Swing窗口 //drawToFrame(chart); // step3: 输出图表到磁盘 drawToOutputStream("D://mybook-pie.png", chart); } }
产生的图
二、饼图
代码
/** * ClassName: BarChartTest.java * created on 2008-12-21 * Copyrights 2008 qjyong All rights reserved. * EMail: [email protected] */ package test; import java.awt.Color; import java.awt.Font; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; 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; /** * 柱状图和折线图 * @author qiujy */ public class BarChartTest { /** * step1:创建 简单数据集对象 * @return */ public static CategoryDataset createDataSet() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.setValue(10000, "","Corejava"); dataset.setValue(20000, "","JavaWeb"); dataset.setValue(30000, "","易用struts"); dataset.setValue(40000, "","精通JSF"); return dataset; } /** * 组合数据集对象 * @return */ public static CategoryDataset createDataSet2() { 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"); return dataset; } /** * step2:创建图表 * @param dataset * @return */ public static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart3D( //3D柱状图 //JFreeChart chart = ChartFactory.createLineChart3D( //3D折线图 "原创图书销量统计", //图表的标题 "图书名", //目录轴的显示标签 "销量", //数值轴的显示标签 dataset, //数据集 PlotOrientation.VERTICAL, //图表方式:V垂直;H水平 true, // 是否显示图例 false, // 是否显示工具提示 false // 是否生成URL ); //===============为了防止中文乱码:必须设置字体 chart.setTitle(new TextTitle("原创图书销量统计", 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; } /** * step3: 输出图表到Swing Frame * @param chart */ public static void drawToFrame(JFreeChart chart){ //输出图表到Swing Frame ChartFrame frame = new ChartFrame("原创图书销量统计", chart); frame.pack(); frame.setVisible(true); } /** * step3: 输出图表到指定的磁盘 * @param destPath * @param chart */ public static void drawToOutputStream(String destPath, JFreeChart chart) { FileOutputStream fos = null; try { fos = new FileOutputStream(destPath); // ChartUtilities.writeChartAsJPEG( ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流 chart, // 图表对象 600, // 宽 500, // 高 null); // ChartRenderingInfo信息 } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws FileNotFoundException { // step1:创建数据集对象 CategoryDataset dataset = createDataSet2(); // step2:创建饼图 JFreeChart chart = createChart(dataset); // step3: 输出图表到Swing窗口 //drawToFrame(chart); // step3: 输出图表到磁盘 drawToOutputStream("D://mybook-bar.png", chart); } }
产生的图
三、一些没有保密要求的图表,可以直接使用Google图表API(http://code.google.com/intl/zh-CN/apis/chart/)来生成,更简单更直接:
如:请求链接为http://chart.apis.google.com/chart?cht=p3&chco=0000ff&chd=t:40,30,20,10&chs=500x250&chl=java|jsp|ssh|ejb
产生的图片为
其它图表可参看Google提供的API