JFreeChart| 图解JFreeChar中的饼图(PieChart)

前言

本文主要讲解JFreeChart中饼图的一些特征。 内容如下:
- 控制颜色和饼图片区的外廓
- null值和零值的处理
- 饼图片区的标签(定制文本,改变分配的比例空间)
- “ 取出” 某个片区
- 多个饼图显示
- 显示3D效果的饼图
- 两种环形饼图


在上一篇文章中创建了一个简单的饼图。 在这里不做详细介绍了。
这里列出本文中使用的数据集:

private static PieDataset createDataset() {

    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue("Section A", 43.2);
    dataset.setValue("Section B", 27.9);
    dataset.setValue("Section C", 79.5);
    return dataset;
}

片区颜色(SectionPaint)

1.饼图片区缺省填充的颜色是自动随机分配的颜色.
2.自定义颜色可以使用setSectionPaint()方法来设置片区颜色,比如:

PiePlot plot = (PiePlot) chart.getPlot();
plot.setSectionPaint("Section A", new Color(200, 255, 255));
plot.setSectionPaint("Section B", Color.BLUE);
plot.setSectionPaint("Section C", Color.YELLOW);

注意方法中第一参数Comparable key与数据集中Comparable key对应.
这里写图片描述


片区外廓(SectionOutlines)

每一个饼图片区的外廓默认是一条细灰线勾画出来的。 PiePlot类提供了如下选择项:
完全不显示片区外廓
通过改变缺省的值来改变全部的片区外廓
单独改变部分饼图的片区外廓

  • 完全关闭/开启片区外廓
PiePlot plot = (PiePlot) chart.getPlot();
plot.setSectionOutlinesVisible(false); //true

调用该方法可以触发PlotChangeEvent事件。

  • 片区外廓的控制
    在片区外廓显示的时候,我们可以改变饼图片区的整个外廓颜色或风格或者单个饼图片区的
    颜色或风格。 整个外廓颜色或风格的修改需要在基本层里面设置,单个饼图片区的颜色设置
    需要在系列层中设置。 在基本层里,如果没有更高层的颜色设置,则调用已定义的默认设
    置。 我们可以使用PiePot类的方法来改变我们的设置。 如下方法:
public void setBaseSectionOutlinePaint(Paint paint);
public void setBaseSectionOutlineStroke(Stroke stroke);

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

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

方法的第一个参数是dataset中setValue中的key。如果我们将该值设为null,则系统将使用基本层的设置。
这里写图片描述


Dataset为null时提示信息

Dataset为null时,默认是没有提示信息的,可以自行设置.

PiePlot pieplot = (PiePlot) chart.getPlot();
pieplot.setNoDataMessage("没有有效的数据显示!");// 设置提示信息内容。
pieplot.setNoDataMessageFont(new Font("黑体", 2, 20));// 设置提示信息的字体和大小。
pieplot.setNoDataMessagePaint(Color.red); // 设置提示信息字体的颜色。

这里写图片描述


空置、 零值和负值(Null, Zero and Negative Values)

PieDataset可能会包含一些饼图不可能显示的数值,比如null、零值或者负值。 对于这些数据PiePlot类有专门的处理机制来处理。

Section A的值为零或者null时,不忽略的效果图如下
这里写图片描述

  • 零值
    PiePlot类默认将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。 如果零值可以忽略,我们可以使用下面代码设置一个标志,不显示该数据:
PiePlot plot = (PiePlot) chart.getPlot();
plot.setIgnoreZeroValues(true);
  • null值
    nul值代表dataset丢失或者不知来源的值。 缺省的处理与零值相同,如果忽略null值,则代码如下:
PiePlot plot = (PiePlot) chart.getPlot();
plot.setIgnoreNullValues(true);
  • 负值
    在JFreeChart中负值总是被忽略自动忽略的.

片区和图例标签(Section and Legend Labels)

参考自定义标签产生器的用法.


自定义标签产生器

自定义YvesCustomLabelGenerator必须实现接口PieSectionLabelGenerator,重写方法generateSectionLabel和generateAttributedSectionLabel.
关于标签的用法可以参看下图
这里写图片描述

PiePlot pieplot = (PiePlot) chart.getPlot();
pieplot.setLabelGenerator(new YvesCustomLabelGenerator());
 // 自定义标签产生器: 取消Section A的标签显示
 static class YvesCustomLabelGenerator implements PieSectionLabelGenerator {

     // 产生标签,返回null时不显示
     public String generateSectionLabel(PieDataset piedataset, Comparable comparable) {
         String string = null;

         if (piedataset != null && !comparable.equals("Section A")) {
             string = comparable.toString();
         }
         return string;
     }

     public AttributedString generateAttributedSectionLabel(PieDataset piedataset, Comparable comparable) {
         Object object = null;
         String string = comparable.toString();
         String string_0_ = (string + " : " + String.valueOf(piedataset.getValue(comparable)));
         AttributedString attributedstring = new AttributedString(string_0_);
         attributedstring.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, 0, string.length() - 1);
         return attributedstring;
     }

 }

这里写图片描述

取出某个片区(Exploded Sections)

PiePlot类支持将某个片区”取出”显示。即某个片区偏离图表中心,以突出显示。
片区偏离的数值是图表半径的一个百分值来表示。 例如0.3(30 persent)代码偏离的值是半径的长度×0.3.代码如下:

PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setExplodePercent("Section A", 0.3);

取出Section A的片区效果图
这里写图片描述


对PieChar的数据排序

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

设置PieChart圆形/椭圆形

PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setCircular(true); // 设置饼图为圆形,false为椭圆

3D饼图(3D Pie Charts)

JFreeChart具有一个实现3D效果的饼图类PiePlot3D.
PiePlot3D是PiePlot的子类,因此在我们创建自己的饼图时,使用PiePlot3D替换掉原来的PiePlot即可。 创建3D效果的饼图时,使用ChartFactory的createPieChart3D()方法,而不是createPieChart()方法。

//数据集与PieChart数据集类型一致

// create a chart...
JFreeChart chart = ChartFactory.createPieChart3D(
    "Sample Pie Chart -Yves", // chart title: 图表标题
    createDataset(), // data: 数据集
    true, // legend: 图例
    true, // tooltips: 图表工具条
    false // URLs: URLS
);

注意事项:
3D饼图不支持”取出”片区功能。
3D饼图不支持轴项转动——如果支持,3D效果图可能会变型。
这里写图片描述


多饼图(Multiple Pie Charts)

JFreeChart支持使用类MultiplePiePlot在一个图表上显示多个饼图。 饼图的数据使用CatoryDataset。 每个独立的饼图由一个专门的图表多次创建而成。 创建的每一个饼图的PieDataset是由系统提供的CategoryDataset按照行或者列拆分出来的。
这里写图片描述


环形饼图

另外使用另外JFreeChart还支持环形饼图,ChartFactory的createRingChart创建,内部使用的Plot为RingPlot.
这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011479200/article/details/81457282