JFreeChart - Ring Plot简单标签定位

时间:2016-05-23 13:54:03

标签: java jfreechart pie-chart

我在使用JFreeChart RingPlot时遇到了一些麻烦。我已经设法将标签放在我的图表中,但我无法改变他们的位置。我现在在哪里;

enter image description here

我需要将实验室移近图表的边缘,以便我可以降低剖面深度并获得更好的环形外观。到目前为止,我尝试使用setSimpleLabelOffset和setLabelGap方法,但效果不佳。

这是我的代码;

    DefaultPieDataset dataset = new DefaultPieDataset();

    dataset.setValue("Critical", new Integer(5));
    dataset.setValue("Important", new Integer(20));
    dataset.setValue("Moderate", new Integer(19));
    dataset.setValue("Low", new Integer(5));


    JFreeChart chart = ChartFactory.createRingChart("", dataset, false, true, false);

    RingPlot pie = (RingPlot) chart.getPlot();

    pie.setBackgroundPaint(Color.WHITE);
    pie.setOutlineVisible(false);
    pie.setShadowPaint(null);

    pie.setSimpleLabels(true);
    pie.setLabelGenerator(new StandardPieSectionLabelGenerator("{1}"));
    //pie.setSimpleLabelOffset(new RectangleInsets(1, 1, 1, 1));
    //pie.setLabelGap(0.05);
    //pie.setLabelPadding(new RectangleInsets(100, 5, 10, 5));
    pie.setLabelBackgroundPaint(null);
    pie.setLabelOutlinePaint(null);
    pie.setLabelShadowPaint(null);


    pie.setSectionDepth(0.50);
    pie.setSectionOutlinesVisible(false);
    pie.setSeparatorsVisible(false);

    pie.setIgnoreZeroValues(true);

知道我怎么能实现这个目标? 提前谢谢。

编辑:感谢@trashgod的回复,但是我想我的环境出了问题。我复制并粘贴了你上面提到的整个代码,我得到的是:

image

1 个答案:

答案 0 :(得分:0)

RectangleInsets标签的默认PiePlot插入相对到地图的pieArea

this.simpleLabelOffset = new RectangleInsets(UnitType.RELATIVE, 0.18, 0.18, 0.18, 0.18);

下面的示例将插入内容减半,并相应地更改剖面深度:

 pie.setSimpleLabelOffset(new RectangleInsets(UnitType.RELATIVE, 0.09, 0.09, 0.09, 0.09));
 pie.setSectionDepth(0.33);

image

经过jfreechart-1.0.19.jar and jcommon-1.0.23.jar,Java 1.8.0_92,Mac OS X 10.11.5,Windows 10测试:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.RingPlot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.util.UnitType;

/**
 * @see http://stackoverflow.com/a/37414338/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("Critical", new Integer(5));
        dataset.setValue("Important", new Integer(20));
        dataset.setValue("Moderate", new Integer(19));
        dataset.setValue("Low", new Integer(5));
        JFreeChart chart = ChartFactory.createRingChart("", dataset, false, true, false);
        RingPlot pie = (RingPlot) chart.getPlot();
        pie.setBackgroundPaint(Color.WHITE);
        pie.setOutlineVisible(false);
        pie.setShadowPaint(null);
        pie.setSimpleLabels(true);
        pie.setLabelGenerator(new StandardPieSectionLabelGenerator("{1}"));
        pie.setSimpleLabelOffset(new RectangleInsets(
            UnitType.RELATIVE, 0.09, 0.09, 0.09, 0.09));
        pie.setLabelBackgroundPaint(null);
        pie.setLabelOutlinePaint(null);
        pie.setLabelShadowPaint(null);
        pie.setSectionDepth(0.33);
        pie.setSectionOutlinesVisible(false);
        pie.setSeparatorsVisible(false);
        pie.setIgnoreZeroValues(true);
        f.add(new ChartPanel(chart){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        });
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}