1、饼图、柱状图、折线图生成的工具类
1 package com.text.util;
2
3 import java.awt.BasicStroke;
4 import java.awt.Color;
5 import java.awt.Font;
6 import java.awt.GradientPaint;
7 import java.io.IOException;
8 import java.text.DecimalFormat;
9 import java.text.NumberFormat;
10 import java.text.SimpleDateFormat;
11
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpSession;
14
15 import org.jfree.chart.ChartFactory;
16 import org.jfree.chart.JFreeChart;
17 import org.jfree.chart.axis.CategoryAxis;
18 import org.jfree.chart.axis.DateAxis;
19 import org.jfree.chart.axis.ValueAxis;
20 import org.jfree.chart.labels.ItemLabelAnchor;
21 import org.jfree.chart.labels.ItemLabelPosition;
22 import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
23 import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
24 import org.jfree.chart.labels.StandardPieToolTipGenerator;
25 import org.jfree.chart.labels.StandardXYItemLabelGenerator;
26 import org.jfree.chart.labels.StandardXYToolTipGenerator;
27 import org.jfree.chart.plot.CategoryPlot;
28 import org.jfree.chart.plot.IntervalMarker;
29 import org.jfree.chart.plot.PiePlot;
30 import org.jfree.chart.plot.PlotOrientation;
31 import org.jfree.chart.plot.XYPlot;
32 import org.jfree.chart.renderer.category.BarRenderer;
33 import org.jfree.chart.renderer.category.BarRenderer3D;
34 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
35 import org.jfree.chart.servlet.ServletUtilities;
36 import org.jfree.chart.title.LegendTitle;
37 import org.jfree.chart.title.TextTitle;
38 import org.jfree.data.category.CategoryDataset;
39 import org.jfree.data.general.DefaultPieDataset;
40 import org.jfree.data.time.TimeSeriesCollection;
41 import org.jfree.ui.Layer;
42 import org.jfree.ui.TextAnchor;
43 import org.jfree.util.Rotation;
44
45 /**
46 *<br> 文 件 名:JFreeChartServlet.java
47 *<br> 包 名:com.report.servlet
48 *<br> 创 建 人:
49 *<br> 创建日期: Mar 30, 2010 1:00:23 PM
50 *<br> 描 述:生成jFreeChart
51 */
52 public class JFreeChartCreater {
53
54 /**
55 *<br> 方法名称:createPieChart
56 *<br> 功能描述:创建PieChart(饼图)图表
57 *<br> 返 回 值:JFreeChart
58 *<br> 创 建 人:
59 *<br> 创建日期:Mar 30, 2010 12:59:07 PM
60 *@param dataset
61 */
62 public static JFreeChart createPieChart(DefaultPieDataset dataset,
63 String title,boolean is3D) {
64 JFreeChart chart=null;
65 if(is3D){
66 chart=ChartFactory.createPieChart3D(
67 title, // 图表标题
68 dataset, // 数据集
69 true, // 是否显示图例
70 true, // 是否显示工具提示
71 true // 是否生成URL
72 );
73 }
74 else{ chart = ChartFactory.createPieChart(
75 title, // 图表标题
76 dataset, // 数据集
77 true, // 是否显示图例
78 true, // 是否显示工具提示
79 true // 是否生成URL
80 );
81 }
82 // 设置标题字体,为了防止中文乱码:必须设置字体
83 chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
84 // 设置图例的字体,为了防止中文乱码:必须设置字体
85 chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));
86 // 获取饼图的Plot对象(实际图表)
87 PiePlot plot = (PiePlot) chart.getPlot();
88 // 图形边框颜色
89 plot.setBaseSectionOutlinePaint(Color.GRAY);
90 // 图形边框粗细
91 plot.setBaseSectionOutlineStroke(new BasicStroke(0.0f));
92 // 设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制
93 plot.setDirection(Rotation.ANTICLOCKWISE);
94 // 设置绘制角度(图形旋转角度)
95 plot.setStartAngle(70);
96 // 设置突出显示的数据块
97 // plot.setExplodePercent("One", 0.1D);
98 // 设置背景色透明度
99 plot.setBackgroundAlpha(0.7F);
100 // 设置前景色透明度
101 plot.setForegroundAlpha(0.65F);
102 // 设置区块标签的字体==为了防止中文乱码:必须设置字体
103 plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
104 // 扇区分离显示,对3D图不起效
105 if(is3D)
106 plot.setExplodePercent(dataset.getKey(3), 0.1D);
107 // 图例显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
108 plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
109 "{0}:{1}\r\n({2})", NumberFormat.getNumberInstance(),
110 new DecimalFormat("0.00%")));
111 // 指定显示的饼图为:圆形(true) 还是椭圆形(false)
112 plot.setCircular(true);
113 // 没有数据的时候显示的内容
114 plot.setNoDataMessage("找不到可用数据");
115
116 // 设置鼠标悬停提示
117 plot.setToolTipGenerator(new StandardPieToolTipGenerator());
118 // 设置热点链接
119 // plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp"));
120
121 return chart;
122 }
123 /**
124 *<br> 方法名称:createPieChart
125 *<br> 功能描述:创建BarChart(柱状图/条形图)图表
126 *<br> 返 回 值:JFreeChart
127 *<br> 创 建 人:
128 *<br> 创建日期:Mar 30, 2010 12:59:07 PM
129 *@param dataset
130 */
131 @SuppressWarnings("deprecation")
132 public static JFreeChart createBarChart(CategoryDataset dataset,
133 String title, String x, String y,boolean is3D) {
134 JFreeChart chart =null;
135 BarRenderer renderer = null;
136 if(is3D){
137 chart = ChartFactory.createBarChart3D( // 3D柱状图
138 // JFreeChart chart = ChartFactory.createLineChart3D( //3D折线图
139 title, // 图表的标题
140 x, // 目录轴的显示标签
141 y, // 数值轴的显示标签
142 dataset, // 数据集
143 PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
144 true, // 是否显示图例
145 false, // 是否显示工具提示
146 false // 是否生成URL
147 );
148 // 柱图的呈现器
149 renderer = new BarRenderer3D();
150 renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
151 renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
152 renderer.setItemLabelsVisible(true);
153 //3D柱子上不能正常显示数字
154 //注意:如果数值太大切前面的柱子低于后面的柱子,那么前面的那个数值将被挡住,所以将下面方法中的0该为-值
155 ItemLabelPosition itemLabelPositionFallback = new ItemLabelPosition(
156 ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,
157 TextAnchor.HALF_ASCENT_LEFT,-1.3D);
158 //设置不能正常显示的柱子label的position
159 renderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
160 renderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
161 }else{
162 chart = ChartFactory.createBarChart( // 柱状图
163 // JFreeChart chart = ChartFactory.createLineChart3D( //3D折线图
164 title, // 图表的标题
165 x, // 目录轴的显示标签
166 y, // 数值轴的显示标签
167 dataset, // 数据集
168 PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
169 true, // 是否显示图例
170 false, // 是否显示工具提示
171 false // 是否生成URL
172 );
173 // 柱图的呈现器
174 renderer = new BarRenderer();
175 renderer.setIncludeBaseInRange(true); // 显示每个柱的数值,并修改该数值的字体属性
176 renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
177 renderer.setBaseItemLabelsVisible(true);
178 }
179
180 //设置图片背景
181 // chart.setBackgroundPaint(Color.PINK);
182 // 为了防止中文乱码:必须设置字体
183 chart.setTitle(new TextTitle(title, new Font("黑体", Font.PLAIN, 22)));
184 LegendTitle legend = chart.getLegend(); // 获取图例
185 legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码
186 CategoryPlot plot = (CategoryPlot) chart.getPlot(); // 获取柱图的Plot对象(实际图表)
187 // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
188 plot.setBackgroundPaint(new Color(255, 255, 204));
189 plot.setForegroundAlpha(0.65F); // 设置前景色透明度
190 // 设置横虚线可见
191 plot.setRangeGridlinesVisible(true);
192 // 虚线色彩
193 plot.setRangeGridlinePaint(Color.gray);
194
195 ValueAxis rangeAxis = plot.getRangeAxis();
196 //设置最高的一个Item与图片顶端的距离
197 rangeAxis.setUpperMargin(0.2);
198 //设置最低的一个Item与图片底端的距离
199 rangeAxis.setLowerMargin(0.3);
200
201 CategoryAxis domainAxis = plot.getDomainAxis(); // 获取x轴
202 domainAxis.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示
203 domainAxis.setLabelFont(new Font("宋体", Font.TRUETYPE_FONT, 14));// 设置字体,防止中文乱码
204 domainAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 12));// 轴数值
205 // h.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//45度倾斜
206 plot.getRangeAxis().setLabelFont(new Font("宋体", Font.TRUETYPE_FONT, 14)); // Y轴设置字体,防止中文乱码
207
208 renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框颜色
209 renderer.setDrawBarOutline(true); // 设置柱子边框可见
210 renderer.setSeriesPaint(0, Color.YELLOW); // 设置每个柱的颜色
211 renderer.setSeriesPaint(1, Color.green);
212 renderer.setSeriesPaint(2, Color.RED);
213 renderer.setSeriesPaint(3, Color.CYAN);
214 renderer.setSeriesPaint(5, Color.ORANGE);
215 renderer.setSeriesPaint(4, Color.MAGENTA);
216 renderer.setSeriesPaint(6, Color.DARK_GRAY);
217 renderer.setSeriesPaint(7, Color.PINK);
218 renderer.setSeriesPaint(8, Color.black);
219 renderer.setItemMargin(0.1); // 设置每个地区所包含的平行柱的之间距离
220 plot.setRenderer(renderer); // 给柱图添加呈现器
221 plot.setForegroundAlpha(0.7f); // 设置柱的透明度
222 // renderer.setMaximumBarWidth(0.2); // 设置柱子宽度
223 // renderer.setMinimumBarLength(0.6); // 设置柱子高度
224 //设置横坐标显示位置(默认是下方);
225 // plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
226 //设置纵坐标显示位置(默认是左方)
227 // plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
228 // 没有数据的时候显示的内容
229 plot.setNoDataMessage("找不到可用数据");
230
231 return chart;
232 }
233
234 /**
235 *<br> 方法名称:JFreeChartSeriesChart
236 *<br> 功能描述:创建曲线图(折线图)
237 *<br> 注意事项:一般曲线图不用加域所以后4个参数一般为(false,null,0,0)
238 *<br> 参 数:title-标题;subtitleStr-子标题;domain-x轴标志;range-y轴标志;dataset-设置数据;isAreaText-是否在图标中加域;
239 *<br> areaText-域中文字,lowpress-域的最低刻度;uperpress-域的最高刻度
240 *<br> 返 回 值:JFreeChart
241 *<br> 创 建 人:
242 *<br> 创建日期:Mar 30, 2010 1:11:24 PM
243 */
244 @SuppressWarnings("deprecation")
245 public static JFreeChart JFreeChartSeriesChart(String title,
246 String subtitleStr, String domain, String range,
247 TimeSeriesCollection dataset,boolean isAreaText,String areaText,double lowpress,double uperpress) { //时间曲线元素
248 // JFreeChart chart = ChartFactory.createTimeSeriesChart("标题","x轴标志","y轴标志","设置数据",是否显示图形,是否进行提示,是否配置报表存放地址);
249 JFreeChart chart = ChartFactory.createTimeSeriesChart(title, domain,range, dataset, true, true, false);
250
251 if(subtitleStr!=null){
252 TextTitle subtitle = new TextTitle(subtitleStr, new Font("黑体",Font.BOLD, 12));
253 chart.addSubtitle(subtitle);
254 }
255 // 设置日期显示格式
256 XYPlot plot = chart.getXYPlot();
257 DateAxis axis = (DateAxis) plot.getDomainAxis();
258 axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));
259 // 设置标题的颜色
260 chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
261 chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0, 1000, Color.blue));
262 plot.setOutlineStroke(new BasicStroke(1.5f)); // 边框粗细
263 ValueAxis vaxis = plot.getDomainAxis();
264 vaxis.setAxisLineStroke(new BasicStroke(1.5f)); // 坐标轴粗细
265 vaxis.setAxisLinePaint(new Color(215, 215, 215)); // 坐标轴颜色
266 vaxis.setLabelPaint(new Color(10, 10, 10)); // 坐标轴标题颜色
267 vaxis.setTickLabelPaint(new Color(102, 102, 102)); // 坐标轴标尺值颜色
268 vaxis.setLowerMargin(0.06d);// 分类轴下(左)边距
269 vaxis.setUpperMargin(0.14d);// 分类轴下(右)边距,防止最后边的一个数据靠近了坐标轴。
270 plot.setNoDataMessage("找不到可用数据");//没有数据时显示的文字说明。
271 XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
272 //第一条折线的颜色
273 xylineandshaperenderer.setBaseItemLabelsVisible(true);
274 xylineandshaperenderer.setSeriesFillPaint(0, new Color(127, 128, 0));
275 xylineandshaperenderer.setSeriesPaint(0, new Color(127, 128, 0));
276 xylineandshaperenderer.setSeriesShapesVisible(0, true);
277 xylineandshaperenderer.setSeriesShapesVisible(1, true);
278 xylineandshaperenderer.setSeriesShapesVisible(2, true);
279 xylineandshaperenderer.setSeriesShapesVisible(3, true);
280 xylineandshaperenderer.setSeriesShapesVisible(4, true);
281 //折线的粗细调
282 StandardXYToolTipGenerator xytool = new StandardXYToolTipGenerator();
283 xylineandshaperenderer.setToolTipGenerator(xytool);
284 xylineandshaperenderer.setStroke(new BasicStroke(1.5f));
285 // 显示节点的值
286 xylineandshaperenderer.setBaseItemLabelsVisible(true);
287 xylineandshaperenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
288 ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
289 xylineandshaperenderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
290 xylineandshaperenderer.setBaseItemLabelPaint(new Color(102, 102, 102));// 显示折点数值字体的颜色
291
292 ValueAxis rangeAxis = plot.getRangeAxis();
293 //设置最高的一个Item与图片顶端的距离
294 rangeAxis.setUpperMargin(0.2);
295 //设置最低的一个Item与图片底端的距离
296 rangeAxis.setLowerMargin(0.3);
297 //在图表中加区域加区域
298 if(isAreaText){
299 lowpress = 62;
300 uperpress = 400;
301 IntervalMarker intermarker = new IntervalMarker(lowpress, uperpress);
302 intermarker.setPaint(Color.decode("#66FFCC"));// 域顏色
303 intermarker.setLabelFont(new Font("SansSerif", 41, 14));
304 intermarker.setLabelPaint(Color.RED);
305 intermarker.setLabel(areaText);
306 if (dataset != null) {
307 plot.addRangeMarker(intermarker, Layer.BACKGROUND);
308 }
309 }
310 return chart;
311 }
312
313
314 /**
315 *<br> 方法名称:getGraphURL
316 *<br> 功能描述:取得session中图像的地址;
317 *<br> 返 回 值:String
318 *<br> 创 建 人:
319 *<br> 创建日期:Mar 30, 2010 1:09:51 PM
320 */
321 public static String getGraphURL(JFreeChart chart, HttpSession session,
322 HttpServletRequest request, int width, int height)throws IOException {
323 String filename = ServletUtilities.saveChartAsPNG(chart, width, height,null, session);
324 String graphURL = request.getContextPath()+ "/servlet/DisplayChart?filename=" + filename;
325 return graphURL;
326 }
327
328 }
329
330
2、模拟数据
1 //柱状图
2 DefaultCategoryDataset dataset = new DefaultCategoryDataset();
3 dataset.setValue(5003, "北京", "Corejava");
4 dataset.setValue(3333, "上海", "Corejava");
5 dataset.setValue(5343, "广州", "Corejava");
6 dataset.setValue(2000, "贵州", "Corejava");
7
8 dataset.setValue(1000, "北京", "JavaWeb");
9 dataset.setValue(6300, "上海", "JavaWeb");
10 dataset.setValue(4000, "广州", "JavaWeb");
11
12 dataset.setValue(2000, "北京", "jquery");
13 dataset.setValue(1000, "上海", "jquery");
14 dataset.setValue(1000, "广州", "jquery");
15 JFreeChart jfreechart = JFreeChartCreater.createBarChart(dataset, "课件使用情况条形图", "课件制作者", "可见使用次数", true);
16
17 //折线图
18 // 创建第一条时序线
19 TimeSeries pop1 = new TimeSeries("流行趋势1", Day.class);
20 pop1.add(new Day(10, 1, 2004), 100);
21 pop1.add(new Day(10, 2, 2004), 150);
22 pop1.add(new Day(10, 3, 2004), 250);
23 pop1.add(new Day(10, 4, 2004), 275);
24 pop1.add(new Day(10, 5, 2004), 325);
25 pop1.add(new Day(10, 6, 2004), 425);
26 // 创建第二条时序线
27 TimeSeries pop2 = new TimeSeries("流行趋势2", Day.class);
28 pop2.add(new Day(20, 1, 2004), 200);
29 pop2.add(new Day(20, 2, 2004), 250);
30 pop2.add(new Day(20, 3, 2004), 450);
31 pop2.add(new Day(20, 4, 2004), 475);
32 pop2.add(new Day(20, 5, 2004), 125);
33 pop2.add(new Day(20, 6, 2004), 150);
34 JFreeChart jfreechart = JFreeChartCreater.JFreeChartSeriesChart("课件使用情况条形图", null, "X轴", "Y轴", dataset,false,null,0,0);
35
36 //饼图
37 DefaultPieDataset dataset = new DefaultPieDataset();
38
39 dataset.setValue("java程序设计语言", 10000);
40 dataset.setValue("JSP基础与案例开发详解", 20000);
41 dataset.setValue("struts基础与案例开发详解", 30000);
42 dataset.setValue("精通JSF", 4000);
43 JFreeChart jfreechart = JFreeChartCreater.createPieChart(dataset,
44 "课件使用情况条形图", false);
45
46 request.setAttribute("jfreechart", jfreechart);
3、jsp页面
1 <%@ page language="java" pageEncoding="utf-8"%>
2 <%@ include file="/includes/taglibs.jsp"%>
3 <jsp:directive.page import="org.jfree.chart.*"/>
4 <jsp:directive.page import="org.jfree.chart.entity.*"/>
5 <jsp:directive.page import="org.jfree.chart.servlet.ServletUtilities"/>
6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7 <html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10 <title>课件使用情况柱状图</title>
11 </head>
12 <body>
13 <%
14 JFreeChart jfreechart = (JFreeChart) request.getAttribute("jfreechart");
15 StandardEntityCollection sec = new StandardEntityCollection();
16 ChartRenderingInfo info = new ChartRenderingInfo(sec);
17 String filename = ServletUtilities.saveChartAsJPEG(jfreechart, 500,300, info, session);
18 String graphURL = request.getContextPath()+ "/servlet/DisplayChart?filename=" + filename;
19 %>
20
21 <P ALIGN="CENTER">
22 <img src="<%=graphURL%>" width=500 height=300 border=0 usemap="#map0">
23 </P>
24 <p ALIGN="CENTER">
25 <input type="button" value="关闭" onclick="JavaScript:window.close()"/>
26 </p>
27 </body>
28 </html>
29