我正在使用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替换调用,它可以工作,但我希望它在另一个轴上。
感谢您的回复!
答案 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