参考文章:使用 JFreeChart来创建基于web的图表
一些jfreechart的api:http://topic.csdn.net/t/20050925/03/4292228.html
要建立类似下面的报表(折线图和柱状图都存在,图片不好贴,直接给个flicckr地址):http://www.flickr.com/photos/44025540@N03/4241013620/
先贴段代码,用到的地方尽量加载注释里:
package com.wasw100.chart;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import org.jfree.chart.ChartUtilities;
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.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
/**
*
* @author wasw100
*
*/
public class ChartTest {
/**
* @param stuScoreMap
* @return
*/
private static DefaultCategoryDataset getDataSet(
Map<String, Number> scoreMap, String category) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// 遍历Map
for (String key : scoreMap.keySet()) {
double value = scoreMap.get(key).doubleValue();
dataset.setValue(value, category, key);
}
return dataset;
}
/**
*
* @param stuScoreMap
* 学生成绩
* @param avgScoreMap
* 班级平均成绩
* @return
*/
private static JFreeChart getChart(Map<String, Number> stuScoreMap,
Map<String, Number> avgScoreMap) {
CategoryPlot categoryPlot = new CategoryPlot();
// 横轴、纵轴显示的标题
categoryPlot.setDomainAxis(new CategoryAxis(""));
categoryPlot.setRangeAxis(new NumberAxis("分数"));
// 显示的方向,横向还是纵向?
// categoryPlot.setOrientation(PlotOrientation.VERTICAL);
// 设置是否显示水平网格线
categoryPlot.setRangeGridlinesVisible(true);
// 设置是否显示垂直网格线
// categoryPlot.setDomainGridlinesVisible(true);
DefaultCategoryDataset avgData = getDataSet(avgScoreMap, "班级平均成绩");// 得到数据集
LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();
// 不显示线条
lineAndShapeRenderer.setBaseLinesVisible(false);
// 将线条添加进图表
categoryPlot.setRenderer(lineAndShapeRenderer);
categoryPlot.setDataset(avgData);
// lineAndShapeRenderer的数值显示出来
StandardCategoryItemLabelGenerator standardcategoryitemlabelgenerator = new StandardCategoryItemLabelGenerator();
lineAndShapeRenderer
.setBaseItemLabelGenerator(standardcategoryitemlabelgenerator);
lineAndShapeRenderer.setBaseItemLabelsVisible(true);
// 个人成绩的添加
DefaultCategoryDataset stuData = getDataSet(stuScoreMap, "成绩");// 得到数据集
BarRenderer barRenderer = new BarRenderer();// 柱状图渲染器
categoryPlot.setDataset(1, stuData);
categoryPlot.setRenderer(1, barRenderer);
// 颜色显示为黄色
barRenderer.setSeriesPaint(0, Color.YELLOW);
barRenderer.setShadowVisible(false);
// barRenderer.setSeriesPaint(0, new Color(0, 0, 255));
// 显示边框
barRenderer.setDrawBarOutline(true);
barRenderer.setBaseOutlinePaint(Color.GRAY);
// 设置纵轴的最小值和最大值
ValueAxis valueAxis = categoryPlot.getRangeAxis();
valueAxis.setLowerBound(40);
valueAxis.setUpperBound(110);
JFreeChart chart = new JFreeChart(categoryPlot);
// 设置title
Font titleFont = new Font("黑体", Font.BOLD, 10); // 图片标题
chart
.setTitle(new TextTitle("高2011级6班在高一下期末的平均成绩与班级平均成绩的比较",
titleFont));
chart.setBackgroundPaint(Color.WHITE);
return chart;
}
public static void main(String[] args) {
Map<String, Number> avgScoreMap = new LinkedHashMap<String, Number>();
avgScoreMap.put("总分", 0);
avgScoreMap.put("语文", 97.02);
avgScoreMap.put("数学", 73.71);
avgScoreMap.put("英语", 77.9);
avgScoreMap.put("理综", 0);
avgScoreMap.put("物理", 52.73);
avgScoreMap.put("化学", 66.98);
Map<String, Number> stuScoreMap = new LinkedHashMap<String, Number>();
stuScoreMap.put("总分", 0);
stuScoreMap.put("语文", 98);
stuScoreMap.put("数学", 70);
stuScoreMap.put("英语", 50);
stuScoreMap.put("理综", 0);
stuScoreMap.put("物理", 50);
stuScoreMap.put("化学", 70);
JFreeChart chart = getChart(avgScoreMap, avgScoreMap);
FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("D:\\score.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (IOException e) {
}
}
}
}
还有就是图例如果显示在右面,可以这样设置
// 设置图例位置,字体
chart.getLegend().setPosition(RectangleEdge.RIGHT);
Font kfont = new Font("宋体", Font.PLAIN, 10);
chart.getLegend().setItemFont(kfont);
还没有解决的问题:
1.右侧刻度间距没有手动控制
2.柱状图中间的白色竖线去不掉,欢迎指点
补充:刻度手动控制解决,只要把上面99-102行的代码改为下面即可
// 数据轴精度
NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();
numberAxis.setTickUnit(new NumberTickUnit(10));
numberAxis.setLowerBound(0);
numberAxis.setUpperBound(110);
NumberAxis继承ValueAxis,所以ValueAxis有得属性方法, NumberAxis都可以使用。
分享到:
相关推荐
JfreeChart学习总结JfreeChart学习总结
**JFreeChart使用心得与实例解析** JFreeChart是一款强大的Java图表库,它允许开发者创建各种复杂的图表,如柱状图、饼图、线图、散点图等,广泛应用于数据分析、报告展示以及Web应用程序中。本文将分享JFreeChart...
总结来说,JFreeChart 是一个强大且灵活的 Java 图表库,通过它可以轻松创建多种类型的图表,并对其进行细致的定制。结合实际项目需求,JFreeChart 可以为数据分析和可视化提供有力支持。如果你在使用过程中遇到问题...
在"使用JFreeChart小结(一)"这篇博文中,作者主要分享了入门JFreeChart的基本步骤和一些关键概念。 首先,让我们了解如何添加JFreeChart到项目中。通常,你可以通过Maven或Gradle构建工具将JFreeChart库作为依赖...
### JFreeChart使用教程:从下载到环境配置及柱状图绘制详解 #### 一、JFreeChart简介及其优势 JFreeChart是一款功能强大的Java绘图API,它提供了丰富的图表类型,如柱状图、饼图、曲线图、甘特图等,适用于Swing...
### JFreeChart学习总结 #### 一、为什么学习JFreeChart? 随着互联网技术的飞速发展,越来越多的应用程序转向了Web平台。这不仅包括传统的静态网页,也涵盖了那些需要复杂数据展示的应用,如报表系统。然而,从...
在本篇文章中,我们将深入探讨如何使用JFreeChart这一强大的Java图表库来创建基于Web的图表。通过细致地解析标题、描述以及部分已给出的内容,本文将为读者提供全面而深入的理解,帮助开发者掌握利用JFreeChart进行...
JFreeChart 是一个开源的 Java 图表库,它允许开发者创建各种复杂的图表,如柱状图、饼图、散点图、线形图等。在本文中,我们将深入探讨 JFreeChart 的核心类和它们在创建图表过程中的作用。 1. **JFreeChart 类**...
这个压缩包“jfreechart-1.0.13”包含了JFreeChart的完整版本,让我们一起深入探讨其核心功能和使用方法。 JFreeChart是Java中最优秀的绘图工具之一,它支持多种图表类型,包括折线图、柱状图、饼图、散点图、甘特...
提供的"JFreeChart使用总结.doc"文档很可能是对JFreeChart使用的一份详尽总结,包含了如何创建不同类型的图表、自定义图表样式、以及如何将图表集成到项目中的实例和技巧。建议仔细阅读这份文档,结合实际项目进行...
**JFreeChart库详解** JFreeChart是一款强大的Java图表库,它允许开发者在Java应用程序或...同时,JFreeChart还支持图表的导出,方便在不同场景下使用。结合其他库,如Apache POI,可以实现更复杂的数据操作和集成。
**"jfreechart 总结.txt" 和 "JFreeChart.txt"** 文件可能包含了JFreeChart的使用总结、技巧、注意事项或者其他开发者的经验分享,对于学习和使用JFreeChart来说是非常宝贵的参考资料。 总的来说,JFreeChart是一个...