1

我正在使用 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 月至 5138 年 11 月,但它没有显示。如果我用 addRangeMarker 替换调用,它可以工作,但我希望它在另一个轴上。

感谢您的回复!

4

2 回答 2

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);
于 2010-02-23T18:25:12.060 回答
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。你肯定想要一个RectangleAnchor

于 2010-02-25T19:21:15.293 回答