【问题标题】:Changing custom colors in JFreeChart stacked 3D bar chart在 JFreeChart 堆叠 3D 条形图中更改自定义颜色
【发布时间】:2013-09-18 07:58:09
【问题描述】:

我已经在网上搜索了足够多的东西,但没有运气。

我创建了一个堆叠的 3d 条形图,其中我无法更改默认颜色。我尝试了所有提供的建议。

下面是我的代码的一个小sn-p。这是我的意见。

我来自 Db 的数据是:

一个 0 2 乙 15 53 0 2 0 2 0 1 F 1 0 G 0 1

不知何故,我将其转换为数据集需求,并添加了项目和模型。

CategoryDataset dataset = DatasetUtilities.createCategoryDataset(item,models, data);
chart = ChartFactory.createStackedBarChart3D(chartDescription, X-axis, Y-axis, dataset,PlotOrientation.VERTICAL, true, true, true);
CategoryPlot plot = chart.getCategoryPlot();
CategoryItemRenderer r = plot.getRenderer();
r.setSeriesPaint(0, Color.GREEN);
r.setSeriesPaint(1, Color.GRAY);
 plot.setRenderer(new StackedBarRenderer3D() {

@Override
public Paint getItemPaint(int row, int col) {
    System.out.println("row:"+row);
    System.out.println("Col:"+col);
    return Color.getHSBColor(row / 42f, 1, 1);
}
});
CategoryAxis domainAxis = plot.getDomainAxis(); 
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);

NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

StackedBarRenderer3D renderer = (StackedBarRenderer3D)plot.getRenderer();
//renderer.setBarPainter(new StandardBarPainter());
renderer.setSeriesFillPaint(0,Color.BLACK);
renderer.setSeriesFillPaint(1,Color.GREEN);
renderer.setDrawBarOutline(false);
renderer.setShadowVisible(false);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER,TextAnchor.CENTER));
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setIgnoreZeroValues(true);
renderer.setMaximumBarWidth(.05);
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
renderer.setPositiveItemLabelPositionFallback(new ItemLabelPosition(
    ItemLabelAnchor.CENTER, TextAnchor.CENTER_RIGHT));
renderer.setNegativeItemLabelPositionFallback(new ItemLabelPosition(
ItemLabelAnchor.CENTER, TextAnchor.CENTER_RIGHT));
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
    ItemLabelAnchor.CENTER, TextAnchor.TOP_CENTER));
renderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(
    ItemLabelAnchor.CENTER, TextAnchor.TOP_CENTER));
LegendTitle legend = chart.getLegend(0); 
legend.setBackgroundPaint(Color.white);
legend.setFrame(new BlockBorder(Color.green));
StandardChartTheme theme = (StandardChartTheme)org.jfree.chart.StandardChartTheme.createJFreeTheme();
theme.setTitlePaint(Color.decode("#4572a7"));
theme.setExtraLargeFont(new Font("Arial",Font.BOLD, 16) ); 
theme.setLargeFont(new Font("Arial",Font.BOLD, 15)); 
theme.setRegularFont( new Font("Arial",Font.PLAIN, 11));
theme.setRangeGridlinePaint(Color.RED);
theme.setPlotBackgroundPaint( Color.white );
theme.setChartBackgroundPaint( Color.white );
theme.setItemLabelPaint(Color.YELLOW);
theme.setShadowVisible(true);
theme.setAxisLabelPaint( Color.decode("#666666")    );
theme.apply( chart );

我也用过setSeriespaint,但还是不行。 chart、plot、renderer的创建顺序有关系吗?

当我打印行和列时,我得到这个:

行:1 颜色:0 行:0 列:1 行:1 列:1 行:1 Col:2 行:1 Col:3 行:1 Col:4 行:0 彩色:5 行:1 列:6

【问题讨论】:

    标签: java jfreechart struts2-jfreechart-plugin


    【解决方案1】:

    您可以覆盖渲染器的getItemPaint(),如图here

    plot.setRenderer(new StackedBarRenderer3D() {
    
        @Override
        public Paint getItemPaint(int row, int col) {
            return Color.getHSBColor(row / 42f, 1, 1);
        }
    });
    

    【讨论】:

    • trashgod:谢谢,完美!现在我可以从您的代码中更改颜色,但整个条形颜色变为红色。相反,我更喜欢将每个堆栈更改为不同的颜色。就像第一个堆栈应该有绿色和第二个堆栈应该有黄色。请有任何建议..
    • @user2228697:使用rowcol 来决定使用什么颜色。
    • @CatalinaIsland 有一个正确的想法:制作四个调色板,每个调色板都有一系列相关的颜色,例如绿色、黄色等;根据col选择调色板;这是一个相关的example;另请参阅DrawingSupplier 引用的here 方法。
    • @trashgod 上面你显示的链接真的让我很困惑..我仍然只得到一种颜色而不是stacked3dbar type.STUCK 这里..
    • 请编辑您的问题以包含一个complete example,该complete example 会显示您的一小部分数据。
    猜你喜欢
    • 2014-08-24
    • 2023-03-28
    • 2017-04-27
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多