如何更改JFreeChart饼图的颜色?

7
如何自定义JFreeChart图形的颜色。看一下我的Java代码:
private StreamedContent chartImage ;

public void init(){
    JFreeChart jfreechart = ChartFactory.createPieChart("title", createDataset(), true, true, false);
    File chartFile = new File("dynamichart");
    ChartUtilities.saveChartAsPNG(chartFile, jfreechart, 375, 300);
    chartImage = new DefaultStreamedContent(new FileInputStream( chartFile), "image/png");
}

public PieDataset createDataset() {
    DefaultPieDataset dataset = new DefaultPieDataset();
          dataset.setValue("J-2", 10);
          dataset.setValue("J-1", 15);
          dataset.setValue("J", 50);
          dataset.setValue("J+1", 20);
          dataset.setValue("J+2", 15);
    return dataset;
}

HTML页面:

<p:graphicImage id="MyImage" value="#{beanCreateImage.chartImage}" />

你想要改变每个饼图的颜色吗? - Rahul Agrawal
确切地想要实现什么?如果你不说出你想要的,人们很难给出正确的答案。(光是要馅饼并不能确定你会得到苹果派,因为有很多种馅饼。);-) - siebz0r
我想要改变每个饼图的颜色。谢谢。 - Karim Oukara
@berber5 那么我的回答应该能帮到你。 - brimborium
3个回答

14

你可以像这样改变单个元素的颜色:

JFreeChart chart = ChartFactory.createPieChart("title", createDataset(), true, true, false);
PiePlot plot = (PiePlot) chart.getPlot();
plot.setSectionPaint("J+1", Color.black);
plot.setSectionPaint("J-1", new Color(120, 0, 120));
// or do this, if you are using an older version of JFreeChart:
//plot.setSectionPaint(1, Color.black);
//plot.setSectionPaint(3, new Color(120, 0, 120));

你的代码会自动着色所有馅饼,经过我的修改后,J-1J+1的颜色是固定的,其余部分会自动着色。

比较


如何查看 new Color(227, 26, 28) 的结果。 - Karim Oukara
1
如果plot.setSectionPaint(String id, Color col)不存在,那么你使用的是相当旧的JFreeChart版本。是的,那么你可以通过它们的索引来访问各个部分(在较新版本的JFreeChart中已被弃用)。 - brimborium
1
你说的“看到 'new Color(227, 26, 28)' 的结果”是什么意思?你是指像颜色选择器这样的工具吗? - brimborium
我发现 new Color(int x, int y, int z) 的意思是:x:红色,y:绿色,z:蓝色。 - Karim Oukara
啊,好的,你可以在文档中查找相关信息。如果你使用的是像Eclipse或NetBeans这样的新版IDE,你可以将鼠标悬停在代码(在这种情况下是Color)上,就会看到更多的信息。 - brimborium

10

要为图表设置颜色,您可以实现DrawingSupplier接口,在这种情况下,我使用了DefaultDrawingSupplier

public class ChartDrawingSupplier extends DefaultDrawingSupplier  {

    public Paint[] paintSequence;
    public int paintIndex;
    public int fillPaintIndex;

    {
        paintSequence =  new Paint[] {
                new Color(227, 26, 28),
                new Color(000,102, 204),
                new Color(102,051,153),
                new Color(102,51,0),
                new Color(156,136,48),
                new Color(153,204,102),
                new Color(153,51,51),
                new Color(102,51,0),
                new Color(204,153,51),
                new Color(0,51,0),
        };
    }

    @Override
    public Paint getNextPaint() {
        Paint result
        = paintSequence[paintIndex % paintSequence.length];
        paintIndex++;
        return result;
    }


    @Override
    public Paint getNextFillPaint() {
        Paint result
        = paintSequence[fillPaintIndex % paintSequence.length];
        fillPaintIndex++;
        return result;
    }   
}

然后在你的 `init()' 方法中包含这段代码

JFreeChart jfreechart = ChartFactory.createPieChart("title", createDataset(), true, true, false);
Plot plot = jfreechart.getPlot();
plot.setDrawingSupplier(new ChartDrawingSupplier());
...

如何定义Color(227, 26, 28)的颜色? - Karim Oukara
1
@berber5 new Color(227, 26, 28) 只是通过设置红色,绿色和蓝色值来定义一种颜色的方法。您应该选择适合您应用程序的一组颜色,您可以在这里找到一些示例:http://www.w3schools.com/html/html_colors.asp 和 http://www.htmlgoodies.com/tutorials/web_graphics/consistent-colors-for-your-site-all-you-need-to-know-about-web-safe-colors.html - GrahamA
+1 有趣,我不知道关于“DrawingSupplier”类的事情。虽然在他的情况下,我更喜欢我的方式。 - brimborium
你可能想考虑使用DefaultDrawingSupplier构造函数,并通过调用super()来提供Paint序列,而无需自己覆盖任何方法。 - Anthony Chuinard

1
您可以在从数据集获取数据时根据标签自定义颜色:
// Add custom colors
        PiePlot plot = (PiePlot) chart.getPlot();

        for (int i = 0; i < dataset.getItemCount(); i++) {
            if(dataset.getKey(i).equals("J+1")){ 
                plot.setSectionPaint(i, Color.black);
            }
        }

您也可以使用 switch-case 语句或您喜欢的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接