2010-02-23 57 views
1

我正在使用JRuby访问JFreeChart。但我似乎无法在日期轴上设置域标记...任何人都可以告诉我为什么这不起作用?JFreeChart + JRuby - 域轴上两点之间的填充区域

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月5138年的灰色区域,但并未显示。如果我用addRangeMarker替换了这个调用,它可以工作,但我希望它在另一个轴上。

感谢您的回复!

回答

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

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

我不明白 - 你如何将这个标记与域值相关联? – 2010-02-24 12:04:50

+0

仍然没有暗示将这个标记与一系列值相关联,这是我打算做的: – 2010-02-25 11:32:45