2013-02-26 71 views
2

目标是建立一个间隔条形图,指示每个类别的可接受值范围(0 - 100%之间)。如何使用JFreeChart创建堆叠间隔图表?

至于每个类别,我想以指示2个时间间隔(即一个中心间隔是绿色和周围的间隔即灰色),我认为这是不与IntervalBarRenderer可行和我就这样被使用StackedBarRenderer(透明图层最左侧&右侧)。

这是正确的方法吗?

此外,如果这是正确的做法,似乎线条间隔是透明的(在极左和每个栏的右侧),没有表现出他们的轮廓:是他们没有办法有一个大纲透明油漆?

请参阅下面的主要代码和当前结果的屏幕截图。

非常感谢您的任何帮助或提示!

托马斯 Current result - not satisfactory

private JFreeChart createChart(LeaksChartSeriesVO data){ 
    JFreeChart chart = ChartFactory.createStackedBarChart(
      "Leak meters", //Title 
      "Leaks", //Domain axis (X) label 
      "%", //Range axis (Y) label 
      data.bars, 
      PlotOrientation.HORIZONTAL, 
      true, //Legend? 
      true, //Tooltip? 
      false); //Urls? 
    CategoryPlot plot = (CategoryPlot) chart.getPlot(); 

    //Sets X axis sub-legends 
    SubCategoryAxis subCat = new SubCategoryAxis("Leak meters"); 

    //Adds second dataset 
    plot.setDataset(1, data.dots); 

    //Defines level renderer 
    LevelRenderer renderer1 = new LevelRenderer(); 
    renderer1.setSeriesPaint(0, Color.black); 
    plot.setRenderer(1, renderer1); 

    //Sets Y axis as % 
    ((StackedBarRenderer) plot.getRenderer()).setRenderAsPercentages(true); 

    //Sets colors 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesPaint(0, new Color(0, 0, 0, 0)); //Transparent for start 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesPaint(1, Color.gray); //Grey low 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesPaint(2, Color.green); //Green 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesPaint(3, Color.gray); //Grey high 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesPaint(4, new Color(0, 0, 0, 0)); //Transparent for end 
    ((StackedBarRenderer) plot.getRenderer()).setDrawBarOutline(true); 
    ((StackedBarRenderer) plot.getRenderer()).setBaseOutlinePaint(Color.black); 

    //Setup which items not to see in legend 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesVisibleInLegend(0, false); 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesVisibleInLegend(3, false); 
    ((StackedBarRenderer) plot.getRenderer()).setSeriesVisibleInLegend(4, false); 

    //Sets renderer & axis 
    plot.setDomainAxis(subCat); 

    //Changes plot render sequence so that bars are in the background and shapes in front 
    chart.getCategoryPlot().setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); 

    //Sets margins between bars 
    chart.getCategoryPlot().getDomainAxis().setCategoryMargin(0.5f); 

    return chart; 
} 

+0

也可以考虑在[JWS下_statistical charts_其他例子演示(http://www.jfree.org/jfreechart/samples.html)。 – trashgod 2013-02-27 02:38:41

回答

1

这是用来绘制酒吧GradientBarPainter的默认行为:当酒吧是透明的,它并没有画出轮廓。

您可以改为使用将绘制轮廓的StandardBarPainter

只需添加:

StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer(); 
renderer.setBarPainter(new StandardBarPainter()); 

另一种解决方案是保持GradientBarPainter但使用几乎是透明的颜色吧:

setSeriesPaint(0, new Color(0, 0, 0, 1));