原文链接:http://www.cnblogs.com/jtmjx/archive/2013/04/23/jfreechart_advantage.html

本文主要讲解JFreeChart中饼图的一些特征。内容如下:

l控制颜色和饼图片区的外廓

lnull值和零值的处理

l饼图片区的标签(定制文本,改变分配的比例空间)

l“取出”某个片区

l多个饼图显示

l显示3D效果的饼图

更多的信息,可以参见PiePlot参考文档

1、片区颜色

饼图片区缺省填充的颜色是自动分配的,正如你上面实例看到的。如果你不喜欢这个缺省的颜色,你可以实用setSectionPaint()方法来设置片区颜色。例如:

  1. PiePlot plot = (PiePlot) chart.getPlot();
  2. plot.setSectionPaint("Section A", new Color(200, 255, 255));
  3. plot.setSectionPaint("Section B", new Color(200, 200, 255));

JFreeChart的实例PieChartDemo2.java演示了如何定制颜色。在JFreeChart的代码中,片区颜色使用三层色属性机制来定义的。

同时,我们也可以对饼图中的每一个系列定义填充的颜色,这里我们不做细述,更多的信息请参阅PiePlot类

2、片区的外廓

每一个饼图片区的外廓默认是一条细灰线勾画出来的。PiePlot类提供了如下选择项:

l完全不显示片区外廓

l通过改变缺省的值来改变全部的片区外廓

l单独改变部分饼图的片区外廓

2.1 片区外廓的可见性控制

为了完全关闭片区外廓,使用下面代码:

  1. PiePlot plot = (PiePlot) chart.getPlot();
  2. plot.setSectionOutlinesVisible(false);

在任何时候,只需要将值设为 true 即可让外廓显示出来,调用该方法可以触发PlotChangeEvent事件

2.2 片区外廓的控制

在片区外廓显示的时候,我们可以改变饼图片区的整个外廓颜色或风格或者单个饼图片区的颜色或风格。

整个外廓颜色或风格的修改需要在基本层里面设置,单个饼图片区的颜色设置需要在系列层中设置。

在基本层里,如果没有更高层的颜色设置,则调用已定义的默认设置。我们可以使用PiePot类的方法来改变我们的设置。如下方法:

  1. public void setBaseSectionOutlinePaint(Paint paint);
  2. public void setBaseSectionOutlineStroke(Stroke stroke);

有时候在图表里面,我们会更喜欢设置饼图里面某个具体的片区的外廓的颜色,或许突出显示某些片区的细节方面。做到这些,我们可以是使用系列层层设置,通过下面的方法来定义。

  1. public void setSectionOutlinePaint(Comparable key, Paint paint);
  2. public void setSectionOutlineStroke(Comparable key, Stroke stroke);

方法的第一个参数是dataset的片区关键值。如果我们将该值设为null,则系统将使用基本层的设置。

3 空值、零值、负值的处理

PieDataset可能会包含一些饼图不可能显示的数值,比如null、零值或者负值。对于这些数据PiePlot类有专门的处理机制来处理。如果是零值,并且该值有意义,PiePlot类默认将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。如果零值可以忽略,我们可以使用下面代码设置一个标志,不显示该数据:

  1. PiePlot plot = (PiePlot) chart.getPlot();
  2. plot.setIgnoreZeroValues(true);

类似的null值也是如此处理,nul值代表dataset丢失或者不知来源的值。缺省的处理与零值相同,如果忽略null值,则代码如下:

  1. PiePlot plot = (PiePlot) chart.getPlot();
  2. plot.setIgnoreNullValues(true);

在饼图中处理负值是非常不明知的,所以在JFreeChart中负值总是被忽略的。

4 片区和图例标签

片区标签使用的文本,即可以在图表上显示,也可以在图表的图例上显示,并且完全可以定制。标签是自动默认产生的,但我们可以使用下面方法来改变:

  1. public void setLabelGenerator(PieSectionLabelGenerator generator);
  2. public void setLegendLabelGenerator(PieSectionLabelGenerator generator);

StandPieSectionLabelGenerator类专门用来生成图例的一个实现类,提供灵活处理定制标签的功能(如果你不喜欢用这个类,可以定义自己的类,只要实现接口PieSectionLabelGenerator即可)。Dataset显示出的标签值由Javade信息格式类来进行格式化——表5.1所示格式化的变量值。

名称

描述

{0}

片区关键值(字符串)

{1}

片区值

{2}

百分比的片区值

表4.1 StandardPieSectionLabelGenerator substitutions

下面举例说,假如我们有一个PieData包含下面的值

片区标识

片区值

S1

3.0

S2

5.0

S3

Null

S4

2.0

表 5.2 一个dataset实例

下面是格式化字符串产生的标签值内容:

格式化字符串

片区

产生的标签值

{0}

0

S1

{0} has value {1}

1

S2 has value 5.0

{0}({2} percent)

0

S1(30 percent)

{0} = {1}

2

S3 = null

类PieChartDemo2.java使用了定制标签的方法。

5 “取出”某个片区

PiePlot类支持将某个片区“取出“显示。即某个片区偏离图表中心,以突出显示。如类所显示。

片区偏离的数值是图表半径的一个百分值来表示。例如0.3(30 persent)代码偏离的值是半径的长度×0.3.代码如下:

  1. PiePlot pieplot = (PiePlot) jfreechart.getPlot();
  2. pieplot.setExplodePercent("Two", 0.5);

6 3D饼图

JFreeChart具有一个实现3D效果的饼图类PiePlot3D,如图5.5所示, (PieChart3DDemo1.java)。PiePlot3D是PiePlot的子类,因此在我们创建自己的饼图时,使用PiePlot3D替换掉原来的PiePlot即可。

创建3D效果的饼图时,使用ChartFactory的 createPieChart3D()方法,而不是createPieChart()方法。

对于该类有一些限制,如下:

l不支持”取出”片区功能。

l不支持轴项转动——如果支持,3D效果图可能会变型。

3D的实例主要是类PieChart3DDemo1-3.java。讲解类中没有列出其他两个。因为功能雷同于非3D效果。

7 多饼图

我们可是使用类MultiplePiePlot在一个图表上显示多个饼图。饼图的数据使用CatoryDataset。如图5.6所示。每个独立的饼图由一个专门的图表多次创建而成。

创建的每一个饼图的PieDataset是由系统提供的CategoryDataset按照行或者列拆分出来的

多饼图图表

8、一个简单的PieChart实例

代码如下:

  1. private static JFreeChart createChart(PieDataset piedataset) {
  2. JFreeChart jfreechart = ChartFactory.createPieChart("PieChart Demo 2", piedataset, true, true, false);
  3. PiePlot pieplot = (PiePlot) jfreechart.getPlot();
  4. pieplot.setSectionPaint("One", new Color(160, 160, 255));
  5. pieplot.setSectionPaint("Two", new Color(128, 128, 223));
  6. pieplot.setSectionPaint("Three", new Color(96, 96, 191));
  7. pieplot.setSectionPaint("Four", new Color(64, 64, 159));
  8. pieplot.setSectionPaint("Five", new Color(32, 32, 127));
  9. pieplot.setSectionPaint("Six", new Color(0, 0, 111));
  10. pieplot.setNoDataMessage("No data available");
  11. pieplot.setExplodePercent("Two", 0.5);
  12. pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} ({2} percent)"));
  13. pieplot.setLabelBackgroundPaint(new Color(220, 220, 220));
  14. pieplot.setLegendLabelToolTipGenerator(new StandardPieSectionLabelGenerator("Tooltip for legend item {0}"));
  15. return jfreechart;
  16. }

运行结果:

关键代码说明

lsetSectionPaint("One", new Color(160, 160, 255)):设置某个片区的填充颜色。第一个参数为片区的标识,第二个参数为色值。

lsetNoDataMessage("No data available"):设置dataset为null时显示的提示信息。

lsetLabelGenerator(new StandardPieSectionLabelGenerator("{0}({2} percent)")):设置标签显示的格式。

lsetLabelBackgroundPaint(new Color(220, 220, 220)):设置标签的背景颜色。

lsetLegendLabelToolTipGenerator(new StandardPieSectionLabelGenerator("Tooltip for legend item {0}")):设置鼠标滑过图表是显示鼠标当前片区的提示信息。

lpieplot.setExplodePercent("Two", 0.5):将第2个片区取出显示。后面一个参数是取出的距离,是一个比例数。

9 自定义标签生成器实例

自定义标签生成器必须实现接口PieSectionLabelGenerator。

该实例实现了自定义的标签生成,并将“TWO”标签不显示。代码如下:

  1. private static JFreeChart createChart(PieDataset piedataset) {
  2. JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 8",
  3. piedataset, false, true, false);
  4. PiePlot pieplot = (PiePlot) jfreechart.getPlot();
  5. pieplot.setLabelGenerator(new CustomLabelGenerator());
  6. return jfreechart;
  7. }
  8. //自定义标签生成器
  9. static class CustomLabelGenerator implements PieSectionLabelGenerator {
  10. public String generateSectionLabel(PieDataset piedataset,
  11. Comparable comparable) {
  12. String string = null;
  13. if (piedataset != null && !comparable.equals("Two"))
  14. string = comparable.toString();
  15. return string;
  16. }
  17.  
  18. public AttributedString generateAttributedSectionLabel(
  19. PieDataset piedataset, Comparable comparable) {
  20. Object object = null;
  21. String string = comparable.toString();
  22. String string_0_ = (string + " : " + String.valueOf(piedataset
  23. .getValue(comparable)));
  24. AttributedString attributedstring = new AttributedString(string_0_);
  25. attributedstring.addAttribute(TextAttribute.WEIGHT,
  26. TextAttribute.WEIGHT_BOLD, 0, string.length() - 1);
  27. return attributedstring;
  28. }
  29. }

效果图:

10 3D效果饼图实例

代码:

  1. private static JFreeChart createChart(PieDataset piedataset) {
  2. JFreeChart jfreechart = ChartFactory.createPieChart3D(
  3. "Pie Chart 3D Demo 1", piedataset, true, true, false);
  4. PiePlot3D pieplot3d = (PiePlot3D) jfreechart.getPlot();
  5. //设置旋转角度
  6. pieplot3d.setStartAngle(180.0);
  7. //设置旋转方向,Rotation.CLOCKWISE)为顺时针。
  8. pieplot3d.setDirection(Rotation.CLOCKWISE);
  9. //设置图表透明图0.0~1.0范围。0.0为完全透明,1.0为完全不透明。
  10. pieplot3d.setForegroundAlpha(0.5F);
  11. pieplot3d.setNoDataMessage("No data to display");
  12. return jfreechart;
  13. }

效果图:

11 多饼图实例

使用CategoryDataset数据集,在一个图表上产生多个饼图。

创建多饼图的CategoryDataset数据集代码

  1. private static CategoryDataset createDataset() {
  2. double[][] ds = { { 3.0, 4.0, 3.0, 5.0 }, { 5.0, 7.0, 6.0, 8.0 },
  3. { 5.0, 7.0, Double.NaN, 3.0 }, { 1.0, 2.0, 3.0, 4.0 },
  4. { 2.0, 3.0, 2.0, 3.0 } };
  5. CategoryDataset categorydataset = DatasetUtilities
  6. .createCategoryDataset("Region ", "Sales/Q", ds);
  7. return categorydataset;
  8. }

使用多饼图CategoryDataset数据集生成多饼图的代码

  1. private static JFreeChart createChart(CategoryDataset categorydataset) {
  2. //创建多饼图图表
  3. JFreeChart jfreechart = ChartFactory.createMultiplePieChart(
  4. "Multiple Pie Chart", categorydataset, TableOrder.BY_ROW, true, true, false);
  5. //多饼图Plot对象
  6. MultiplePiePlot multiplepieplot = (MultiplePiePlot) jfreechart.getPlot();
  7. //获得单个饼图图表
  8. JFreeChart jfreechart_0_ = multiplepieplot.getPieChart();
  9. PiePlot pieplot = (PiePlot) jfreechart_0_.getPlot();
  10. pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}"));
  11. pieplot.setLabelFont(new Font("SansSerif", 0, 8));
  12. pieplot.setInteriorGap(0.3);
  13. return jfreechart;
  14. }

效果图:

12 饼图的其他常用设置实例

对DataSet进行排序,改变片区的位置:

  1. dataset.sortByKeys(SortOrder.ASCENDING);通过片区的关键值进行升序排序。
  2. dataset.sortByValues(SortOrder.DESCENDING);通过片区的值进行降序排序

对Null值和零值处理

  1. pieplot.setIgnoreNullValues(true):设置饼图忽略null值,即是null值将不显示。
  2. pieplot.setIgnoreZeroValues(false);设置饼图不忽略零值。即图表中显示出零值。

使饼图和标签开始旋转:使用Rotator对象,旋转饼图

  1. pieplot.setCircular(true);//设置饼图为圆形
  2. //标签格式
  3. pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} = {2}", NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance()));
  4. pieplot.setNoDataMessage("No data available");
  5. //ChartPanel是JPanel的子类,此方法可以生成一个JPanel
  6. ChartPanel chartpanel = new ChartPanel(jfreechart);
  7. chartpanel.setPreferredSize(new Dimension(500, 270));
  8. //该方法可以使饼图开始旋转
  9. Rotator rotator = new Rotator(pieplot);
  10. rotator.start();

JFreeChart 使用一 饼图之高级特性的更多相关文章

  1. ActiveMQ中的Destination高级特性(一)

    ---------------------------------------------------------------------------------------- Destination ...

  2. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  3. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  4. javascript高级特性

    01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...

  5. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  6. Android TextView高级特性使用

    TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...

  7. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  8. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  9. VQuery高级特性

    VQuery高级特性 css方法 同时设置多个--for in 链式操作 链式操作 函数,链式操作 css 方法链式操作 json的使用 阻止冒泡,默认事件 VQuery插件 插件机制 可以扩展库的功 ...

随机推荐

  1. ios 关于UIView 的multipleTouchEnabled 和 exclusiveTouch

    做项目时发现,在一个界面上的2个button竟然可以同时点击,依次push进去了2个 controller!我就产生了疑问,一个view的multipleTouchEnabled属性默认是false啊 ...

  2. DELPHI控件:DBLookupComboBOX组件的使用方法

    在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06 ...

  3. Ubuntu ( Linux) Eclipse 乱码问题

    刚装完Ubuntu,导入Java和Android项目时,发现字符乱码,究其原因,是由于Windows下使用的是GBK编码,而Ubuntu使用的是UTF-8编码.网上查找了相关资料,主要解决方案有两种. ...

  4. vmstat uptime 系统状态脚本

    #!/bin/bash # # Command :vmstat,uptime #Capture_Stats - Gather System Performance Statistics ####### ...

  5. Spring面向切面编程(AOP)

    1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...

  6. mongodb3.x用户角色

    用户和角色是多对多的关系,一个用户可以对应多个角色,一个角色可以拥有多个用户.用户角色的不同对应的权限也是不一样的.下面是一些分配给用户的常见的角色. read                    ...

  7. Mysql之多源复制

    在复制时,可以有多个Master.这些Master不进行冲突检查拓扑到Slave.在使用多源复制时对Slave的表存储格式是有要求的,必须要基于table存储而非文件存储[require table ...

  8. printf 打印 unit32_t

    今天在网上找了老半天终于找到了:printf 打印 uint32_t 类型  uint32_t domainId; printf("\ndomainId=========%lu", ...

  9. springmvc注解配置

    <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.s ...

  10. 数据结构之AVL树

    AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡.这种失去平衡的可以概括为4种姿态:LL ...