用JFreeChart画统计分析柱状图

chart|统计|柱状图

  我们介绍使用 JFreeChart 生成柱状图,首先从一个最简单的例子开始。

  一 最简单的例子

  为了降低门槛,让大家心理有个底,先介绍一个简单的不能再简单的例子,图片中的各类属性都采用默认值。

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="org.jfree.chart.ChartFactory,
                 org.jfree.chart.JFreeChart,
                 org.jfree.chart.plot.PlotOrientation,
                 org.jfree.chart.servlet.ServletUtilities,
                 org.jfree.data.DefaultCategoryDataset"%>
<%
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(300, "广州", "苹果");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(500, "广州", "葡萄");
dataset.addValue(340, "广州", "芒果");
dataset.addValue(280, "广州", "荔枝");

JFreeChart chart = ChartFactory.createBarChart3D("水果销量统计图",
                  "水果",
                  "销量",
                  dataset,
                  PlotOrientation.VERTICAL,
                  false,
                  false,
                  false);

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
%>
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">

这个 JSP 程序运行的结果如下图

图 一

  二 柱状图高级特性

  上面的程序简单,但生成的柱状图也很简单。更多的时候,我们可能需要不同的效果。 org.jfree.chart.ChartFactory 这个工厂类有 createBarChart, createStackedBarChart, createBarChart3D, createStackedBarChart3D 这几个工厂方法创建不同类型的柱状图。关于这四个方法的 JFreeChart 的 Java Doc API 文档有详细说明,比较重要的是 PlotOrientation.VERTICAL 让平行柱垂直显示,而 PlotOrientation.HORIZONTAL 则让平行柱水平显示。

几个对柱状图影响较大的几个类,它们分别是:
org.jfree.chart.axis.CategoryAxis
org.jfree.chart.axis.ValueAxis
org.jfree.chart.renderer.BarRenderer
org.jfree.chart.renderer.BarRenderer3D

我们还是以实例来说明这几个类,先来假设一个需要统计的数据表:

  北京 上海 广州 成都 深圳
苹果 672 766 223 540 126
梨子 325 521 210 340 106
葡萄 332 256 523 240 526

根据上表数据,首先构造 CategoryDataset, 这里不再使用上面简单例子里面的 DefaultCategoryDataset 类,而是 DatasetUtilities 更有效的构造 CategoryDataset,如下列代码:

double[][] data = new double[][] {{672, 766, 223, 540, 126}, {325, 521, 210, 340, 106}, {332, 256, 523, 240, 526}};
String[] rowKeys = {"苹果","梨子","葡萄"};
String[] columnKeys = {"北京","上海","广州","成都","深圳"};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

用上面的 dataset 生成的 3D 柱状图


图 二

org.jfree.chart.axis.CategoryAxis

CategoryAxis domainAxis = plot.getDomainAxis();
//设置 columnKey 是否垂直显示
domainAxis.setVerticalCategoryLabels(true);
//设置距离图片左端距离
domainAxis.setLowerMargin(0.1);
//设置距离图片右端距离
domainAxis.setUpperMargin(0.1);
//设置 columnKey 是否间隔显示
domainAxis.setSkipCategoryLabelsToFit(true);
plot.setDomainAxis(domainAxis);

上面代码产生的效果如下图,注意与图二的区别。


图 三

org.jfree.chart.axis.ValueAxis

ValueAxis rangeAxis = plot.getRangeAxis();
//设置最高的一个柱与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
//设置最低的一个柱与图片底端的距离
//rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);

上面代码产生的效果如下图,注意与图二的区别。


图 四

org.jfree.chart.renderer.BarRenderer3D

BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
//设置 Wall 的颜色
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
//设置每种水果代表的柱的 Outline 颜色
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setSeriesOutlinePaint(1, Color.BLACK);
renderer.setSeriesOutlinePaint(2, Color.BLACK);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.1);
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);

上面代码产生的效果如下图,注意与图二的区别。


图 五

  补充两个有用的方法

  补充 org.jfree.chart.plot.CategoryPlot 的两个方法,这两个方法对所有类型的图表都有作用,因为在前面没有介绍,这里补充一下。

  //设置地区、销量的显示位置
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

上面代码产生的效果如下图,注意与图二的区别。


图 六

  三 完整范例

  前面都是一些代码片段,现在把这些片段组合成一个完整范例。

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.awt.Color,
                java.awt.Font,
                org.jfree.chart.ChartFactory,
                org.jfree.chart.JFreeChart,
                org.jfree.chart.plot.PlotOrientation,
                org.jfree.chart.servlet.ServletUtilities,
                org.jfree.data.CategoryDataset,
                org.jfree.data.DatasetUtilities,
                org.jfree.chart.plot.CategoryPlot,
                org.jfree.chart.axis.CategoryAxis,
                org.jfree.chart.axis.ValueAxis,
                org.jfree.chart.renderer.BarRenderer3D,
                org.jfree.chart.labels.StandardCategoryItemLabelGenerator,
                org.jfree.chart.axis.AxisLocation"%>
<%
double[][] data = new double[][] {{672, 766, 223, 540, 126},{325, 521, 210, 340, 106},{332, 256, 523, 240, 526}};
String[] rowKeys = {"苹果","梨子","葡萄"};
String[] columnKeys = {"北京","上海","广州","成都","深圳"};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

JFreeChart chart = ChartFactory.createBarChart3D("水果销量图统计",
                  null,
                  null,
                  dataset,
                  PlotOrientation.VERTICAL,
                  true,false,false);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot plot = chart.getCategoryPlot();

CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setVerticalCategoryLabels(false);
plot.setDomainAxis(domainAxis);

ValueAxis rangeAxis = plot.getRangeAxis();
//设置最高的一个 Item 与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
//设置最低的一个 Item 与图片底端的距离
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);

BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
//设置 Wall 的颜色
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.1);
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelsVisible(true);
plot.setRenderer(renderer);

//设置柱的透明度
plot.setForegroundAlpha(0.6f);
//设置地区、销量的显示位置
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
%s>
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">

看看程序运行的结果吧:


图 七

  三 总结

  我只介绍了少量的方法,更多的请参考 JFreeChart 的 Java Doc API 文档和 Sample Code。

时间: 2024-11-03 12:31:51

用JFreeChart画统计分析柱状图的相关文章

如何使用jfreechart画层叠柱状图

问题描述 如何使用jfreechart画层叠柱状图 怎样才能是柱状图完全层叠呢?设置itemMargin等于1时,理论上应该完全重合.可实际情况不是这样.急救,谢谢 解决方案 LayeredBarRenderer layeredBarRenderer = new LayeredBarRenderer(); layeredBarRenderer.setDrawBarOutline(true); categoryplot.setRenderer(layeredbarrenderer);

用JFreeChart画柱状图和折线图的的复合图(当数据小于0时,柱子显示绿色,在Y轴负方,上数据大于0时,柱子显示红色,在Y轴正方)怎样画?

问题描述 [b][/b] 问题补充:我试过你说的这种方法,但判断的时候无效Rainbow702 写道 解决方案 这个柱状图,显示不同的颜色可以参考,官方的demo中的 dual axis demo[url]http://www.jfree.org/jfreechart/samples.html[/url]解决方案二:为什么判断与 0 的大小关系会行不通呢?这个有点说不过去啊?解决方案三:我试过你说的这种方法,但判断的时候无效?你是指判断什么?判断与0的关系?解决方案四:以前只是使用过 JFree

在PHP上显示JFreechart画的统计图方法_php技巧

如何在PHP上显示JFreechart?可能大部分都遇到这种情况,在JSP上的servlet能完全的显示出JFreechart画的统计图,但是和其他语言混合运用就不能显示了 我现在也遇到这个问题,想了半个小时终于弄明白了,实现的过程还是很简单的.(个人经验总结而已) 解决的思路: 1.先将JFreechart生成的图片保存在web 服务器上. 2.然后在JSP上用<img>标签显示 3.通过JS将JSP导入PHP页面 这样就实现了. 部分getColumnChart.jsp源码: 复制代码 代

JFreeChart画一个曲线图,上下坐标单位不一样

问题描述 具体是这样的,想画一个曲线图分析ping,X轴为时间轴,Y轴正向坐标想画一条曲线显示平均时间,负向坐标想画一条曲线显示丢失的百分比,请问用JFreeChart可以实现吗?怎么实现?PS:或者各位高手有什么其他更好的想法可以通过曲线图分析平均时间和丢失,请告诉我吧

请问,如何用jfreechart画双Y轴的折线图,使用categoryPlot可以画出来吗?

问题描述 如题,我在网上搜索到使用XYPlot画的双Y轴折线图,但是我的横坐标是日期,XYPlot显示出来的是double类型,我还想把横坐标的日期斜着写,这样能画出更多的点来,不知道有谁知道怎么实现吗?最好有现成代码,我是菜鸟一枚,多谢了 解决方案

jfreechart中同类柱状图用不同颜色显示,该如何做?

问题描述 比如说柱状图中显示: 苹果.香蕉.橘子...等 如何让它们用不同的颜色显示?[img][/img] 问题补充:飞雪无情 写道 解决方案 用CustomBarRenderer来继承BarRenderer类,然后重载getItemPaint(int i,int j)方法解决方案二:renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱的颜色 renderer.setSeriesPaint(0, Color.GREEN); renderer.set

使用JFreeChart画波形图,求教两个问题

问题描述 1.如何缺省显示横轴开头的一部分内容(假设最大值为10000,希望图形区显示0-1000的那些折线)通过调用X轴的setFixedAutoRange(例如传参为1000)方法,缺省显示的横轴结尾的那部分内容(数据是9000到10000之间的折线),与需求不符.2.图形上下留出余白图形有0.1两种设定值,希望显示区上下各空出0.5个单位,即坐标轴是-0.5到1.5.通过调用Y轴的setUpperMargin(0.5)setLowerMargin(0.5),不起作用.仅能看到上面区域有0.

JFreechart柱状图不显示零值问题

问题描述 jfreechart怎样让柱状图数值为0的不显示出来

关于Jfreechart生成柱状图颜色设置问题

问题描述 在用Jfreechart生成柱状图过程中遇到的问题,希望有高人能指导下:Jfreechart生成的柱状图是根据数据来生成的.比如:DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(200, "计划", "清华大学"); dataset.addValue(400, "实报", "清华大学"); dataset.