JFreeChart(java画图)教程

1.JFreeChart配置安装
2. 1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar
3. 是例子程序(该部分留给大家自己去研究)
4. 2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、
5. lib\gnujaxp.jar
6. 3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入
7. 如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明:
8. 把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码:
9. <servlet>
10. <servlet-name>DisplayChart</servlet-name>
11. <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
12. </servlet>
13. <servlet-mapping>
14. <servlet-name>DisplayChart</servlet-name>
15. <url-pattern>/servlet/DisplayChart</url-pattern>
16. </servlet-mapping>
17. 至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
18. 结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果
19. 是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。
20.
21.JFreeChart开发
22.
23.package dao;
24.
25.import java.awt.Color;
26.import java.awt.Font;
27.import java.io.PrintWriter;
28.import java.text.DecimalFormat;
29.import java.text.NumberFormat;
30.
31.import javax.servlet.http.HttpServletRequest;
32.import javax.servlet.http.HttpSession;
33.
34.import org.jfree.chart.ChartFactory;
35.import org.jfree.chart.ChartRenderingInfo;
36.import org.jfree.chart.JFreeChart;
37.import org.jfree.chart.axis.CategoryAxis;
38.import org.jfree.chart.axis.NumberAxis;
39.import org.jfree.chart.axis.ValueAxis;
40.import org.jfree.chart.entity.StandardEntityCollection;
41.import org.jfree.chart.labels.ItemLabelAnchor;
42.import org.jfree.chart.labels.ItemLabelPosition;
43.import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
44.import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
45.import org.jfree.chart.plot.CategoryPlot;
46.import org.jfree.chart.plot.PiePlot3D;
47.import org.jfree.chart.plot.PlotOrientation;
48.import org.jfree.chart.renderer.category.BarRenderer3D;
49.import org.jfree.chart.renderer.category.LineAndShapeRenderer;
50.import org.jfree.chart.servlet.ServletUtilities;
51.import org.jfree.data.category.CategoryDataset;
52.import org.jfree.data.category.DefaultCategoryDataset;
53.import org.jfree.data.general.DefaultPieDataset;
54.import org.jfree.data.general.PieDataset;
55.import org.jfree.ui.TextAnchor;
56.
57.
58.
59.public class FreeChartCommon {
60.
61. static String graphURL1 = null;
62.
63. /**
64. * 饼状图
65. */
66. public static JFreeChart generatePieChart(String xml) {
67. PieDataset dataset = getDataSet(xml);
68. JFreeChart chart = ChartFactory.createPieChart3D("纳税考评信息饼状图", // 图表标题
69. dataset, // 数据集
70. true, // 是否显示图例
71. false, // 是否生成工具
72. false // 是否生成URL链接
73. );
74. chart.setBackgroundPaint(Color.pink);
75. chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
76. chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
77. PiePlot3D plot = (PiePlot3D) chart.getPlot();
78.
79. plot.setLabelFont(new Font("SansSerif",Font.BOLD,12));
80.
81. plot.setCircular(true);
82.
83. plot.setLabelGap(0.01D);//间距
84. //图片中显示百分比:默认方式
85. //设置无数据时的信息
86. plot.setNoDataMessage("无对应的数据,请重新查询。");
87.
88. //设置无数据时的信息显示颜色
89. plot.setNoDataMessagePaint(Color.red);
90. //图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
91. plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
92. "{0}={1}({2})", NumberFormat.getNumberInstance(),
93. new DecimalFormat("0.00%")));
94. //图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
95. plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
96. "{0}={1}({2})"));
97. return chart;
98. }
99.
100. /**
101. * 柱状图
102. */
103. public static JFreeChart generateBarChart(String xml) {
104. CategoryDataset dataset = getDataSet2(xml);
105. JFreeChart chart = ChartFactory.createBarChart3D("纳税考评信息柱状图", // 图表标题
106. "", // 目录轴的显示标签
107. "", // 数值轴的显示标签
108. dataset, // 数据集
109. PlotOrientation.VERTICAL, // 图表方向:水平、垂直
110. true, // 是否显示图例(对于简单的柱状图必须是false)
111. false, // 是否生成工具
112. false // 是否生成URL链接
113. );
114. //显示每个柱的数值,并修改该数值的字体属性
115. chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
116. chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
117.
118. CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
119.
120. CategoryAxis domainAxis=plot.getDomainAxis();
121. //水平底部列表
122. domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
123. //水平底部标题
124. domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
125. //垂直标题
126. ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
127. rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
128.
129. CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
130. categoryplot.setNoDataMessage("无对应的数据,请重新查询。");
131. categoryplot.getRenderer().setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
132. categoryplot.getRenderer().setItemLabelsVisible(true);
133. categoryplot.getRenderer().setPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,
134. TextAnchor.BOTTOM_LEFT));
135. BarRenderer3D renderer = new BarRenderer3D();
136. renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator());
137. renderer.setItemLabelsVisible( true );
138. return chart;
139. }
140.
141. /**
142. * 折线图
143. */
144. public static JFreeChart generateLineChart(String xml) {
145.
146.
147. CategoryDataset dataset = getDataSet3(xml);
148. JFreeChart chart = ChartFactory.createLineChart("纳税考评折线图", // 图表标题
149. "", // 目录轴的显示标签
150. "", // 数值轴的显示标签
151. dataset, // 数据集
152. PlotOrientation.VERTICAL, // 图表方向:水平、垂直
153. true, // 是否显示图例(对于简单的柱状图必须是false)
154. false, // 是否生成工具
155. false // 是否生成URL链接
156. );
157.
158. /*------------配置图表属性--------------*/
159. // 1,设置整个图表背景颜色
160. chart.setBackgroundPaint(Color.pink);
161.
162. /*------------设定Plot参数-------------*/
163. CategoryPlot plot = chart.getCategoryPlot();
164. // 2,设置详细图表的显示细节部分的背景颜色
165. // plot.setBackgroundPaint(Color.PINK);
166. // 3,设置垂直网格线颜色
167. plot.setDomainGridlinePaint(Color.black);
168. // 4,设置是否显示垂直网格线
169. plot.setDomainGridlinesVisible(true);
170. // 5,设置水平网格线颜色
171. plot.setRangeGridlinePaint(Color.blue);
172. // 6,设置是否显示水平网格线
173. plot.setRangeGridlinesVisible(true);
174.
175. /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
176. //显示每个柱的数值,并修改该数值的字体属性
177. chart.getTitle().setFont(new Font("宋体", Font.BOLD, 15));
178. chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
179.
180. CategoryAxis domainAxis = plot.getDomainAxis();
181. /*------设置X轴坐标上的文字-----------*/
182. domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11));
183. /*------设置X轴的标题文字------------*/
184. domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
185. NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
186. /*------设置Y轴坐标上的文字-----------*/
187. numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
188.
189. /*------设置Y轴的标题文字------------*/
190. numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
191. numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
192. numberaxis.setAutoRangeIncludesZero(true);
193. numberaxis.setUpperMargin(0.20);
194. numberaxis.setLabelAngle(Math.PI / 2.0);
195. chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
196.
197.// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
198. LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();
199.//
200. lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
201. lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
202.
203. //显示折点数据
204. lineandshaperenderer.setBaseItemLabelGenerator(new
205. StandardCategoryItemLabelGenerator());
206. lineandshaperenderer.setBaseItemLabelsVisible(true);
207.
208. return chart;
209. }
210.
211. /**
212. * 获取一个饼状图的简单数据集对象
213. *
214. * @return
215. */
216. private static PieDataset getDataSet(String xml) {
217. DefaultPieDataset dataset = new DefaultPieDataset();
218.// try {
219.// xml = "<ROOT>" + xml + "</ROOT>";
220.// Document document = DocumentHelper.parseText(xml);
221.// // 读取ITEM
222.// List list = document.selectNodes("//ITEM");
223.// // 获取NODE细节
224.// Iterator it = list.iterator();
225.//
226.// while (it.hasNext()) {
227.// Node node = (Node) it.next();
228.// /**
229.// *
230.// */
231.// dataset.setValue(Tools.nullToSpace(node.valueOf("HZFS")), Double.parseDouble(node.valueOf("XMMC")));
232.//
233.// }
234.//
235.// } catch (Exception e) {
236.//
237.// e.printStackTrace();
238.//
239.// }
240. dataset.setValue("管理人员啊", 10.02D);
241.
242. dataset.setValue("市场人员啊", 20.23D);
243.
244. dataset.setValue("开发人员啊", 60.02D);
245.
246. dataset.setValue("OEM人员啊", 10.02D);
247.
248. dataset.setValue("其他人员啊", 5.11D);
249.
250. dataset.setValue("其他人员啊3", 5.11D);
251. return dataset;
252. }
253.
254. /**
255. * 获取一个柱状图数据集对象
256. *
257. * @return
258. */
259. private static CategoryDataset getDataSet2(String xml) {
260. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
261.// try {
262.// xml = "<ROOT>" + xml + "</ROOT>";
263.// Document document = DocumentHelper.parseText(xml);
264.// // 读取ITEM
265.// List list = document.selectNodes("//ITEM");
266.// // 获取NODE细节
267.// Iterator it = list.iterator();
268.// while (it.hasNext()) {
269.// Node node = (Node) it.next();
270.// dataset.setValue(Double.parseDouble(node.valueOf("XMMC")), Tools
271.// .nullToSpace(node.valueOf("HZFS")), Tools.nullToSpace(node
272.// .valueOf("HZFS")));
273.// }
274.//
275.// } catch (Exception e) {
276.//
277.// e.printStackTrace();
278.//
279.// }
280. // 各曲线名称
281. String series1 = "计划";
282. String series2 = "营销";
283. String series3 = "开发";
284.
285. // 横轴名称(列名称)
286. String type1 = "管理人员";
287. String type2 = "市场人员";
288. String type3 = "开发人员";
289.
290. dataset.setValue(10.02D,series1,type1);
291. dataset.setValue(10.02D,series1,type2);
292. dataset.setValue(10.02D,series1,type3);
293.
294. dataset.setValue(40.02D,series2,type1);
295. dataset.setValue(40.02D,series2,type2);
296. dataset.setValue(80.02D,series2,type3);
297.
298. dataset.setValue(50.02D,series3,type1);
299. dataset.setValue(50.02D,series3,type2);
300. dataset.setValue(60.02D,series3,type3);
301.
302. return dataset;
303. }
304.
305. /**
306. * 获取一个折线图数据集对象
307. *
308. * @return
309. */
310. public static CategoryDataset getDataSet3(String xml) {
311. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
312.// try {
313.// xml = "<ROOT>" + xml + "</ROOT>";
314.// Document document = DocumentHelper.parseText(xml);
315.// // 读取ITEM
316.// List list = document.selectNodes("//ITEM");
317.// // 获取NODE细节
318.// Iterator it = list.iterator();
319.//
320.// while (it.hasNext()) {
321.// Node node = (Node) it.next();
322.// dataset.setValue(Double.parseDouble(node.valueOf("ZF")), Tools
323.// .nullToSpace(node.valueOf("XMMC")), Tools.nullToSpace(node
324.// .valueOf("NF")));
325.// }
326.// } catch (Exception e) {
327.//
328.// e.printStackTrace();
329.//
330.// }
331. // 各曲线名称
332. String series1 = "管理人员";
333. String series2 = "市场人员";
334. String series3 = "开发人员";
335.
336. // 横轴名称(列名称)
337. String type1 = "计划";
338. String type2 = "营销";
339. String type3 = "洗衣机";
340.
341. dataset.setValue(0.0, series1, type1);
342. dataset.setValue(4.2, series1, type2);
343. dataset.setValue(3.9, series1, type3);
344.
345. dataset.setValue(1.0, series2, type1);
346. dataset.setValue(5.2, series2, type2);
347. dataset.setValue(7.9, series2, type3);
348.
349. dataset.setValue(2.0, series3, type1);
350. dataset.setValue(9.2, series3, type2);
351. dataset.setValue(8.9, series3, type3);
352.
353. return dataset;
354. }
355.
356.
357. /**
358. *
359. * @param request
360. * @param session
361. * @param out
362. * @param xml
363. * @param x 1表示折线图,2表示饼图,3表示柱状图
364. * @return
365. */
366. public static String getGraphUrl(HttpServletRequest request, HttpSession session,
367. PrintWriter out,String xml,int x) {
368. JFreeChart chart=null;
369. if(x==1){
370. chart=generateLineChart(xml);
371. }
372. if(x==2){
373. chart=generatePieChart(xml);
374. }
375. if(x==3){
376. chart=generateBarChart(xml);
377. }
378.
379. StandardEntityCollection sec = new StandardEntityCollection();
380. ChartRenderingInfo info = new ChartRenderingInfo(sec);
381. try {
382. String filename = ServletUtilities.saveChartAsJPEG(chart, 500, 300,
383. info, null);
384.
385. graphURL1 = request.getContextPath()
386. + "/servlet/DisplayChart?filename=" + filename;
387. } catch (Exception e) {
388. System.out.println("error happens---" + e.toString());
389.
390. }
391. return graphURL1;
392. }
393.}
394.
395.package navigate;
396.
397.import java.io.IOException;
398.import java.io.PrintWriter;
399.
400.import javax.servlet.ServletException;
401.import javax.servlet.http.HttpServlet;
402.import javax.servlet.http.HttpServletRequest;
403.import javax.servlet.http.HttpServletResponse;
404.
405.import common.Tools;
406.
407.import dao.FreeChartCommon;
408.
409.public class JfreeChar_Test extends HttpServlet {
410.
411. /**
412. * Constructor of the object.
413. */
414. public JfreeChar_Test() {
415. super();
416. }
417.
418. /**
419. * Destruction of the servlet. <br>
420. */
421. public void destroy() {
422. super.destroy(); // Just puts "destroy" string in log
423. // Put your code here
424. }
425.
426. public void doGet(HttpServletRequest request, HttpServletResponse response)
427. throws ServletException, IOException {
428. response.setContentType("text/html;charset=GBK");
429. response.setHeader("Cache-Control", "no-cache");
430. PrintWriter out = response.getWriter();
431. String method = request.getParameter("method");
432. String xml=request.getParameter("xml");
433. if (method == null) {
434. method = "";
435. }
436. if (xml == null) {
437. xml = "";
438. }
439. String filename="";
440. if(method.equals("line"))
441. {
442. filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),1);
443. out.print(filename);
444. }
445. if(method.equals("pie"))
446. {
447. filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),2);
448. out.print(filename);
449. }
450. if(method.equals("bar"))
451. {
452. filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),3);
453. out.print(filename);
454. }
455. }
456.
457.}
458.
459.页面:
460.
461.<img id="imagetu" src="<%=request.getContextPath()%>/servlet/JfreeChar_Test?method=pie">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值