JFreeChart 条形图如何自定义颜色?

12
我在Java中使用JFreeCharts创建条形图。我的问题非常简单...我如何为条形图中的所有条选择自定义颜色? 我不确定这种定制是否应该在GradientPaint中完成。决定条形颜色的代码示例:
   final GradientPaint gp0 = new GradientPaint(
                    0.0f, 0.0f, Color.blue, 
                    0.0f, 0.0f, Color.blue
                );

我不确定这是否是自定义颜色的正确方法。基本上,我不知道是否使用 GradientPaint 是正确的方法。如果是,有人能告诉我如何编辑此代码以使其成为自定义颜色而不是蓝色吗?

我不确定这是否有帮助,但假设自定义颜色的信息为:

  • 色调:142
  • 饱和度:109
  • 亮度:126
  • 红色:79
  • 绿色:129
  • 蓝色:189

有什么方法可以自定义图表的颜色吗?


我感谢大家的帮助。但是我发现对我的已经建立好的代码进行以下更改就解决了问题: final GradientPaint gp0 = new GradientPaint( 0.0f, 0.0f, new Color(79, 129, 189), 0.0f, 0.0f, new Color(79, 129, 189) );我是编程新手,不确定这是否比已提交的答案更好或更差。但这对我来说是最简单的。还是要感谢所有回答过我的人。我很感激。 - user3794422
4个回答

19

我已经有一段时间没有用jfreechart编码了。但如果我没记错的话,这是我写的更改条形图颜色的代码 ;)

    CategoryPlot cplot = (CategoryPlot)chart.getPlot();
    cplot.setBackgroundPaint(SystemColor.inactiveCaption);//change background color

    //set  bar chart color

    ((BarRenderer)cplot.getRenderer()).setBarPainter(new StandardBarPainter());

    BarRenderer r = (BarRenderer)chart.getCategoryPlot().getRenderer();
    r.setSeriesPaint(0, Color.blue);

我正在查看我写的第一个应用程序的代码。我不确定现在它是否能工作。

对于未来,我建议您搜索或购买jfreechart的PDF指南。您可以在那里找到所有参考和示例。但是如果可以的话,我强烈推荐跳过jfreechart并转向JavaFX,因为使用jfreechart很麻烦。老实说,在JavaFX中实现图表很容易,并且看起来更好;)


JavaFX很有趣。然而,这些图表所使用的所有数据都来自于MySQL数据库。我使用JDBC连接从我的数据库中循环遍历表格中的值并填充图表。JavaFX是否具备此功能/能力? - user3794422
当然可以。你只需要实现它。没有简单的图表。setMyData(dataOfAnyKind); // 完成方法。但是无论你从哪里获取数据,都不重要。如果它是文本文件、数据库、csv 文件等,首先你必须解析它以适应你的需求或图表需求。通常在对数据进行任何操作之前,你都会准备好数据。同样的逻辑也适用于此。所以不要害怕,尝试使用 JavaFX。使用 JfreeChart,你将需要做同样数量的工作 + 调整 UI,这比使用 SceneBuilder 和 JavaFX、FXML 更难。但这取决于你。 - Tomas Bisciak
正如您在评论中指出的那样,您已经从数据库中获取了数据。现在要专注于用户界面。在我看来,JavaFX对图表的实现比jfreechart更好。 - Tomas Bisciak

5
CategoryPlot plot = chart.getCategoryPlot();
BarRenderer renderer = (BarRenderer) plot.getRenderer();

// set the color (r,g,b) or (r,g,b,a)
Color color = new Color(79, 129, 189);
renderer.setSeriesPaint(0, color);

这将把所有条形设置为特定的颜色。如果您希望每行的颜色发生变化(比如说,对于堆积条形图),您可以调用类型为CategoryDatasetdataset.getRowCount(),返回每个条形图列涉及的行数。然后,您可以根据行的索引在renderer.setSeriesPaint()调用中索引系列。

for (int i = 0; i < dataset.getRowCount(); i++){
    switch (i) {
    case 0:
        // red
        color = new Color(255, 0, 0);
        break;
    case 1:
        // blue
        color = new Color(0, 0, 255);
        break;
    default:
        // green
        color = new Color(0, 255, 0);
        break;
    }
}

1
在使用JfreeChart制作柱状图时,可以自定义颜色。
CategoryItemRenderer barColor = new CustomRenderer(new Paint[]{});
plot.setRenderer(barColor);

创建一个名为CustomRenderer的新类,它继承自BarRenderer3D,或者你可以选择BarRenderer
class CustomRenderer extends BarRenderer3D {

    private Paint[] colors;
    public CustomRenderer(final Paint[] colors) {
        this.colors = colors;
    }

    public Paint getItemPaint(final int row, final int column) {
        if(column==0)
            return Color.blue;
        else if(column==1)
            return Color.CYAN;
        else  
            return Color.RED;
   }
}

0

我认为最简单的方法是使用getRenderer().setSeriesPaint(index, color)方法。

例如,您可以尝试下面的代码来创建一个包含3个分组柱状图的条形图。

JFreeChart barChart = ChartFactory.createBarChart(
                "Bar Chart Titke",
                "Category", "Score",
                dataset,PlotOrientation.HORIZONTAL,
                true, true, false);

        CategoryPlot plot = barChart.getCategoryPlot();
        plot.getRenderer().setSeriesPaint(0, new Color(128, 0, 0));
        plot.getRenderer().setSeriesPaint(1, new Color(0, 0, 255));
        plot.getRenderer().setSeriesPaint(2, new Color(0, 230, 255));

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