JFreeChart(java画图)教程
JFreeChart配置安装 1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar 是例子程序(该部分留给大家自己去研究) 2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、 lib\gnujaxp.jar 3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入 如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明: 把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码: <servlet> <servlet-name>DisplayChart</servlet-name> <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayChart</servlet-name> <url-pattern>/servlet/DisplayChart</url-pattern> </servlet-mapping> 至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类 结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果 是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。JFreeChart开发package dao;import java.awt.Color;import java.awt.Font;import java.io.PrintWriter;import java.text.DecimalFormat;import java.text.NumberFormat;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartRenderingInfo;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.ItemLabelAnchor;import org.jfree.chart.labels.ItemLabelPosition;import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;import org.jfree.chart.labels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PiePlot3D;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.BarRenderer3D;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.chart.servlet.ServletUtilities;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.data.general.DefaultPieDataset;import org.jfree.data.general.PieDataset;import org.jfree.ui.TextAnchor; public class FreeChartCommon { static String graphURL1 = null; /** * 饼状图 */ public static JFreeChart generatePieChart(String xml) { PieDataset dataset = getDataSet(xml); JFreeChart chart = ChartFactory.createPieChart3D("纳税考评信息饼状图", // 图表标题 dataset, // 数据集 true, // 是否显示图例 false, // 是否生成工具 false // 是否生成URL链接 ); chart.setBackgroundPaint(Color.pink); chart.getTitle().setFont(new Font("宋体",Font.BOLD,20)); chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10)); PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setLabelFont(new Font("SansSerif",Font.BOLD,12)); plot.setCircular(true); plot.setLabelGap(0.01D);//间距 //图片中显示百分比:默认方式 //设置无数据时的信息 plot.setNoDataMessage("无对应的数据,请重新查询。"); //设置无数据时的信息显示颜色 plot.setNoDataMessagePaint(Color.red); //图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位 plot.setLabelGenerator(new StandardPieSectionLabelGenerator( "{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%"))); //图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例 plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator( "{0}={1}({2})")); return chart; } /** * 柱状图 */ public static JFreeChart generateBarChart(String xml) { CategoryDataset dataset = getDataSet2(xml); JFreeChart chart = ChartFactory.createBarChart3D("纳税考评信息柱状图", // 图表标题 "", // 目录轴的显示标签 "", // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向:水平、垂直 true, // 是否显示图例(对于简单的柱状图必须是false) false, // 是否生成工具 false // 是否生成URL链接 ); //显示每个柱的数值,并修改该数值的字体属性 chart.getTitle().setFont(new Font("宋体",Font.BOLD,20)); chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10)); CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象 CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表 domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14)); //水平底部标题 domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题 ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状 rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15)); CategoryPlot categoryplot = (CategoryPlot) chart.getPlot(); categoryplot.setNoDataMessage("无对应的数据,请重新查询。"); categoryplot.getRenderer().setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); categoryplot.getRenderer().setItemLabelsVisible(true); categoryplot.getRenderer().setPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_LEFT)); BarRenderer3D renderer = new BarRenderer3D(); renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator()); renderer.setItemLabelsVisible( true ); return chart; } /** * 折线图 */ public static JFreeChart generateLineChart(String xml) { CategoryDataset dataset = getDataSet3(xml); JFreeChart chart = ChartFactory.createLineChart("纳税考评折线图", // 图表标题 "", // 目录轴的显示标签 "", // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向:水平、垂直 true, // 是否显示图例(对于简单的柱状图必须是false) false, // 是否生成工具 false // 是否生成URL链接 ); /*------------配置图表属性--------------*/ // 1,设置整个图表背景颜色 chart.setBackgroundPaint(Color.pink); /*------------设定Plot参数-------------*/ CategoryPlot plot = chart.getCategoryPlot(); // 2,设置详细图表的显示细节部分的背景颜色 // plot.setBackgroundPaint(Color.PINK); // 3,设置垂直网格线颜色 plot.setDomainGridlinePaint(Color.black); // 4,设置是否显示垂直网格线 plot.setDomainGridlinesVisible(true); // 5,设置水平网格线颜色 plot.setRangeGridlinePaint(Color.blue); // 6,设置是否显示水平网格线 plot.setRangeGridlinesVisible(true); /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/ //显示每个柱的数值,并修改该数值的字体属性 chart.getTitle().setFont(new Font("宋体", Font.BOLD, 15)); chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15)); CategoryAxis domainAxis = plot.getDomainAxis(); /*------设置X轴坐标上的文字-----------*/ domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11)); /*------设置X轴的标题文字------------*/ domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis(); /*------设置Y轴坐标上的文字-----------*/ numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12)); /*------设置Y轴的标题文字------------*/ numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); numberaxis.setAutoRangeIncludesZero(true); numberaxis.setUpperMargin(0.20); numberaxis.setLabelAngle(Math.PI / 2.0); chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10)); // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!! LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer(); // lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见 lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见 //显示折点数据 lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); lineandshaperenderer.setBaseItemLabelsVisible(true); return chart; } /** * 获取一个饼状图的简单数据集对象 * * @return */ private static PieDataset getDataSet(String xml) { DefaultPieDataset dataset = new DefaultPieDataset();// try {// xml = "<ROOT>" + xml + "</ROOT>";// Document document = DocumentHelper.parseText(xml);// // 读取ITEM// List list = document.selectNodes("//ITEM");// // 获取NODE细节// Iterator it = list.iterator();// // while (it.hasNext()) {// Node node = (Node) it.next();// /**// * // */// dataset.setValue(Tools.nullToSpace(node.valueOf("HZFS")), Double.parseDouble(node.valueOf("XMMC")));// // }//// } catch (Exception e) {// // e.printStackTrace();// // } dataset.setValue("管理人员啊", 10.02D); dataset.setValue("市场人员啊", 20.23D); dataset.setValue("开发人员啊", 60.02D); dataset.setValue("OEM人员啊", 10.02D); dataset.setValue("其他人员啊", 5.11D); dataset.setValue("其他人员啊3", 5.11D); return dataset; } /** * 获取一个柱状图数据集对象 * * @return */ private static CategoryDataset getDataSet2(String xml) { DefaultCategoryDataset dataset = new DefaultCategoryDataset();// try {// xml = "<ROOT>" + xml + "</ROOT>";// Document document = DocumentHelper.parseText(xml);// // 读取ITEM// List list = document.selectNodes("//ITEM");// // 获取NODE细节// Iterator it = list.iterator();// while (it.hasNext()) {// Node node = (Node) it.next();// dataset.setValue(Double.parseDouble(node.valueOf("XMMC")), Tools// .nullToSpace(node.valueOf("HZFS")), Tools.nullToSpace(node// .valueOf("HZFS")));// }//// } catch (Exception e) {// // e.printStackTrace();// // } // 各曲线名称 String series1 = "计划"; String series2 = "营销"; String series3 = "开发"; // 横轴名称(列名称) String type1 = "管理人员"; String type2 = "市场人员"; String type3 = "开发人员"; dataset.setValue(10.02D,series1,type1); dataset.setValue(10.02D,series1,type2); dataset.setValue(10.02D,series1,type3); dataset.setValue(40.02D,series2,type1); dataset.setValue(40.02D,series2,type2); dataset.setValue(80.02D,series2,type3); dataset.setValue(50.02D,series3,type1); dataset.setValue(50.02D,series3,type2); dataset.setValue(60.02D,series3,type3); return dataset; } /** * 获取一个折线图数据集对象 * * @return */ public static CategoryDataset getDataSet3(String xml) { DefaultCategoryDataset dataset = new DefaultCategoryDataset();// try {// xml = "<ROOT>" + xml + "</ROOT>";// Document document = DocumentHelper.parseText(xml);// // 读取ITEM// List list = document.selectNodes("//ITEM");// // 获取NODE细节// Iterator it = list.iterator();//// while (it.hasNext()) {// Node node = (Node) it.next();// dataset.setValue(Double.parseDouble(node.valueOf("ZF")), Tools// .nullToSpace(node.valueOf("XMMC")), Tools.nullToSpace(node// .valueOf("NF")));// }// } catch (Exception e) {// // e.printStackTrace();//// } // 各曲线名称 String series1 = "管理人员"; String series2 = "市场人员"; String series3 = "开发人员"; // 横轴名称(列名称) String type1 = "计划"; String type2 = "营销"; String type3 = "洗衣机"; dataset.setValue(0.0, series1, type1); dataset.setValue(4.2, series1, type2); dataset.setValue(3.9, series1, type3); dataset.setValue(1.0, series2, type1); dataset.setValue(5.2, series2, type2); dataset.setValue(7.9, series2, type3); dataset.setValue(2.0, series3, type1); dataset.setValue(9.2, series3, type2); dataset.setValue(8.9, series3, type3); return dataset; } /** * * @param request * @param session * @param out * @param xml * @param x 1表示折线图,2表示饼图,3表示柱状图 * @return */ public static String getGraphUrl(HttpServletRequest request, HttpSession session, PrintWriter out,String xml,int x) { JFreeChart chart=null; if(x==1){ chart=generateLineChart(xml); } if(x==2){ chart=generatePieChart(xml); } if(x==3){ chart=generateBarChart(xml); } StandardEntityCollection sec = new StandardEntityCollection(); ChartRenderingInfo info = new ChartRenderingInfo(sec); try { String filename = ServletUtilities.saveChartAsJPEG(chart, 500, 300, info, null); graphURL1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; } catch (Exception e) { System.out.println("error happens---" + e.toString()); } return graphURL1; }}package navigate;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import common.Tools;import dao.FreeChartCommon;public class JfreeChar_Test extends HttpServlet { /** * Constructor of the object. */ public JfreeChar_Test() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=GBK"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); String method = request.getParameter("method"); String xml=request.getParameter("xml"); if (method == null) { method = ""; } if (xml == null) { xml = ""; } String filename=""; if(method.equals("line")) { filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),1); out.print(filename); } if(method.equals("pie")) { filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),2); out.print(filename); } if(method.equals("bar")) { filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),3); out.print(filename); } }}页面:<img id="imagetu" src="<%=request.getContextPath()%>/servlet/JfreeChar_Test?method=pie">?
这也是我从网上摘抄的,供大家参阅。
?