2

目的は、カテゴリごとに許容値の範囲 (0 ~ 100%) を示す間隔棒グラフを作成することです。

各カテゴリについて、2 つの間隔 (つまり、中央の間隔が緑色で、周囲の間隔が灰色) を示したいと思いますが、IntervalBarRenderer では実現できないと考えているため、StackedBarRenderer を使用しています (透明な各バーの左端と右端のレイヤー)。

これは正しいアプローチでしょうか?

また、これが正しいアプローチである場合、透明なバー間隔 (各バーの左端と右端) にはアウトラインが表示されないようです: 透明なペイントのアウトラインを表示する方法はありますか?

メインコードと現在の結果のスクリーンショットについては、以下を参照してください。

助けやヒントをありがとう!

トーマス 現在の結果 - 満足できない

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;
}

4

1 に答える 1

1

これは、バーの描画に使用されるGradientBarPainterのデフォルトの動作です。バーが透明な場合、アウトラインは描画されません。

代わりに、アウトラインを描画するStandardBarPainterを使用できます。

追加するだけです:

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

もう 1 つの解決策は、 をそのままにして、バーにほぼ透明なGradientBarPainter色を使用することです。

setSeriesPaint(0, new Color(0, 0, 0, 1));
于 2013-02-28T13:15:26.413 に答える