2017-06-22 22 views
1

我正在使用XYBoxAnnotation來劃分JFreeChart上的矩形區域。我希望盒子的一面「開放」,即走出無窮遠。我嘗試將該值設置爲Double.POSITIVE_INFINITY,但這似乎不起作用。我也嘗試將其設置爲Double.MAX_VALUE,但沒有運氣。在這些情況下,註釋甚至不會顯示在劇情上。並沒有拋出異常。帶有XYBoxAnnotation的JFreeChart在一側打開

下面是我的代碼的一個非常簡單的版本,我在其中生成XYBoxAnnotation並將其添加到圖中。

XYBoxAnnotation _axisMarker = new XYBoxAnnotation(xLow, yLow, Double.POSITIVE_INFINITY, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE); 
_plot.getRenderer().addAnnotation(_axisMarker, Layer.BACKGROUND); 

編輯:

我想出所述註釋被沒有顯示出來的原因是因爲用於註解的x值比軸刻度多大得多。出於某種原因,這會導致註釋不可見,直到縮小到足夠的程度。

感謝@ trashgod的回答,我想出了一個解決方案。他的回答並不適合我,因爲我的情節允許縮放,並且在縮小時可以看到方框的邊緣。

首先,我添加了一個PlotChangeListener聽時的情節被放大了:

// define PlotChangeListener to update the annotation when the plot is zoomed 
private PlotChangeListener _zoomListener = new PlotChangeListener() { 
    @Override 
    public void plotChanged(PlotChangeEvent plotChangeEvent) { 
    if (_basisIsotope != null) { 
     updateAxisMarkers(); 
    } 
    } 
}; 

然後我創建了一個函數來重新繪製基於新的情節範圍註釋:

// function to re-draw the annotation 
private void updateAxisMarkers() { 
    _plot.removeChangeListener(_zoomListener); // remove to prevent triggering infinite loop 

    // define xLow, yLow and yHigh... 

    double xHigh = _plot.getDomainAxis().getUpperBound() * 1.1; 
    XYBoxAnnotation _axisMarker = new = new XYBoxAnnotation(xLow, yLow, xHigh, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE); 
    _plot.getRenderer().addAnnotation(annotation); 

    _plot.addChangeListener(_zoomListener); // add back 
} 

回答

1

Double.MAX_VALUE太大而無法縮放到相關軸,但Double.MAX_VALUE/2的工作方式和任何大於軸上限的值都可以工作。一個更好的選擇可能是一個超過該域的最大值的值。下面的片段用一個XYBoxAnnotation遮蓋了一些高斯數據的圖,該圖具有從42延伸到最大域值+ 10%的域邊界;範圍界限爲±1σ。

XYSeriesCollection dataset = createDataset(); 
JFreeChart chart = createChart(dataset); 
Color color = new Color(0, 0, 255, 63); 
double max = dataset.getSeries(0).getMaxX() * 1.1; 
XYBoxAnnotation annotation = new XYBoxAnnotation(
    42, -1, max, 1, new BasicStroke(1f), color, color); 
chart.getXYPlot().getRenderer().addAnnotation(annotation); 

image

+1

感謝您的回答。它不適合我,因爲我的情節允許縮小。放大時,您可以看到框的邊緣。但是,它確實使我找到了解決方案。我添加了一個'PlotChangeListener'來監聽圖表何時放大,然後將框邊界重置爲新的繪圖邊界。 – sorayadragon