JFreeChart + JRuby - 填充域轴上两点之间的区域

时间:2010-02-23 14:59:37

标签: java jruby jfreechart

我正在使用JRuby来访问JFreeChart。但我似乎无法在日期轴上设置域标记...任何人都可以告诉我为什么这不起作用?

def create_plot
    rangeaxis = NumberAxis.new
    rangeaxis.setAutoRangeIncludesZero(true)

    daxis = DateAxis.new
    daxis.setRange( Time.at(@dataset['date_start'].to_i) , Time.at(@dataset['date_end'].to_i) )  

    @plot = XYPlot.new(@datasets.first, daxis, rangeaxis, @base_renderer)
    @plot.setDatasetRenderingOrder(DatasetRenderingOrder::FORWARD)
    @plot.setBackgroundPaint(java.awt.Color.white)

    lol = IntervalMarker.new( 0, 99999999999, java.awt.Color.gray, BasicStroke.new(2.0), java.awt.Color.gray, nil, 1.0 )
    lol.setLabel("ARGH")
    @plot.addDomainMarker(lol)
  end

尽管该标记应该涵盖1970年1月至11月5日的灰色区域,但它没有显示。如果我用addRangeMarker替换调用,它可以工作,但我希望它在另一个轴上。

感谢您的回复!

2 个答案:

答案 0 :(得分:1)

演示包中的BarChartDemo3显示了如何绘制特定域值的背景。您可以使用矩形为该值的整个宽度着色。如果对相邻值执行此操作,则应获得所需的效果。以下是一些关键方法(我假设您可以查看文档以获取详细信息。)


        CategoryMarker marker = new CategoryMarker("Category 3");
        marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x80));
        marker.setAlpha(0.5f);
        plot.addDomainMarker(marker, Layer.BACKGROUND);

在我看来,为文档支付额外费用非常值得。

加入: 这就在上面的代码之前。它似乎是定位标记。

        renderer.setItemLabelsVisible(true);
        ItemLabelPosition p = new ItemLabelPosition(
            ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, 45.0
        );
        renderer.setPositiveItemLabelPosition(p);
        plot.setRenderer(renderer);
然后就是在调用addDomainMarker

之前出现的代码
        marker.setLabelAnchor(RectangleAnchor.TOP_LEFT);
        marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);
        marker.setLabelOffsetType(LengthAdjustmentType.CONTRACT);

答案 1 :(得分:1)

我找到了一个更好的例子。我给的第一个是“CategoryMarker”,当你想要的是一个更通用的标记。此示例中的域是时间,因此代码设置标记范围的时间间隔,然后设置要显示的标签参数。这是来自示例MarkerDemo2,它使用createXYLineChart。这应该是相关的代码:


        Marker threshold = new ValueMarker(80.0);
        Hour hour1 = new Hour(18, 30, 6, 2005);
        Hour hour2 = new Hour(20, 30, 6, 2005);
        double millis1 = hour1.getFirstMillisecond();
        double millis2 = hour2.getFirstMillisecond();
        Marker cooling = new IntervalMarker(millis1, millis2);
        cooling.setLabelOffsetType(LengthAdjustmentType.EXPAND);
        cooling.setPaint(new Color(150, 150, 255));
        cooling.setLabel("Automatic Cooling");
        cooling.setLabelFont(new Font("SansSerif", Font.PLAIN, 11));
        cooling.setLabelPaint(Color.blue);
        cooling.setLabelAnchor(RectangleAnchor.TOP_LEFT);
        cooling.setLabelTextAnchor(TextAnchor.TOP_RIGHT);
        plot.addDomainMarker(cooling, Layer.BACKGROUND);
所以关键是设置IntervalMarker,然后使用addDomainMarker附加。{1}}。你肯定想要一个RectangleAnchor